数据库基础(五)----- 数据库连接池,JDBC Template

简介: 数据库基础(五)----- 数据库连接池,JDBC Template

 数据库连接池

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

✔  好处: 节约资源, 用户访问高效

✔  实现:

1. 标准接口:DataSource   javax.sql包下的

   方法:

           * 获取连接:getConnection()

           * 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用

Connection.close()方法,则不会再关闭连接了,而是归还连接

2. 一般我们不去实现它,有数据库厂商来实现

      C3P0:数据库连接池技术

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

✔  C3P0:数据库连接池技术

   * 步骤:

    1. 导入jar包 (两个) c3p0-0.9.5.2.jar      mchange-commons-java-0.2.12.jar

        * 不要忘记导入数据库驱动jar包 mysql-connector-java-8.0.15.jar

        * 不要忘记所有 jar 包要 add as library

    2. 定义配置文件:

        * 名称: c3p0.properties 或者 c3p0-config.xml

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

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

    4. 获取连接: getConnection

   * 代码:

//1.创建数据库连接池对象
DataSource ds  = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();

image.gif

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

▶  步骤:

      1. 导入jar包 druid-1.0.9.jar (不要忘了 add as library)

      2. 定义配置文件:

           * 是properties形式的

           * 可以叫任意名称,可以放在任意目录下

      3. 加载配置文件:Properties(配置文件不能自动加载,要手动加载,通过类加载器ClassLoader)

      4. 获取数据库连接池对象:通过工厂类来获取  DruidDataSourceFactory

      5. 获取连接:getConnection

    * 代码:

//3.加载配置文件
   Properties pro = new Properties();
   InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
   pro.load(is);
 //4.获取连接池对象
   DataSource ds = DruidDataSourceFactory.createDataSource(pro);
 //5.获取连接
   Connection conn = ds.getConnection();

image.gif

▶  定义工具类:

      1. 定义一个类 JDBCUtils

      2. 提供静态代码块加载配置文件,初始化连接池对象

      3. 提供方法

          (1)获取连接方法:通过数据库连接池获取连接

          (2)释放资源

          (3)获取连接池的方法

    * 代码:

public class JDBCUtils {
  //1.定义成员变量 DataSource
  private static DataSource ds ;
  static{
    try {
           //1.加载配置文件
           Properties pro = new Properties();
               pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
           //2.获取DataSource
           ds = DruidDataSourceFactory.createDataSource(pro);
      } catch (IOException e) {
                e.printStackTrace();
      } catch (Exception e) {
                e.printStackTrace();
      }
  }
  /*
    获取连接
  */
  public static Connection getConnection() throws SQLException {
    return ds.getConnection();
  }
  /*
    释放资源
  */
  public static void close(Statement stmt,Connection conn){
           close(null,stmt,conn);
        }
        public static void close(ResultSet rs , Statement stmt, Connection conn){
               if(rs != null){
        try {
              rs.close();
            } catch (SQLException e) {
                    e.printStackTrace();
            }
              }
               if(stmt != null){                    
                    try {                        
                          stmt.close();                    
                         } catch (SQLException e) {  
                           e.printStackTrace();                   
                         }                
                     }            
               if(conn != null){                  
                     try {                       
                          conn.close();//归还连接                   
                         } catch (SQLException e) {    
                          e.printStackTrace();                
                         }               
                       }            
         }             
          /*
              获取连接池方法            
          */                    
         public static DataSource getDataSource(){                
                 return  ds;           
          }               
 }

image.gif

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集合(注意:这个方法查询的结果集长度只能是1)

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

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

            query的参数:RowMapper

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

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

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

✔  练习

* 需求:

           1. 修改1号数据的 salary 为 10000

           2. 添加一条记录

           3. 删除刚才添加的记录

           4. 查询id为1的记录,将其封装为Map集合

           5. 查询所有记录,将其封装为List

           6. 查询所有记录,将其封装为Emp对象的List集合

           7. 查询总记录数

* 代码:

import cn.itcast.domain.Emp;
import cn.itcast.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
public class JdbcTemplateDemo2 {
    //Junit单元测试,可以让方法独立执行
    /1. 获取JDBCTemplate对象
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    /*
  1. 修改1号数据的 salary 为 10000
    */
    @Test
    public void test1(){
        //2. 定义sql
  String sql = "update emp set salary = 10000 where id = 1001";
  //3. 执行sql
  int count = template.update(sql);
  System.out.println(count);
     }
    /*
  2. 添加一条记录
     */
     @Test
     public void test2(){
  String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";
  int count = template.update(sql, 1015, "郭靖", 10);
  System.out.println(count);
      }
     /*
  3.删除刚才添加的记录
     */
     @Test
     public void test3(){
        String sql = "delete from emp where id = ?";
  int count = template.update(sql, 1015);
  System.out.println(count);
      }
     /*
  4.查询id为1001的记录,将其封装为Map集合
        注意:这个方法查询的结果集长度只能是1
     */
     @Test
     public void test4(){
  String sql = "select * from emp where id = ? or id = ?";
  Map<String, Object> map = template.queryForMap(sql, 1001,1002);
  System.out.println(map);
     }
     /*
  5. 查询所有记录,将其封装为List
      */
      @Test
      public void test5(){
    String sql = "select * from emp";
    List<Map<String, Object>> list = template.queryForList(sql);
    for (Map<String, Object> stringObjectMap : list) {
        System.out.println(stringObjectMap);
          }
      }
      /*
   6. 查询所有记录,将其封装为Emp对象的List集合
       */
  @Test
  public void test6(){
         String sql = "select * from emp";
         List<Emp> list = template.query(sql, new RowMapper<Emp>() {
       @Override
       public Emp mapRow(ResultSet rs, int i) throws SQLException {
       Emp emp = new Emp();
       int id = rs.getInt("id");
       String ename = rs.getString("ename");
       int job_id = rs.getInt("job_id");
       int mgr = rs.getInt("mgr");
       Date joindate = rs.getDate("joindate");
       double salary = rs.getDouble("salary");
       double bonus = rs.getDouble("bonus");
       int dept_id = rs.getInt("dept_id");
        emp.setId(id);
        emp.setEname(ename);
        emp.setJob_id(job_id);
        emp.setMgr(mgr);
        emp.setJoindate(joindate);
        emp.setSalary(salary);
        emp.setBonus(bonus);
        emp.setDept_id(dept_id);
        return emp;
         }
    });
      /*
    6. 查询所有记录,将其封装为Emp对象的List集合
      */
      @Test
      public void test6_2(){
    String sql = "select * from emp";
    List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
    for (Emp emp : list) {
    System.out.println(emp);
    }
     }
       /*
     7. 查询总记录数
        */
  @Test
  public void test7(){
        String sql = "select count(id) from emp";
        Long total = template.queryForObject(sql, Long.class);
        System.out.println(total);
  }
}

image.gif


相关文章
|
3月前
|
Java 关系型数据库 数据库连接
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
48 8
|
3月前
|
Java 数据库连接 API
JDBC:Java数据库连接的“黑科技”大揭秘
JDBC:Java数据库连接的“黑科技”大揭秘
38 7
|
1月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
28 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
1月前
|
SQL Java 数据库
Springboot+spring-boot-starter-data-jdbc实现数据库的操作
本文介绍了如何使用Spring Boot的spring-boot-starter-data-jdbc依赖来操作数据库,包括添加依赖、配置数据库信息和编写基于JdbcTemplate的数据访问代码。
69 2
|
1月前
|
SQL druid Java
JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO
JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO
33 0
|
3月前
|
SQL 数据库
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
|
3月前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
3月前
|
SQL Java 数据库连接
JDBC之旅:从陌生到熟悉的Java数据库连接之路
JDBC之旅:从陌生到熟悉的Java数据库连接之路
32 9
|
3月前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
Java开发者必知:JDBC连接数据库的“三大法宝”
36 7
|
3月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
58 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
下一篇
无影云桌面