快速学习JDBC连接池&JDBCTemplate

JDBC连接池

概念

什么是连接池?
连接池就是一个存放数据连接的容器;当系统初始化完毕后;容器被创建;容器中会申请一些连接器对象;当当用户访问数据库是就会从连接池中获取连接池对象;当用户访问完毕后就会将连接器对象归还给连接池

用连接池有什么好处?
首先是可以节约资源;其次是可以令用户高效访问

连接池该如何实现?
在javax.sql包下有一个DataSoure接口;该接口就称为连接池;可以使用该接口获取连接getConnection()
也可以归还连接Connection.close()
另外如果连接对象是从连接池中获取的;那么调用close()时不会关闭连接而是将连接对象归还到连接池

一般是由数据库厂商来实现的;而我们只需要使用他们实现的技术

  1. c3p0:数据库连接池技术
  2. Druid:由阿里巴巴提供的数据库连接池技术
c3p0:数据库连接池技术
  1. 首先要导入两个jar包;c3p0-0.9.5.2.jarmchange-commons-java-0.2.12.jar
    第二个jar包是第一个jar包的依赖;提取码:v0pw
    在项目结构中可以添加jar包
    在这里插入图片描述

  2. 然后我们需要定义配置文件;配置文件的名称c3p0.properties 或者 c3p0-config.xml
    提供了第二种的配置文件;路径就放在src目录下即可;提取码:v0pw
    需要对配置文件进行修改
    在这里插入图片描述

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

  4. 获取连接

import com.mchange.v2.c3p0.ComboPooledDataSource;

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

public class jdbc_1 {
    public static void main(String[] args) throws SQLException {
        DataSource ds = new ComboPooledDataSource();    //创建数据库连接池对象
        Connection connection = ds.getConnection(); //获取连接对象
        System.out.println(connection);
    }
}

运行结果:
在这里插入图片描述
有了连接对象就可以对数据库进行一系列操作了

Durid:数据库连接池技术
  1. 首先导入jar包 :druid-1.0.9.jar
    提取码:8q10
    在这里插入图片描述

  2. 然后定义properties形式的配置文件;命名可以自定义当然还是要修改里面的参数
    在这里插入图片描述

  3. 加载配置文件

  4. 通过DruidDataSourceFactory获取数据库连接对象

  5. 有了连接池就可以获取连接对象了

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class jdbc_3 {
    public static void main(String[] args) throws Exception {
    	//加载配置文件
        Properties properties = new Properties();   //创建properties类对象
        InputStream resourceAsStream = jdbc_3.class.getClassLoader().getResourceAsStream("druid.properties");   
        properties.load(resourceAsStream);
        //获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);    //获取连接池对象
        //获取连接对象
        Connection connection = dataSource.getConnection(); //获取连接
        System.out.println(connection);	//输出查看该连接对象
    }
}
基于Druid来定义工具类

为什么要定义工具类?
由于存在大量固定代码;那么就可以创建JDBCUtils类来将代码进行简化
代码如下:(可以看注释)

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {    //连接池工具类

    private static DataSource dataSource;	//一个连接池成员变量

    static {	//未了实现赋值可以使用静态代码块
        try {
        	//加载配置文件
            Properties properties = new Properties();	
            properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //获取连接池对象
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {	//返回一个连接对象的方法
        return dataSource.getConnection(); //返回一个连接对象
    }

    public static void close(Statement statement, Connection connection) {	//释放资源的方法
        close(null, statement, connection);   //由于代码下面的相同;所以可以将结果集设为null从而调用下面的方法
    }

    public static void close(ResultSet resultSet, Statement statement, Connection connection) {	//同上
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static DataSource getDataSource() {	//获取连接池对象
        return dataSource;
    }
}

这样一个工具类就写好了;接下来就可以用到

Spring JDBC

Spring框架可以说是Java的灵魂框架;其中它提供了一个JDBCTemplate对象简化JDBC的开发
如何操作?

  1. 首先同样都是要导入jar包:5个jar包
    提取码:hae6
    在这里插入图片描述
  2. 创建JdbcTemplate对象注意是要依赖于数据源DataSource;也就需要一个连接池对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());    //创建jdbcTemplate
  1. 调用JdbcTemplate的方法来完成CRUD的操作;通常有以下几种方法
方法名说明
update()执行DML语句。增、删、改语句
queryForMap()查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
queryForList()查询结果将结果集封装为list集合
query()查询结果,将结果封装为JavaBean对象
queryForObject查询结果,将结果封装为对象

下面对方法进行演示

//这是需要导入的包

import day_6.util.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 jdbc_6 {
    private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());	//JdbcTemplate对象

//我们可以写各种各样的方法然后可以通过注解@Test来进行测试
//增加一条记录的方法;使用update()

    @Test
    public void test1() {	
        String sql = "insert into emp(id,ename,dept_id) values(?,?,?)";	//预处理语句
        int i = jdbcTemplate.update(sql, 1015, "小红", "10");
        System.out.println(i);  //返回影响行数
    }

//删除一条记录的方法;使用update()

    @Test
    public void test2() {
        String sql = "delete from emp where id =?";	//预处理语句
        int i = jdbcTemplate.update(sql, 1015);
        System.out.println(i);  //返回影响行数
    }

//修改一条记录的方法;使用update()

    @Test
    public void test3() {
        String sql = "update emp set salary = ? where id = ? ";//预处理语句
        int i = jdbcTemplate.update(sql, 10000, 1001);
        System.out.println(i);  //返回影响行数
    }

//查询id为1001的记录,将其封装为Map集合;使用queryForMap()
需要注意的是:这个方法查询的结果集长度只能是1;也就是正能有一条记录;多了就会出错

    @Test
    public void test4() {
        String sql = "select * from emp where id =?";
        Map<String, Object> map = jdbcTemplate.queryForMap(sql, 1001);
        System.out.println(map);  //查看记录
    }

//查询所有记录,将其封装为List;使用queryForList()
需要注意的是:这个方法是将每一条记录先装到Map集合中然后再添加到List集合

    @Test
    public void test5() {
        String sql = "select * from emp";
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
        System.out.println(maps);  //查看所有记录
    }

//查询所有记录,将其封装为Emp对象的List集合;使用query()
查询结果是将结果封装为JavaBean对象;

query的参数:RowMapper

  • 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
  • new BeanPropertyRowMapper<类型>(类型.class)
    @Test
    public void test6() {   //将每条封装成emp对象
        String sql = "select * from emp";
        List<Emp> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
        for (Emp emp :
                list) {
            System.out.println(emp);
        }
    }

//查询总记录数;使用queryForObject();一般用于聚合函数的查询

    @Test
    public void test8() {    //查询所有记录
        String sql = "select count(id) from emp";
        Long total = jdbcTemplate.queryForObject(sql, long.class);
        System.out.println(total);
    }
}

CET4P250

  1. cafeteria
  2. norm
  3. cereal
  4. bypass
  5. alley
  6. aisle
  7. juicy
  8. badge
  9. habitat
  10. deteriorate
  11. discriminate
  12. chore
  13. facrual
  14. pastime
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值