四、JDBC连接池&JDBCTemplate

jar包是实现类,收数据库厂商出。
在这里插入图片描述

内容:

  1. 数据库连接池
  2. Spring JDBC:JDBC Template

2、数据库连接池—概述

为什么使用数据库连接池?

在使用每个类的时候,我们都需要获取数据库连接对象,它首先要向操作系统底层申请资源,而申请资源是非常耗时的一件事,用完还要资源释放。
使用数据连接池就是为了解决这些弊端。

在这里插入图片描述
在这里插入图片描述

3、数据库连接池—实现简介

在这里插入图片描述

4、C3P0:数据库连接池技术-----基本使用

在这里插入图片描述


c3p0-config.xml 配置文件
在这里插入图片描述
Demo:
在这里插入图片描述

5、数据库连接池的配置演示

c3p0-config.xml 配置文件里面包含了2个config配置:一个是默认的,一个是指定名称的。

测试1:测试最大连接对象和close(了解)在这里插入图片描述

假设设置了for循环,循环11次,每次循环获取对象池中的对象,也就是获取11个。但是,默认容器最多连接对象为10个,所以运行时会报错。
如果当我们在循环11次获取连接对象的时候,等到循环第5次,我们讲第5个连接对象归还给容器,那么容器又多了一个对象。【你看第5个和第6个对象是同一个对象】

测试2:使用指定的config配置文件(了解)
在这里插入图片描述

6、druid:数据库连接池技术—基本使用

在这里插入图片描述
配置文件在这里插入图片描述

Demo:
在这里插入图片描述

7、druid:数据库连接池技术—工具类

在这里插入图片描述
Demo:

public class JDBCUitls {

    1、定义成员变量 DataSource
    private static DataSource ds;

    2.加载配置文件	,随便获取连接池对象(连接池对象只有一个)
    static {
        try {
            //创建Properties集合对象
            Properties pro = new Properties();
            //以键对值的方式把配置文件的数据存进集合对象中
            pro.load(JDBCUitls.class.getClassLoader().getResourceAsStream("druid.properties"));
            //获取DataSource连接池对象,并赋值给成员变量
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    
     * 3、定义 获取数据库连接对象方法
     * @return 数据库连接池对象
     */
   public static Connection getDataSourse() throws SQLException {
        return ds.getConnection();
    }
    
     * 4、释放资源
     *
     * @param sta
     * @param con
     */
    public static void close(Statement sta, Connection con) {
        //调用重载的close方法,可以简化代码
       close(null,sta,con);
    }

    public static void close(ResultSet rs, Statement sta, Connection con) {
        if (rs != null) {
            try {
                rs.close();    //释放资源
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (sta != null) {
            try {
                sta.close();    //释放资源
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();    //归还连接对象
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    5、获取连接池对象方法		【为什么定义这个方法:因为有些框架只需要连接池对象就可以了,比如JDBCTemplate】
     */

    public static DataSource getDataSource(){
        return  ds;
    }
}

8、【测试】druid:数据库连接池技术—工具类

 *  完成添加操作:给account表添加一条记录
 */
public class DruidDemo02 {
    public static void main(String[] args) {
        Connection con =null;
        PreparedStatement ps =null;
        try {
            //1、获取数据库连接对象
            con = JDBCUitls.getConnection();
            //2、定义SQL语句
            String sql = "insert into account values(null,?,?)";
            //3、获取SQL执行对象
            ps = con.prepareStatement(sql);
            //4、给占位符赋值
            ps.setString(1,"王五");
            ps.setDouble(2,2000);
            //5、执行SQL语句
            int i = ps.executeUpdate();
            //6、打印输出影响行数【除了select是0外】
            System.out.println(i);

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUitls.close(ps,con);
        }
    }
}

9_JDBCTemplate_介绍

为什么使用Spring JDBC:JDBC Template?

因为我们在使用JDBC(包括连接池)的时候,很多代码重复,我们主要是关注“增删改查”语句。
JDBC Template就是为了简化代码。

在这里插入图片描述

10_JDBCTemplate_快速入门

在这里插入图片描述

11_JDBCTemplate_执行DML语句【上】

public class Demo01 {
    //1、创建JdbcTemPlate对象
    private JdbcTemplate jt = new JdbcTemplate(JDBCUitls.getDataSource());  //这样每次运行方法就不需要获取对象了JdbcTemplate
    //Junit单元测试,可以让方法独立运行
    /**
     * 一、修改1015号数据的salary为10000
     */
    @Test
    public void test01(){
        //2、定义SQL语句
        String sql ="update emp set banlance = 10000 where id = 1015";
        //3.执行SQL语句
        int count = jt.update(sql);
        //4、打印输出影响行数
        System.out.println(count);

    }

    /**
     * 二、添加1条记录
     */
    @Test
    public void test02(){
        //2、定义SQL语句
        String sql ="insert into emp(id,ename,dept_id) vaules (?,?,?)";
        //3、执行SQL语句
        int count = jt.update(sql, 1016, "刘德华", 10);
        //4、打印输出影响行数
        System.out.println(count);
    }

    /**
     * 三、删除添加的记录
     */
    @Test
    public void test03(){
        //2、定义SQL语句
        String sql = "delete from emp where id = ?";
        //3、执行SQL语句
        int count = jt.update(sql, 1015);
        //4、打印输出影响行数
        System.out.println(count);
    }
}

12_JDBCTemplate_执行DQL语句【下】

在这里插入图片描述

public class Demo01 {
    //1、创建JdbcTemPlate对象
    private JdbcTemplate jt = new JdbcTemplate(JDBCUitls.getDataSource());  //这样每次运行方法就不需要获取对象了JdbcTemplate
    
    /**
     * 四、查询id为1001的记录,将查询结果集封装成Map集合    【注意:queryForMap方法只能查询长度为1的结果集】
     */
    @Test
    public void test04() {
        //2、定义SQL语句
        String sql = "select * from emp where identity =?";
        //3、执行SQL语句
        Map<String, Object> somap = jt.queryForMap(sql, 1001);
        //4、打印输出影响行数
        System.out.println(somap);
    }


    /**
     * 五、查询所有的记录,封装成List集合      【先把每一条结果集封装成Map集合,再将Mao集合装进List集合中】
     */
    @Test
    public void test05() {
        //2、定义SQL语句
        String sql = "select * from emp";
        //3、执行SQL语句
        List<Map<String, Object>> mapList = jt.queryForList(sql);
        //4、打印输出影响行数
        for (Map<String, Object> stringObjectMap : mapList) {
            System.out.println(stringObjectMap);
        }
    }

    /**
     * 六、查询所有的记录,将查询的结果集封装为Emp对象,再把对象装进List集合中
     */
    @Test
    public void test06() {
        //2、定义SQL语句
        String sql = "select * from emp";
        //3、执行SQL语句
        List<emp> queryList = jt.query(sql, new BeanPropertyRowMapper<emp>(emp.class));//参数1:sql语句;参数2:RowMapper接口实现类      【List装着一个个emp对象】
        //4、遍历输出
        for (emp emp : queryList) {
            System.out.println(emp);
        }
        //emp类需要把成员遍历的类型修改成包装类。因为如果时基本数据类型,表中的属性null时,就会报错,基本数据类型不能等于null
        //BeanPropertyRowMapper实现类底层实现了繁琐的Statament对象获取和赋值表中数据操作,返回的对象装进List集合
    }
    /**
     * 七、记录总行数
     */
    @Test
    public void test07() {
        //2、定义SQL语句
        String sql = "select count(id) from emp";
        //3、执行SQL语句
        Long aLong = jt.queryForObject(sql, Long.class);        //queryForObject()返回Long类型;参数2:返回类型的.class
        //4、打印输出
        System.out.println(aLong);  //14
      
    }
}

  • BeanPropertyRowMapper名称上也能够看出来,它是用来映射Java对象的属性和MySQL表的字段名称的。但是,在映射的过程中,如果不注意Java对象的属性名的规范,很可能就得不到我们想要的结果。【查询的字段(列名)的值抽取出来,跟JavaBean对象的属性进行自动封装。(注意是属性,不是成员变量)】
  • BeanPropertyRowMapper<xx>(xx.class)中的xx是你要向封装成的对象类型。
    emp类
    在这里插入图片描述

第六步: 前提:emp表中的数据看成emp表

发布了65 篇原创文章 · 获赞 1 · 访问量 1479

猜你喜欢

转载自blog.csdn.net/weixin_45097731/article/details/104566812