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
的。
xxxxxxxxxx
import 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被抛出,但检查数据库没有任何操作生效。因为事务回滚。
xxxxxxxxxx
try {
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
发生但设置了存档点所以也没有任何事发生。
xxxxxxxxxx
try {
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();
}
}