现在的位置: 首页 > 综合 > 正文

jdbc基础_Prepared-Callable-Statement-transaction

2017年12月27日 ⁄ 综合 ⁄ 共 6082字 ⁄ 字号 评论关闭
//Statement
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL10", "SCOTT", "yf123");
			stmt = conn.createStatement();// Statement创建时就是一个空的执行器
			/** 在execute或者executeQuery时执行死的sql语句 */
			/** 这只能是拼好的字符串,而不能动态的传参数,并且在数据库中每次肯定穿的是不同的sql语句,因此每次都要解析编译 */
			stmt.execute("insert into jdbc_users values (" + user.getId() + ",'" + user.getName() + "','" + user.getPasswd() + "')");

//PreparedStatement	
      Connection conn=null;
      PreparedStatement pstmt=null;
      Class.forName("oracle.jdbc.driver.OracleDriver");
      conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL10", "SCOTT", "yf123");
      String sql="insert into jdbc_users values(?,?,?,?,?)";
      pstmt=conn.prepareStatement(sql);//PreparedStatement创建时就传过去一个sql语句,这样就可以预编译
      /**然后设置sql中好占位符的值,这里是动态的传参数*/
      pstmt.setInt(1, user.getId());
      pstmt.setString(2, user.getName());
      pstmt.setString(3, user.getPasswd());
      pstmt.setString(4, user.getPhone());
      pstmt.setString(5, user.getEmail());
      /**设置好后,就全封装到pstm里了,只要空执行就可以了*/
      pstmt.execute();

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
//TransactionTest
//http://blog.csdn.net/cxwen78/article/details/6875713
public class TransactionTest {

	// 数据库连接
	public static Connection getConnection() {
		Connection con = null;
		try {
			Class.forName("com.mysql.jdbc.Driver"); // 加载Mysql数据驱动
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/first_springmvc", "root", "123"); // 创建数据连接
		} catch (Exception e) {
			System.out.println("数据库连接失败");
		}
		return con;
	}

	// 判断数据库是否支持事务
	public static boolean judgeTransaction(Connection con) {
		try {
			// 获取数据库的元数据
			DatabaseMetaData md = con.getMetaData();
			// 获取事务处理支持情况
			return md.supportsTransactions();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

	// 将一组SQL语句放在一个事务里执行,要么全部执行通过,要么全部不执行
	public static void startTransaction(Connection con, String[] sqls) throws Exception {

		if (sqls == null) {
			return;
		}
		Statement sm = null;
		try {
			// 事务开始
			System.out.println("事务处理开始!");
			con.setAutoCommit(false); // 设置连接不自动提交,即用该连接进行的操作都不更新到数据库
			
			sm = con.createStatement(); 			
			for (int i = 0; i < sqls.length; i++) {
				sm.execute(sqls[i]);// 执行添加事物的语句
			}
			
			System.out.println("提交事务处理!");
			con.commit(); // 提交给数据库处理

			System.out.println("事务处理结束!");

		} catch (SQLException e) {
			try {
				System.out.println("事务执行失败,进行回滚!\n");
				con.rollback(); // 若前面某条语句出现异常时,进行回滚,取消前面执行的所有操作
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		} finally {
			sm.close();
		}
	}


	public static void main(String[] args) throws Exception {

		String[] arry = new String[4]; // 定义一组事物处理语句
		arry[0] = "delete from users where username='aaa'"; 
		arry[1] = "UPDATE users SET usernamecn='普通用户' where username='aaa'";//引发错误
		arry[2] = "INSERT INTO users (username,password) values ('ddd','ddd')";
		arry[3] = "select * from users";
		Connection con = null;
		try {

			con = getConnection(); // 获得数据库连接
			boolean judge = judgeTransaction(con); // 判断是否支持批处理
			System.out.print("支持事务处理吗? ");
			System.out.println(judge ? "支持" : "不支持");
			if (judge) {
				startTransaction(con, arry); // 如果支持则开始执行事务
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			con.close(); // 关闭数据库连接
		}
		
	}

}

//procedure 01:
//	DELIMITER $$
//
//	USE `test`$$
//
//	DROP PROCEDURE IF EXISTS `addlog`$$
//
//	CREATE PROCEDURE `addlog`(IN id VARCHAR(30), IN logId INT, IN msg VARCHAR(30), OUT sid INT )
//	BEGIN
//		INSERT INTO t_sys_log(id, LOG_ID, MSG) VALUES(id, logId,msg);
//		-- select last_insert_id() into sid;  
//		SELECT LOG_ID INTO sid FROM t_sys_log AS a WHERE a.id = id ;
//	   END$$
//
//	DELIMITER ;



//procedure 02:
//DELIMITER $$
//
//USE `test`$$
//
//DROP PROCEDURE IF EXISTS `listUser`$$
//
//CREATE PROCEDURE `listUser`(IN v INT, OUT a VARCHAR(255))
//BEGIN
//	SELECT username  FROM t_ums_user WHERE valid=v;
//	
//   END$$
//
//DELIMITER ;

/**
 * http://blog.csdn.net/cxwen78/article/details/6870959
 */
public class procedureTest {

	// 数据库连接
	public static Connection getConnection() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver"); // 加载Mysql数据驱动
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8", "root", "123"); // 创建数据连接
		} catch (Exception e) {
			System.out.println("数据库连接失败");
		}
		return conn;
	}

	// 列出数据库中所有的存储过程名
	public static void getAllProName(Connection con) {
		try {
			DatabaseMetaData md = con.getMetaData(); // 获得数据库的元数据
			ResultSet resultSet = md.getProcedures(null, null, "%"); // 获得所有的存储过程的描述
			System.out.println("数据库现有的存储过程名为:"); // 显示存储过程名,位于结果集的第三个字段

			while (resultSet.next()) {
				String procName = resultSet.getString(3);
				System.out.print(procName + "\n");
			}

			System.out.println();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 调用存储过程,传入int,out参数,输出int,string
	public static void call4InOut2IntString(Connection con) throws Exception {
		CallableStatement cstmt = null; // CallableStatement是Statement的子类
		System.out.println("开始执行存储过程");
		try {
			// 调用无参数的存储过程
			cstmt = con.prepareCall("{call addlog(?,?,?,?,?)}"); // 3个?号作占位符

			// 设置输入的参数值
			cstmt.setString(1, "1");
			cstmt.setInt(2, 111);
			cstmt.setString(3, "test_msg");
			cstmt.registerOutParameter(4, Types.INTEGER); // 注册输出参数类型
			cstmt.registerOutParameter(5, Types.VARCHAR); // 注册输出参数类型

			// 执行
			// int CallableStatement.executeUpdate: 存储过程不返回结果集。
			// ResultSet CallableStatement.executeQuery: 存储过程返回一个结果集。
			// Boolean CallableStatement.execute: 存储过程返回多个结果集。
			// int[] CallableStatement.executeBatch: 提交批处理命令到数据库执行。
			cstmt.execute();

			int out_1 = cstmt.getInt(4); // 获取输出的参数值
			String out_2 = cstmt.getString(5);
			System.out.println("logId:  " + out_1);
			System.out.println("msg:  " + out_2);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			cstmt.close();
		}
		System.out.println("存储过程执行结束");
	}

	public static void call4ExecuteQuery(Connection con) throws Exception {
		CallableStatement cstmt = null; // CallableStatement是Statement的子类
		System.out.println("开始执行存储过程");
		try {
			// 调用无参数的存储过程
			cstmt = con.prepareCall("{call listUser(?,?)}"); // 3个?号作占位符

			// 设置输入的参数值
			cstmt.setInt(1, 1);
			cstmt.registerOutParameter(2, Types.VARCHAR); // 注册输出参数类型

			// 执行
			// int CallableStatement.executeUpdate: 存储过程不返回结果集。
			// ResultSet CallableStatement.executeQuery: 存储过程返回一个结果集。
			// Boolean CallableStatement.execute: 存储过程返回多个结果集。
			// int[] CallableStatement.executeBatch: 提交批处理命令到数据库执行。
			ResultSet rs = cstmt.executeQuery();
			while (rs.next()) {
				System.out.println(rs.getString(1));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			cstmt.close();
		}
		System.out.println("存储过程执行结束");
	}

	public static void main(String[] args) throws Exception {
		Connection conn = null;
		try {
			conn = getConnection(); // 获得数据库连接
			getAllProName(conn); // 列出数据库的所有存储过程名
			// call4InOut2IntString(conn); // 调用存储过程

			call4ExecuteQuery(conn);

		} catch (Exception e1) {
			throw e1;
		} finally {
			conn.close(); // 关闭数据库连接
		}
	}
}

抱歉!评论已关闭.