所需jar包

C3P0

c3p0-0.9.5.2.jar
mchange-commons-java-0.2.12.jar

Druid

druid-1.0.9.jar

切记: mysql8.0 需要添加 cj Maven工程需要将配置文件放入resource,类加载器前加 /


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

当系统初始化好后,容器被创建,容器中会申请一些连接对象。

当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

好处:

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

实现:

  1. 标准接口:DataSource javax.sql包下的
    • 方法:
      • 获取连接:getConnection()
      • 归还连接:Connection.close()
        • 对象从连接池中获取,调用Connection.close()方法,不会再关闭连接,而是归还连接。
  2. 一般我们不去实现它,有数据库厂商来实现
    • C3P0:数据库连接池技术
    • Druid:数据库连接池实现技术,由阿里巴巴提供的

C3P0:数据库连接池技术

步骤:

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

    • 不要忘记导入数据库驱动jar包
    1. 定义配置文件:
    • 名称: c3p0.properties 或者 c3p0-config.xml
    • 路径:直接将文件放在src目录下即可。
    1. 创建核心对象 数据库连接池对象 ComboPooledDataSource
    2. 获取连接: getConnection
    • 代码:

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

c3p0-config.xml 配置

  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">root</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/db3</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>

c3p0 的连接演示

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

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

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

步骤:

  1. 导入jar包 druid-1.0.9.jar
  2. 定义配置文件:

    • properties形式的
    • 可以叫任意名称,可以放在任意目录下
  3. 加载配置文件 Properties

  4. 获取数据库连接池对象

    • 通过工厂来来获取 DruidDataSourceFactory
  5. 获取连接:getConnection 代码: //1.加载配置文件 Properties pro = new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream(“druid.properties”); pro.load(is); //2.获取连接池对象 DataSource ds = DruidDataSourceFactory.createDataSource(pro); //3.获取连接 Connection conn = ds.getConnection();

Druid 的 Properties 配置

  1. driverClassName=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/db4
  3. username=root
  4. password=root
  5. # 初始化连接数量
  6. initialSize=5
  7. # 最大连接数
  8. maxActive=10
  9. # 最大等待时间
  10. maxWait=3000


Druid 的连接演示

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

Druid 的工具类JDBCUtils

  1. //Druid连接池的工具类
  2. public class JDBCUtils {
  3. //1.定义成员变量 DataSource
  4. private static DataSource ds ;
  5. static{
  6. try {
  7. //1.加载配置文件
  8. Properties pro = new Properties();
  9. pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
  10. //2.获取DataSource
  11. ds = DruidDataSourceFactory.createDataSource(pro);
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. /**
  19. * 获取连接
  20. */
  21. public static Connection getConnection() throws SQLException {
  22. return ds.getConnection();
  23. }
  24. /**
  25. * 释放资源
  26. */
  27. public static void close(ResultSet rs , Statement stmt, Connection conn){
  28. if(rs != null){
  29. try {
  30. rs.close();
  31. } catch (SQLException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. if(stmt != null){
  36. try {
  37. stmt.close();
  38. } catch (SQLException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. if(conn != null){
  43. try {
  44. conn.close();//归还连接
  45. } catch (SQLException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. }
  50. public static void close(Statement stmt,Connection conn){
  51. close(null,stmt,conn);
  52. }
  53. /**
  54. * 获取连接池方法
  55. */
  56. public static DataSource getDataSource(){
  57. return ds;
  58. }
  59. }

Druid 利用工具类JDBCUtils的操作演示

  1. public class DruidDemo {
  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.执行sql
  19. int count = pstmt.executeUpdate();
  20. System.out.println(count);
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. }finally {
  24. //6. 释放资源
  25. JDBCUtils.close(pstmt,conn);
  26. }
  27. }
  28. }

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
        - 查询结果,将结果封装为对象
           - 一般用于聚合函数的查询

Spring JDBC 利用工具类JDBCUtils的连接演示

public class JdbcTemplateDemo {
    public static void main(String[] args) {
        //1.导入jar包
        //2.创建JDBCTemplate对象
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
        //3.调用方法
        String sql = "update account set balance = 5000 where id = ?";
        int count = template.update(sql, 3);
        System.out.println(count);
    }
}
 JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 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_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);
}