JDBC(Java DataBase Connectivity)是用于连接sql数据库的java API。 ——百度百科
本文以MySQL数据库为例讲解。
ximport java.sql.*;public class TestSQL { private static final String URL = "jdbc:mysql://localhost/testdb"; private static final String ADDITIONAL_URL = "?useUnicode=true&characterEncoding=utf-8&useSSL=false"; private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; private static final String USER = "root"; private static final String PASSWORD = "xxxxxxxx"; public static void main(String[] args) { Connection conn = null; Statement statement = null; try { Class.forName(JDBC_DRIVER); //1.Get connection conn = DriverManager.getConnection(URL+ADDITIONAL_URL,USER,PASSWORD); //2.Get Statement statement = conn.createStatement(); String sql = "SELECT * FROM salary"; //3.Execute sql, get resultset ResultSet set = statement.executeQuery(sql); //4.Iterate resultset, get data while(set.next()) { System.out.print(set.getInt("id")); System.out.println(); } } catch(SQLException sqle) { sqle.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } }set.next() 第一次调用表示开始迭代,必须调用一次才能获取数据。excuteQuery()不能执行 UPDATE DELETE INSERT 等数据修改语句,要执行这些,使用 executeUpdate()。PreparedStatement是Statement的子类,可以在创建时在Constructor中指定sql语句,并用 ?代表参数。执行前需要通过SetXXX(parameter, value)方法来指定 ?代表的参数。其中parameter是从1开始的。有两种执行方法:
execute()执行后,如果是Query性质的语句,通过getResultSet() 方法获取结果集。如果只是Update性质的,得不到结果集(execute()执行结果为false)。executeQuery()直接得到结果集。PreparedStatement也可以像Statement那样使用(用带参的executeQuery(sql)),因为是继承自Statement的。
xxxxxxxxxximport java.sql.*;public class TestSQL { private static final String URL = "jdbc:mysql://localhost/testdb"; private static final String ADDITIONAL_URL = "?useUnicode=true&characterEncoding=utf-8&useSSL=false"; private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; private static final String USER = "root"; private static final String PASSWORD = "xxxxxxxx"; public static void main(String[] args) { Connection conn = null; Statement statement = null; try { Class.forName(JDBC_DRIVER); //1.Get connection conn = DriverManager.getConnection(URL+ADDITIONAL_URL,USER,PASSWORD); //2.Get PreparedStatement String sql = "SELECT * FROM salary WHERE id = ? AND salary = ?"; prep = conn.prepareStatement(sql); prep.setInt(1, 8); prep.setDouble(2, 12500.0) //3.Execute sql using 2 approaches ResultSet set = prep.executeQuery(); //--directly execute. /* --indirectly execute. prep.execute(); ResultSet set = prep.getResultSet(); */ //4.Iter resultset, get data while(set.next()) { System.out.print(set.getInt("id")); System.out.println(); } } catch(SQLException sqle) { sqle.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } }execute相关的方法后后才能用getResultSet()获取结果集,否则抛出空指针异常。executeQuery(sql)时,里面不能有 ?,即使之前设置过也没用。Statement后最好用close()关闭。ResultSet是结果集,可以理解为游标cursor通过各种方法移动,然后用getXXX(column)等方法获取数据。
一些方法:
first() last() next() previous() beforeFirst() afterLast()不解释。absolute(int x) relative(int y)绝对移动和相对移动,为负数时反向移动。getString(column) getInt(column)获取当前光标位置的column名字的字段。注意点:
ResultSet使用过后最好用close()关闭。事务能够控制何时更改提交并应用于数据库。 它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败。
JDBC默认自动提交事务。可以通过方法setAutoCommit(boolean b)打开或关闭自动提交。关闭之后所有SQL语句的statement只有在手动调用方法conn.commit()后才全部被提交(conn代表Connection对象)。
事务回滚rollBack()可以取消已经提交的事务,用在catch中,在发生错误时已经提交的Statement全部无效。
可以设置Savepoint对象记录,然后用rollback(Savepoint sp)回滚到记录点,用在catch中。
以下代码因为拼错单词VALUE会导致SQLException被抛出,但检查数据库没有任何操作生效。因为事务回滚。
xxxxxxxxxxtry { Connection conn = DriverManager.getConnection(URL+ADDITIONAL_URL,USER,PASSWORD); //--disable auto commit. conn.setAutoCommit(false); Statement stmt = conn.createStatement(); PreparedStatement prep = conn.prepareStatement("UPDATE test_table SET emp = \"Sam\" WHERE id = 1"); prep.executeUpdate(); stmt.executeUpdate("INSERT INTO test_table (emp) VALUES (\"Jack\")"); //--The code below spelled VALUE incorrectly. stmt.executeUpdate("INSERT INTO test_table (emp) VALU (\"Jack\")"); conn.commit();} catch (SQLException sqle) { //--The code below rollback all commitments when an exception was caught: try { conn.rollback(); } catch (Exception e) { e.printStackTrace(); }}以下代码由于SQLException发生但设置了存档点所以也没有任何事发生。
xxxxxxxxxxtry { Connection conn = DriverManager.getConnection(URL+ADDITIONAL_URL,USER,PASSWORD); //--disable auto commit. conn.setAutoCommit(false); Savepoint cp = conn.setSavepoint(); Statement stmt = conn.createStatement(); PreparedStatement prep = conn.prepareStatement("UPDATE test_table SET emp = \"Sam\" WHERE id = 1"); prep.executeUpdate(); stmt.executeUpdate("INSERT INTO test_table (emp) VALUES (\"Jack\")"); //--The code below spelled VALUE incorrectly. stmt.executeUpdate("INSERT INTO test_table (emp) VALU (\"Jack\")"); conn.commit();} catch (SQLException sqle) { //--The code below rollback to a savepoint when an exception was caught: try { conn.rollback(cp); } catch (Exception e) { e.printStackTrace(); }}