(一)JDBC之事务相关概念
1)概念:事务使指一组最小逻辑操作单元,里面有多个操作组成。组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。
2)事务ACID特性:
1.原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。原子性是一个最小逻辑操作单元 。
2.一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3.隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4.持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。事务与事务之间是隔离的。
(二)JDBC之批处理
批处理:一次性处理大量数据.
批处理相关方法:
void addBatch(String sql) 添加批处理
void clearBatch() 清空批处理
int[]executeBatch() 执行批处理
代码:
ArrayList<User> list = new ArrayList<User>(); for(int i=0;i<100;i++){ User user = new User(i,"张三"+i); list.add(user); } //把这100个用户添加到数据库里面去 Connection conn = JDBCUtil.getConnection(); String sql="insert into student values(?,?)"; PreparedStatement statement = conn.prepareStatement(sql); //用批处理来执行 for(User u:list){ statement.setInt(1,u.getId()); statement.setString(2, u.getUsername()); //调用批处理 statement.addBatch(); } //执行批处理 statement.executeBatch(); //清空批处理 statement.clearBatch(); //释放资源 JDBCUtil.close(conn, statement);
(三)连接池
连接池:是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。当一个线程需要用JDBC对数据库进行操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样它就可以被想要使用它的线程使用。连接池可以极大的改善用户的JAVA应用程序的性能。
1)C3P0:是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。要求必须掌握并熟练运用
使用步骤:
1.导入jar包(c3p0-0.9.1.2.jar)
2.BasicDataSource ds = new BasicDataSource(); 设置参数 ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql:///mydb_01"); ds.setUsername("root"); ds.setPassword("root"); 获取预编译对象 Connection conn = ds.getConnection(); String sql="insert into student values(?,?)"; PreparedStatement statement = conn.prepareStatement(sql); statement.setNull(1,Types.INTEGER); statement.setString(2,"王五");//括号内的参数:(问号的序号,值) statement.executeUpdate(); ds.close();
2)dbutils:是apache组织的一个工具类,jdbc的框架,更方便我们使用,需要配合c3p0去使用使用步骤:1.导入jar包(commons-dbutils-1.4.jar)2.创建一个QueryRunner类 QueryRunner:操作sql语句 构造器:new QueryRunner(Datasource ds); 底层帮助创建连接,创建语句执行者 ,释放资源. 常用方法:query(..):update(..):3.编写sql4.执行sql:query(..); update(...); 执行查询后返回的结果集 ResultSetHandler:封装结果集 接口 BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
ComboPooledDataSource ds = new ComboPooledDataSource(); QueryRunner runner = new QueryRunner(ds); String sql = "insert into student values(4,'张三')"; sql = "select * from student"; // 查询出所有数据 封装为对象 再把对象装到集合里面去 List<User> list = runner.query(sql, new BeanListHandler<>(User.class)); System.out.println(list);