day05 -- > (数据库连接池 、Spring JDBC : JDBC Template)

一、数据库连接池

1、概念:其实就是一个容器(集合) ,存放数据库连接的容器

当系统初始化后,容器被创建,容器中会申请一些连接对象,当用户访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器

 

 

 2、优点:节约系统资源、用户访问高效

 3、实现:

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

方法:

获取连接:getConnection();

归还连接:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接

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

1.C3P0 :数据库连接池技术

2.Druid : 数据库连接池实现技术

4、C3P0 :数据库连接池技术

步骤:

1.导入2个jar包 : c3p0-0.9.5.2.jar , mchange-commons-java-0.2.12.jar ,

不要忘记数据库驱动jar包

2.定义配置文件:

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

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

 3.创建核心对象 --> 数据库连接对象 : ComblPoolDataSource

4.获取连接 : getConnection

 5、Druid : 数据库连接池技术

步骤:

1、导入jar包

2、定义配置文件:

是properties形式的(键值对);

可以叫任意名称,可以放在任意目录下(需要手动加载)

3、获取数据库连接对象 : 通过工厂类 DruidDataSourceFactory

4、获取连接 :getConnection

定义工具类:

1.定义一个类 : JDBCUtils

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

3.提供方法:

1.获取连接的方法:通过数据库连接池获取连接

2.释放资源

3.获取连接池

二、Spring JDBC : JDBC Template

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

步骤:

1.jar包

2.创建 JDBCTemplate 对象。依赖于数据源 DataSource

JbdcTemplate template = new JdbcTemplate(ds);

3.调用JDBCTemplate 的方法完成CRUD的操作

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

query

queryForMap() : 查询结果,将结果集封装为map集合

queryForList() : 查询结果,将结果封装为List集合

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

query的参数 : RowMapper

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

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

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

一般用于聚合函数的查询

4.练习:

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

2.添加一条记录

3.删除刚才添加的记录

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

注意:该Map集合只能封装一条查询记录,key对应的是列名,value对应的是具体的值

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

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

7.查询总记录数

代码实现:

复制代码
public class JDBCTemplateDemo2 {
    //1.获取JDBCTemplate对象
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    //JUint单元测试,可以让方法独立执行
    //1.修改1001号数据的 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);
       Assert.assertEquals(1,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);
        Assert.assertEquals(1,count);
    }

    //3.删除刚才添加的记录
    @Test
    public void test3(){
       String sql = "delete from emp where id = ?";
       int count = template.update(sql,1015);
       Assert.assertEquals(1,count);
    }

    //4.查询id为1的记录,将其封装为Map集合
    //注意:queryForMap查询的结果只能封装一条记录
    @Test
    public void test4(){
//       String sql = "select * from emp where id = ? or id = ?";
//       Map<String, Object> map = template.queryForMap(sql, 1001,1002);
         String sql = "select * from emp where id = ? or id = ?";
         Map<String, Object> map = template.queryForMap(sql, 1001);
         System.out.println(map);
    }

    //5.查询所有记录,将其封装为List
    @Test
    public void test5(){
       String sql = "select * from emp";
       List<Map<String, Object>> maps = template.queryForList(sql);
        for (Map<String, Object> map : maps) {
            System.out.println(map);
        }
    }

    //6.查询所有记录,将其封装为Emp对象
    @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 {
               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 emp = new Emp();
               emp.setId(id);
               emp.setName(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;
           }
       });
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }

    @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 count = template.queryForObject(sql, Long.class); System.out.println(count); } }
复制代码

 

 

posted @   羽梦齐飞  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示