小言_互联网的博客

数据库连接池和JdbcTemple

395人阅读  评论(0)

数据库连接池相关概念

概念:一个存放数据库连接的容器(集合)。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

好处:
        1. 节约资源
        2. 用户访问高效

    3. 实现:
        1. 标准接口:   javax.sql包下的DataSource
            方法:
                * 获取连接:getConnection()
                * 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接

        2. 一般我们不去实现它,有数据库厂商来实现
            1. C3P0:数据库连接池技术
            2. Druid:数据库连接池实现技术,由阿里巴巴提供的


C3P0:数据库连接池技术

步骤:
            1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,注意不要忘记导入数据库驱动jar包
            2. 定义配置文件:
                * 名称: c3p0.properties 或者 c3p0-config.xml

以我创建的数据库db4为例:


  
  1. <c3p0-config>
  2. <!-- 使用默认的配置读取连接池对象 -->
  3. <default-config>
  4. <!-- 连接参数 -->
  5. <property name="driverClass">com.mysql.jdbc.Driver </property>
  6. <property name="jdbcUrl">jdbc:mysql://localhost:3306/db4 </property>
  7. <property name="user">root </property>
  8. <property name="password">123456 </property>
  9. <!-- 连接池参数 -->
  10. <!-- 初始化申请的连接数量 -->
  11. <property name="initialPoolSize">5 </property>
  12. <!-- 最大连接数量 -->
  13. <property name="maxPoolSize">10 </property>
  14. <!-- 超时时间,超过则报错 -->
  15. <property name="checkoutTimeout">3000 </property>
  16. </default-config>
  17. <named-config name="otherc3p0">
  18. <!-- 连接参数 -->
  19. <property name="driverClass">com.mysql.jdbc.Driver </property>
  20. <property name="jdbcUrl">jdbc:mysql://localhost:3306/db4 </property>
  21. <property name="user">root </property>
  22. <property name="password">root </property>
  23. <!-- 连接池参数 -->
  24. <property name="initialPoolSize">5 </property>
  25. <property name="maxPoolSize">8 </property>
  26. <property name="checkoutTimeout">1000 </property>
  27. </named-config>
  28. </c3p0-config>


                * 路径:直接将文件放在src目录下即可。

            3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
            4. 获取连接: getConnection

具体操作步骤示例:


  
  1. public class C3P0Demo1 {
  2. public static void main(String[] args) throws SQLException {
  3. // 1、创建数据库连接池对象
  4. DataSource ds = new ComboPooledDataSource();
  5. // 2、获取连接对象
  6. Connection conn = ds.getConnection();
  7. //3、打印看下效果
  8. System.out.println(conn);
  9. }
  10. }

 

Druid连接池技术

Druid:数据库连接池实现技术,由阿里巴巴提供的

使用步骤


  
  1. public static void main(String[] args) throws Exception {
  2. // 1、导入jar包
  3. // 2、定义配置文件
  4. // 3、加载配置文件
  5. Properties pro = new Properties();
  6. InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream( "druid.properties");
  7. pro.load(is);
  8. // 4、获取连接池对象
  9. DataSource ds = DruidDataSourceFactory.createDataSource(pro);
  10. // 5、获取连接
  11. Connection conn = ds.getConnection();
  12. System.out.println(conn);
  13. }


            1. 导入jar包 druid-1.0.9.jar
            2. 定义配置文件:
                配置文件为properties文件的
                可以叫任意名称,可以放在任意目录下,需要手动加载配置文件
            3. 加载配置文件.Properties
            4. 获取数据库连接池对象:通过工厂来来获取  DruidDataSourceFactory
            5. 获取连接:getConnection

 定义工具类
            1. 定义一个类 JDBCUtils
            2. 提供静态代码块加载配置文件,初始化连接池对象
            3. 提供方法
                1. 获取连接方法:通过数据库连接池获取连接
                2. 释放资源
                3. 获取连接池的方法

工具类代码


  
  1. import java.io.IOException;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. import java.util.Properties;
  7. import javax.sql.DataSource;
  8. import com.alibaba.druid.pool.DruidDataSourceFactory;
  9. public class JDBCUtils {
  10. //1、定义成员变量 DataSource
  11. private static DataSource ds;
  12. static{
  13. try {
  14. //1、加载配置文件
  15. Properties pro = new Properties();
  16. pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream( "druid.properties"));
  17. //2、获取DataSource
  18. ds = DruidDataSourceFactory.createDataSource(pro);
  19. } catch (IOException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. } catch (Exception e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. }
  27. /**
  28. * 获取连接的方法
  29. * @param args
  30. * @throws SQLException
  31. */
  32. public static Connection getConnection() throws SQLException{
  33. return ds.getConnection();
  34. }
  35. /**
  36. * 释放资源
  37. * @param args
  38. */
  39. public static void close(Statement stmt,Connection conn){
  40. close( null,stmt,conn);
  41. }
  42. /**
  43. * 释放资源
  44. * @param args
  45. */
  46. public static void close(ResultSet rs, Statement stmt,Connection conn){
  47. if(rs!= null){
  48. try {
  49. rs.close();
  50. } catch (SQLException e) {
  51. // TODO Auto-generated catch block
  52. e.printStackTrace();
  53. }
  54. }
  55. if(stmt!= null){
  56. try {
  57. stmt.close();
  58. } catch (SQLException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. }
  62. }
  63. if(conn!= null){
  64. try {
  65. conn.close(); //归还连接
  66. } catch (SQLException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. }
  70. }
  71. }
  72. /**
  73. * 获取连接池的方法
  74. * @param args
  75. */
  76. public static DataSource getDataSource(){
  77. return ds;
  78. }
  79. }

以及写了个简单的Demo测试工具类


  
  1. public class DruidDemo2 {
  2. public static void main(String[] args) {
  3. /**
  4. * 完成添加操作,给account表添加一条记录
  5. */
  6. Connection conn = null;
  7. PreparedStatement pstmt = null;
  8. try{
  9. //1、获取链接
  10. conn = JDBCUtils.getConnection();
  11. //2、定义sql
  12. String sql = "insert into account values(null,?,?)";
  13. //3、获取pstmt对象
  14. pstmt = conn.prepareStatement(sql);
  15. //4、给?赋值
  16. pstmt.setString( 1, "王五");
  17. pstmt.setDouble( 2, 3000);
  18. //5、执行
  19. int count = pstmt.executeUpdate();
  20. System.out.println(count);
  21. } catch(SQLException e){
  22. e.printStackTrace();
  23. } finally{
  24. JDBCUtils.close(pstmt, conn);
  25. }
  26. }
  27. }

 

Spring框架对JDBC的简单封装

Spring框架对JDBC简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

步骤:

        1、导入jar包

         2、创建JdbcTemplate对象。依赖于数据源DataSource

          JdbcTemplate template = new JdbcTemplate(ds);

       3、调用JdbcTemplate的方法来完成CRUD的操作

          update():执行DML语句,增删改

          queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map

          queryForList():查询结果将结果集封装为list集合,将每一条记录封装为一个Map集合,再将Map集合装载到List集合中

          query():查询结果,将结果封装为JavaBean对象

                      query的参数:RowMapper

                                        一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装

                                        new BeanPropertyRowMapper<类型>(类型.class)

          queryForObject: 查询结果,将结果封装为对象   一般用于聚合函数的查询

例子:


  
  1. public static void main(String[] args) {
  2. //1、导入jar包
  3. /**
  4. * commons-logging-1.2.jar
  5. * spring-beans-5.0.0.RELEASE.jar
  6. * spring-core-5.0.0.RELEASE.jar
  7. * spring-jdbc-5.0.0.RELEASE.jar
  8. * spring-tx=5.0.0.RELEASE.jar
  9. */
  10. //2、创建JDBCTemplate对象
  11. JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); //使用了刚刚封装好的Druid工具类,来获取DataSource。即JDBCUtils.getDataSource
  12. //3、调用方法
  13. String sql = "update account set balance = 5000 where id = ?";
  14. int count = template.update(sql, 3); //从第二个参数开始,就代表传入第一个问号赋值
  15. System.out.println(count);
  16. }

 

相关方法使用示例


  
  1. public class JdbcTemplateDemo2 {
  2. //Junit单元测试,可以让方法独立执行
  3. //1. 获取JDBCTemplate对象
  4. private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  5. /**
  6. * 1. 修改1号数据的 salary 为 10000
  7. */
  8. @Test
  9. public void test1(){
  10. //2. 定义sql
  11. String sql = "update emp set salary = 10000 where id = 1001";
  12. //3. 执行sql
  13. int count = template.update(sql);
  14. System.out.println(count);
  15. }
  16. /**
  17. * 2. 添加一条记录
  18. */
  19. @Test
  20. public void test2(){
  21. String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";
  22. int count = template.update(sql, 1015, "郭靖", 10);
  23. System.out.println(count);
  24. }
  25. /**
  26. * 3.删除刚才添加的记录
  27. */
  28. @Test
  29. public void test3(){
  30. String sql = "delete from emp where id = ?";
  31. int count = template.update(sql, 1015);
  32. System.out.println(count);
  33. }
  34. /**
  35. * 4.查询id为1001的记录,将其封装为Map集合
  36. * 注意:这个方法查询的结果集长度只能是1
  37. */
  38. @Test
  39. public void test4(){
  40. String sql = "select * from emp where id = ? or id = ?";
  41. Map<String, Object> map = template.queryForMap(sql, 1001, 1002);
  42. System.out.println(map);
  43. //{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
  44. }
  45. /**
  46. * 5. 查询所有记录,将其封装为List
  47. */
  48. @Test
  49. public void test5(){
  50. String sql = "select * from emp";
  51. List<Map<String, Object>> list = template.queryForList(sql);
  52. for (Map<String, Object> stringObjectMap : list) {
  53. System.out.println(stringObjectMap);
  54. }
  55. }
  56. /**
  57. * 6. 查询所有记录,将其封装为Emp对象的List集合
  58. */
  59. @Test
  60. public void test6(){
  61. String sql = "select * from emp";
  62. List<Emp> list = template.query(sql, new RowMapper<Emp>() {
  63. //很麻烦
  64. @Override
  65. public Emp mapRow(ResultSet rs, int i) throws SQLException {
  66. Emp emp = new Emp();
  67. int id = rs.getInt( "id");
  68. String ename = rs.getString( "ename");
  69. int job_id = rs.getInt( "job_id");
  70. int mgr = rs.getInt( "mgr");
  71. Date joindate = rs.getDate( "joindate");
  72. double salary = rs.getDouble( "salary");
  73. double bonus = rs.getDouble( "bonus");
  74. int dept_id = rs.getInt( "dept_id");
  75. emp.setId(id);
  76. emp.setEname(ename);
  77. emp.setJob_id(job_id);
  78. emp.setMgr(mgr);
  79. emp.setJoindate(joindate);
  80. emp.setSalary(salary);
  81. emp.setBonus(bonus);
  82. emp.setDept_id(dept_id);
  83. return emp;
  84. }
  85. });
  86. for (Emp emp : list) {
  87. System.out.println(emp);
  88. }
  89. }
  90. /**
  91. * 6. 查询所有记录,将其封装为Emp对象的List集合
  92. */
  93. @Test
  94. public void test6_2(){
  95. String sql = "select * from emp";
  96. List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
  97. for (Emp emp : list) {
  98. System.out.println(emp);
  99. }
  100. }
  101. /**
  102. * 7. 查询总记录数
  103. */
  104. @Test
  105. public void test7(){
  106. String sql = "select count(id) from emp";
  107. Long total = template.queryForObject(sql, Long.class);
  108. System.out.println(total);
  109. }
  110. }

 


转载:https://blog.csdn.net/yuzhong9208/article/details/104908078
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场