【Java】JDBC

概念

JDBC API是一个Java API可以访问任何类型的数据库的数据,尤其是存储在关系数据库中的数据。

 

常用接口

DriverManager:管理JDBC驱动的服务类,主要用来获取Connection对象
Connection:数据库连接对象,功能:获取Statement对象、保存点、回滚、事务隔离、提交,简单来说就是控制SQL的执行
Statement:执行SQL语句的工具接口。1.查询用executeQuery,增删改用executeUpdate;2.PreparedStatement可以预编译,CallableStatement调用存储过程;3.addBatch()和executeBatch()可以实现批量更新;
PreparedStatement:预编译的Statement对象
ResultSet:结果集对象。是可滚动的,默认是不可更新的

 

基本编程步骤

//1.加载驱动
Class.forName("com.mysql.jdbc.Dreiver");
//2.获取数据库连接
Connection conn = DriverManager.getConnection(String url,String user,String pass);
//3.创建Statement对象
Statement stmt = conn.createStatement();
//4.使用Statement执行SQL语句
ResultSet rs = stmt.executeQuery("select * from user");
//5.操作结果集
while(rs.next()){
    System.out.println(rs.getInt(1) + "\t" + rs.getString(2));
}
//6.回收数据库资源
if(rs != null) { rs.close(); }
if(stmt != null) { stmt.close(); }
if(conn != null) { conn.close(); }

 

事务

概念:

  • 原子性:是执行体。不可分割的最小逻辑执行体,用来保证一致性;
  • 一致性:是状态。从一个一致性状态到另一个一致性状态;
  • 隔离性:是关系。各事务互不干扰,并发互不影响、互不可见;
  • 持续性:是结果。一旦提交,永久存储改变;

基本代码:

//关闭自动提交,开启事务
conn.setAutoCommit(false);
//执行多条DML语句
stmt.executeUpdate(...);
stmt.executeUpdate(...);
//提交事务
conn.commit();
//回滚事务
conn.rollback();

并发事务问题

  • 脏读(dirty read):读到另一个事务的未提交新数据,即读取到了脏数据;
  • 不可重复读(unrepeatable):对同一记录的两次读取不一致,因为另一事务对该记录做了修改;
  • 幻读(虚读)(phantom read):对同一张表的两次查询不一致,因为另一事务插入了一条记录。

隔离级别

//设置隔离级别:Connection.TRANSACTION_( READ_UNCOMMITTED | READ_COMMITTED | REPEATABLE_READ | READ_SERIALIZABLE)
con.setTransactionIsolation(int level);
  1. SERIALIZABLE(串行化):不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;

  2. REPEATABLE READ(可重复读):防止脏读和不可重复读,不能处理幻读;

  3. READ COMMITTED(读已提交数据):防止脏读,不能处理不可重复读和幻读;

  4. READ UNCOMMITTED(读未提交数据):可能出现任何事物并发问题,什么都不处理;

性能:SERIALIZABLE < REPEATABLE READ < READ COMMITTED < READ UNCOMMITTED

 

最佳实践

  1. 使用PrearedStatement,可以通过预编译的方式避免我们在拼接SQL时造成SQL注入
  2. 使用ConnectionPool,可以节省大量的创建关闭连接的时间
  3. 禁用自动提交,可以将一组数据库操作放在一个事务中,因为自动提交模式每次执行SQL语句都将执行自己的事务, 并且在执行结束提交
  4. 使用Batch Update,可以减少数据库数据传输的往返次数,从而提高性能
  5. 使用列名获取ResultSet中的数据,从而避免invalidColumIndexError
  6. 使用变量绑定而不是字符串拼接,使用?或者其他占位符也会提升性能,因为数据库就可以使用不同的参数执行相同的查询
  7. 在finally块中关闭Statement、PreparedStatement和Connection
  8. 选择合适的JDBC驱动:
    JDBC-ODBC Bridge driver (bridge driver) ;
    Native-API/partly Java driver (native driver);
    AllJava/Net-protocol driver (middleware driver);
    All Java/Native-protocol driver (Pure java driver);
  9. 尽量使用标准的SQL语句,在某种程度上避免数据库对SQL支持的差异
  10. 使用正确的getXXX()方法,当从ResultSet中读取数据的时候,使用正确的getXXX方法,这样可以避免数据类型转换

参考:http://www.importnew.com/26087.html

你可能感兴趣的:(【,Java,】,………J2SE)