JDBC(二)

来源:互联网 发布:淘宝同行活动来源分析 编辑:程序博客网 时间:2024/05/21 08:53

 (一)JDBC之事务相关概念

1)概念:事务使指一组最小逻辑操作单元,里面有多个操作组成。组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。

2)事务ACID特性:

1.原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。原子性是一个最小逻辑操作单元 。 

2.一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

3.隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

4.持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。事务与事务之间是隔离的。 

(二)JDBC之批处理

批处理:一次性处理大量数据.

批处理相关方法:

void addBatch(String sql) 添加批处理

void clearBatch()  清空批处理

int[]executeBatch() 执行批处理


eg:批量保存信息

// 创建ArrayList集合存储User对象ArrayList<User> list = new ArrayList<User>();// 循环插入用户for (int i = 1; i < 50; i++) {User user = new User(i + 1, "张三" + i);list.add(user);}// 获取数据库连接对象Connection connection = JDBCUtil.getConnection();// 定义sql语句String sql = "insert into student values(?,?)";// 获取预编译对象PreparedStatement statement = connection.prepareStatement(sql);for (User u : list) {// 给问号赋值statement.setInt(1, u.getId());statement.setString(2, u.getName());// 调用批处理statement.addBatch();}// 执行批处理statement.executeBatch();// 清空批处理statement.clearBatch();// 释放资源JDBCUtil.close(connection, statement);

(三)JDBC第三方连接池

   连接池:是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。当一个线程需要用JDBC对数据库进行操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样它就可以被想要使用它的线程使用。连接池可以极大的改善用户的JAVA应用程序的性能。

   常见的连接池:DBCP  和  C3P0。

1)DBCP(DataBase connection pool):是apache上的一个java连接池项目,也是tomcat使用的一个连接池组件。

使用步骤:

1.导入jar包(commons-dbcp-1.4.jar  和  commons-pool-1.5.6.jar) 

2.如下:

// 1.硬编码的方式/* * BasicDataSource ds = new BasicDataSource(); *  * ds.setDriverClassName("com.mysql.jdbc.Driver"); * ds.setUrl("jdbc:mysql:///mydb_02"); ds.setUsername("root"); * ds.setPassword("root"); *  * // 获取数据库连接对象 *  Connection connection = ds.getConnection(); *  * // 定义sql语句  * String sql = "insert into student values(?,?)";  * // 获取预编译对象 * PreparedStatement statement = connection.prepareStatement(sql); * statement.setInt(1, 3); statement.setString(2, "李四"); *  * statement.executeUpdate(); *  * // 释放资源 *  statement.close();  *  connection.close();  *  ds.close(); */// 2.配置文件的方式Properties properties = new Properties();properties.load(new FileInputStream("src/dbcp.properties"));DataSource ds = BasicDataSourceFactory.createDataSource(properties);Connection connection = ds.getConnection();// 定义sql语句String sql = "insert into student values(?,?)";// 获取预编译对象PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1, 3);statement.setString(2, "李四");statement.executeUpdate();

2)C3P0:是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

c3p0和DBCP区别: DBCP没有自动回收空闲连接的功能,c3p0有自动回收空闲连接的功能。

使用步骤:

1.导入jar包(c3p0-0.9.1.2.jar)

2.如下:

// 1.硬编码的形式/* * ComboPooledDataSource ds = new ComboPooledDataSource(); *  * ds.setDriverClass("com.mysql.jdbc.Driver"); * ds.setJdbcUrl("jdbc:mysql:///mydb_02"); ds.setUser("root"); * ds.setPassword("root"); *  * // 获取连接对象  * Connection connection = ds.getConnection(); *  * String sql = "insert into student values(4,'王五')"; * PreparedStatement statement = connection.prepareStatement(sql); *  * statement.executeUpdate(); *  * ds.close(); */// 2.配置文件方式/* * 要求: * 1:配置文件的名称:c3p0.properties 或者 c3p0-config.xml * 2:配置文件的路径:在src下 * */ComboPooledDataSource ds = new ComboPooledDataSource();// 获取数据库连接对象Connection connection = ds.getConnection();// 获取预编译对象String sql = "insert into student values(?,?)";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1, 5);statement.setString(2, "赵六");statement.executeUpdate();
3)dbutils:是apache组织的一个工具类,jdbc的框架,更方便我们使用
使用步骤:
1.导入jar包(commons-dbutils-1.4.jar)
2.创建一个QueryRunner类
    QueryRunner:操作sql语句
      构造器:new QueryRunner(Datasource ds);
      底层帮助创建连接,创建语句执行者 ,释放资源.
      常用方法:query(..):update(..):
3.编写sql
4.执行sql:query(..);  update(...);
  
执行查询后返回的结果集
    ResultSetHandler:封装结果集 接口
    BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.

ComboPooledDataSource ds = new ComboPooledDataSource();// 创建QueryRunner对象操作数据库QueryRunner runner = new QueryRunner(ds);// String sql = "insert into User values(4,'王五')";// runner.update(sql);String sql = "select * from User";// 查询出所有数据 封装为对象 再把对象装到集合里面去List<User> list = runner.query(sql, new BeanListHandler<User>(User.class));System.out.println(list);
原创粉丝点击