数据库连接池

  1. 概念:其实就是一个容器(集合),存放数据库连接的容器。
    当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器。
  2. 好处:
    1. 节约资源
    2. 用户访问高效
  3. 实现:
    1. 标准接口:DataSource javax.sql包下的
      1. 方法:
        • 获取连接:getConnection()
        • 归还连接:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接
    2. 一般我们不去实现它,由数据库厂商来说实现
      1. C3P0:数据库连接池技术
      2. Druid:数据库连接池实现技术,由阿里巴巴提供的
  4. C3P0:数据库连接池技术
    • 步骤:
      1. 导入jar包两个 c3p0-0.9.5.2 jar mchange-commons-java-0.2.12.jar 前提是有mysql的驱动jar包
      2. 定义配置文件:
        • 名称:c3p0.properties 或者 c3p0-config.xml
        • 路径:直接将文件放在src目录下即可。
      3. 创建核心对象 数据库连接池对象 ComboPolledDataSource
        配置文件的演示:

代码演示:```java package b_datesource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException;

public class C3P0Demo2 {

  1. public static void main(String[] args) throws SQLException {
  2. //1.获取DataSource,new ComboPooledDataSource()使用默认配置

// DataSource ds = new ComboPooledDataSource(); //1.1获取DataSource 使用指定名称的配置 DataSource ds = new ComboPooledDataSource(“otherc3p0”); //2.获取连接 for (int i = 1; i <= 11; i++) { Connection conn = ds.getConnection(); System.out.println(i + “” + conn);

  1. if (i == 5){//归还连接
  2. conn.close();
  3. }
  4. }
  5. }

}

  1. <br />结果:<br />(第五个归还连接,第六个使用第五个归还的连接,最大连接数量还是10)
  2. 5. Druid:数据库连接池实现技术,由阿里巴巴提供的
  3. 1. 步骤:
  4. 1. 导入jar包:druid -1.0.9.jar
  5. 2. 定义配置文件:
  6. - 是properties形式的
  7. - 可以叫任意名称,可以放在任意目录下
  8. 3. 加载配置文件。`Properties`
  9. 4. 获取数据路连接池对象:通过工厂类来获取 `DruidDataSourceFactory`
  10. 5. 获取连接:`getConnection`
  11. 2. 定义工具类
  12. 1. 定义一个类 `JDBCUtils`
  13. 2. 提供静态代码块加载配置文件,初始化连接池对象
  14. 3. 提供方法
  15. 1. 获取连接方法:通过数据库连接池获取连接
  16. 2. 释放资源
  17. 3. 获取连接池方法
  18. 工具类代码:
  19. ```java
  20. import com.alibaba.druid.pool.DruidDataSourceFactory;
  21. import javax.sql.DataSource;
  22. import java.io.IOException;
  23. import java.sql.Connection;
  24. import java.sql.ResultSet;
  25. import java.sql.SQLException;
  26. import java.sql.Statement;
  27. import java.util.Properties;
  28. @SuppressWarnings("All")
  29. public class JDBCUtils {
  30. //1.定义成员变量 DataSource
  31. private static DataSource dataSource;
  32. static {
  33. try {
  34. //1.加载配置文件
  35. Properties properties = new Properties();
  36. properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
  37. //2.获取DataSource
  38. dataSource = DruidDataSourceFactory.createDataSource(properties);
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. /**
  46. * 获取连接的方法
  47. */
  48. public static Connection getConnection() throws SQLException {
  49. return dataSource.getConnection();
  50. }
  51. public static void close(Statement statement,Connection connection){
  52. if (statement != null){
  53. try {
  54. statement.close();
  55. } catch (SQLException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. if (connection != null){
  60. try {
  61. connection.close();//归还连接
  62. } catch (SQLException e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. }
  67. public static void close(ResultSet resultSet,Statement statement,Connection connection){
  68. if (resultSet != null){
  69. try {
  70. resultSet.close();
  71. } catch (SQLException e) {
  72. e.printStackTrace();
  73. }
  74. }
  75. close(statement,connection);
  76. }
  77. /**
  78. * 获取连接池的方法
  79. */
  80. public static DataSource getDataSource(){
  81. return dataSource;
  82. }
  83. }

测试代码:

  1. import b_datesource.utils.JDBCUtils;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.SQLException;
  5. /**
  6. * 使用新的工具类
  7. */
  8. @SuppressWarnings("All")
  9. public class DruidDemo2 {
  10. public static void main(String[] args) {
  11. /***
  12. * 给account表添加一条记录
  13. */
  14. Connection connection = null;
  15. PreparedStatement pstm = null;
  16. try {
  17. //1.获取连接
  18. connection = JDBCUtils.getConnection();
  19. //2.定义Sql
  20. String sql = "insert into account values(null,?,?)";
  21. //3.获取pstm对象
  22. pstm = connection.prepareStatement(sql);
  23. //4.赋值
  24. pstm.setString(1,"wudi");
  25. pstm.setDouble(2,3000);
  26. //5.执行sql
  27. int update = pstm.executeUpdate();
  28. } catch (SQLException e) {
  29. e.printStackTrace();
  30. }finally {
  31. JDBCUtils.close(pstm,connection);
  32. }
  33. }
  34. }

Spring JDBC

  • Spring框架对JDBC简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
  • 步骤:
    1. 导入jar包
      • commons-logging-1.2.jar
      • spring-beans-5.0.0.RELEASE.jar
      • spring-core-5.0.0.RELEASE.jar
      • spring-jdbc-5.0.0.RELEASE.jar
      • spring-tx-5.0.0.RELEASE.jar
    2. 创建JdbcTemplate对象。依赖于数据源DataSource
      • JdbcTemplate template = new JdbcTemplate(ds);
    3. 调用JdbcTemplate的方法来完成CRUD的操作
      • update():执行DML语句。增,删,改语句
      • queryForMap():查询结果将结果集封装为map集合,将列名作为key,值作为value
        • 注意:这个方法查询的结果集长度只能是1
      • queryForLIst():查询结果将结果封装为list集合
        • 注意:将每一条记录封装为map集合,再将所有map集合封装为list集合
      • query():查询结果,将结果集封装为JavaBean对象
      • queryForObject():查询结果,将结果集封装为对象
        代码演示:```java package b_datesource.jdbctemplate;

import b_datesource.utils.JDBCUtils; import org.junit.jupiter.api.Test; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Map; @SuppressWarnings(“All”) public class JdbcTemplateDemo2 {

  1. //1.获取JDBCTemplate对象
  2. JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  3. //Junit单元测试
  4. /**
  5. * 修改id为3的数据balance为3000
  6. */
  7. @Test
  8. public void test() {
  9. //2.定义sql
  10. String sql = "update account set balance = 3000 where id = ?";
  11. //3.执行sql
  12. int update = template.update(sql, 3);
  13. if (update > 0) {
  14. System.out.println("修改成功");
  15. } else {
  16. System.out.println("添加失败");
  17. }
  18. }
  19. /**
  20. * 添加一条记录
  21. */
  22. @Test
  23. public void test2() {
  24. String sql = "insert into account values(null,?,?)";
  25. int jiege = template.update(sql, "jiege", 1000000);
  26. if (jiege > 0) {
  27. System.out.println("添加成功");
  28. } else {
  29. System.out.println("添加失败");
  30. }
  31. }
  32. /**
  33. * 删除刚添加的数据
  34. */
  35. @Test
  36. public void test3() {
  37. String sql = "Delete from account where id = ?";
  38. int update = template.update(sql, 4);
  39. if (update > 0) {
  40. System.out.println("删除成功");
  41. } else {
  42. System.out.println("删除失败");
  43. }
  44. }
  45. /**
  46. * 查询id为1的记录,将其封装为Map集合
  47. * 注意:这个方法的结果集长度只能是1
  48. */
  49. @Test
  50. public void test4() {
  51. String sql = "Select * from account where id = ?";
  52. Map<String, Object> map = template.queryForMap(sql,1);
  53. System.out.println(map);
  54. map.forEach((s,q)-> System.out.println(s+"=="+q));
  55. }
  56. /**
  57. * 查询所有的记录,将其封装为list集合
  58. */
  59. @Test
  60. public void test5() {
  61. String sql = "select * from account";
  62. List<Map<String, Object>> list = template.queryForList(sql);
  63. for (Map<String, Object> map : list) {
  64. System.out.println(map);
  65. }
  66. }
  67. /**
  68. * 将所有对象封装为javaBean对象的list集合
  69. */
  70. @Test
  71. public void test6() {
  72. String sql = "Select * from account";
  73. List<Accounts> list = template.query(sql, new RowMapper<Accounts>() {
  74. @Override
  75. public Accounts mapRow(ResultSet resultSet, int i) throws SQLException {
  76. Accounts accounts = new Accounts();
  77. int id = resultSet.getInt("id");
  78. String name = resultSet.getString("name");
  79. double balance = resultSet.getDouble("balance");
  80. accounts.setId(id);
  81. accounts.setUser(name);
  82. accounts.setBalance(balance);
  83. return accounts;
  84. }
  85. });
  86. for (Accounts accounts : list) {
  87. System.out.println(accounts );
  88. }
  89. }
  90. /**
  91. * 将所有对象封装为javaBean对象的list集合
  92. */
  93. @Test
  94. public void test7() {
  95. String sql = "Select * from account";
  96. List<Accounts> list = template.query(sql, new BeanPropertyRowMapper<Accounts>(Accounts.class));
  97. for (Accounts accounts : list) {
  98. System.out.println(accounts);
  99. }
  100. }
  101. /**
  102. * 查询总记录数
  103. */
  104. @Test
  105. public void test8(){
  106. String sql = "Select count(1) from account";
  107. Long aLong = template.queryForObject(sql, Long.class);
  108. System.out.println(aLong);
  109. }

} ```