jdbc
//jdbc demo Class.forName(dbDriver).newInstance(); Connection conn = DriverManager.getConnection(url); conn.setAutoCommit(true); // --要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型: // 1、执行静态SQL语句。通常通过Statement实例实现。 // 2、执行动态SQL语句。通常通过PreparedStatement实例实现。 // 3、执行数据库存储过程。通常通过CallableStatement实例实现。 // --具体的实现方式: // Statement stmt = con.createStatement() ; // PreparedStatement pstmt = con.prepareStatement(sql) ; // CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ; Statement stmt = conn.createStatement(); // execute() // int executeUpdate(String sql):执行给定 SQL语句,INSERT、UPDATE或DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。 Integer i = stmt.executeUpdate(updateSql); // ResultSet executeQuery(String sql):执行给定的SQL语句,该语句返回单个ResultSet对象。 ResultSet rs = stmt.executeQuery(querySql); // ResultSet: 表示数据库结果集的数据表。最初,光标被置于第一行之前。next方法将光标移动到下一行;因为该方法在 // ResultSet对象没有下一行时返回 false,所以可以在while循环中使用它来迭代结果集。 String name = ""; while (rs.next()) { name = rs.getString("sname"); System.out.println(name); } // 关闭数据库连接 if (rs != null) { // 关闭记录集 rs.close(); } if (stmt != null) { // 关闭声明 stmt.close(); } if (conn != null) { // 关闭连接对象 conn.close(); }
Statement:
//Statement是先用Connection得到一个空的执行器,在执行的时候给它传拼好的sql //这只能是拼好的字符串,而不能动态的传参数,并且在数据库中每次肯定穿的是不同的sql语句,因此每次都要解析编译 Statement stmt = conn.createStatement(); stmt.execute(sql);
PrepareStatement:
/* PreparedStatement是在创建pstm的时候就给它传一个动态的sql预编译,参数是通过pstm设置的。执行时,只需要空执行一下就可以. 1. PreparedStatement可以写参数化查询,比Statement能获得更好的性能。 2. 对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,这种预处理语句查询比普通的查询运行速度更快。 3. PreparedStatement可以阻止常见的SQL注入式攻击。 4. PreparedStatement可以写动态查询语句 --占位符的索引位置从1开始而不是0 */ String sql="insert into jdbc_users values(?,?)"; PreparedStatement pstmt= pstmt=conn.prepareStatement(sql); pstmt.setInt(1, user.getId()); pstmt.setString(2, user.getName()); pstmt.execute();
处理多参数查询:
public static List queryByMultiParamsAndDealResultSet(String sql, Object... paramValues) throws SQLException { List list = new ArrayList(); pstmt = connection.prepareStatement(sql); for (int i = 0; i < paramValues.length; i++) { pstmt.setObject(i + 1, paramValues[i]); } resultSet = pstmt.executeQuery(); // ResultSetMetaData 是结果集元数据,可获取关于 ResultSet 对象中列的类型和属性信息的对象 // 例如:结果集中共包括多少列,每列的名称和类型等信息 ResultSetMetaData metaData = resultSet.getMetaData(); int cols_len = metaData.getColumnCount(); while (resultSet.next()) { Map map = new HashMap(); for (int i = 0; i < cols_len; i++) { String cols_name = metaData.getColumnName(i + 1); Object cols_value = resultSet.getObject(cols_name); if (cols_value == null) { cols_value = ""; } map.put(cols_name, cols_value); } list.add(map); } System.out.println(list); return list; }
JDBC批量操作:
/** * 批量执行sql语句,by statement */ public static Boolean executeStatementBatchSQL(Connection conn, List<String> sqlList) { try { // 创建执行SQL的对象 Statement stmt = conn.createStatement(); for (String sql : sqlList) { stmt.addBatch(sql); } int[] result = stmt.executeBatch(); Boolean tag=true; for(int i=0;i<result.length;i++){ if(i<0){ tag=false; } } return tag; } catch (SQLException e) { return false; } } /** * 批量执行sql语句,by preparedStatement */ public static Boolean executePreparedStatementBatchSQL(Connection conn, String sql, int[] param1, String[] param2) { try { // sql="UPDATE EMPLOYEES SET SALARY = ? WHERE ID =?"; PreparedStatement pstmt = conn.prepareStatement(sql); for(int i =0;i<10;i++){ pstmt.setInt(1, param1[i]); pstmt.setString(2, param2[i]); pstmt.addBatch(); } int[] result = pstmt.executeBatch(); Boolean tag=true; for(int i=0;i<result.length;i++){ if(i<0){ tag=false; } } return tag; } catch (SQLException e) { return false; } }
---JDBC存储过程:
参见procedureTest.java
---JDBC事务处理:
参见TransactionTest.java
System.out.println("事务处理开始!"); con.setAutoCommit(false); // 设置连接不自动提交,即用该连接进行的操作都不更新到数据库 Statement sm = con.createStatement(); sm.execute(sqls[i]); System.out.println("提交事务处理!"); con.commit(); // 提交给数据库处理 System.out.println("事务处理结束!"); //... System.out.println("事务执行失败,进行回滚!\n"); con.rollback(); // 若前面某条语句出现异常时,进行回滚,取消前面执行的所有操作