JDBC连接池&JDBCTemplate

1 JDBC连接池

1.1 概念和实现

  • 概念

    就是 一个装有Connection对象的容器,需要连接对象的时候就从容器中获取,使用完毕之后自动归还。

  • 实现

1、所有的连接池对象都必须实现DataSource接口。
2、所有连接池都有获取连接的方法:getConnection();而且调用从连接池获取连接的close()方法
不是关闭连接,而是归还连接。

1.2 c3p0连接池

  • 使用步骤
1、导入开发jar包:c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar,不要忘了mysql驱动jar包。
2、创建src目录下配置文件:c3p0.properties或者c3p0-config.xml
3、创建连接池对象
4、获取连接
  • 注意事项
1、配置文件必须放在src目录中(类路径下)
2、配置文件的名称必须是:c3p0.properties或者c3p0-config.xml

使用属性文件代替xml文件

# 驱动全类名
c3p0.driverClass=com.mysql.jdbc.Driver
# 连接的url
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/db3
# 用户名
c3p0.user=root
# 密码
c3p0.password=root

# 初始化连接个数
c3p0.initialPoolSize=5
# 最大连接数
c3p0.maxPoolSize=15
# 超时时间
c3p0.checkoutTimeout=3000

1.3 druid连接池

  • 使用步骤
1、导入开发jar包:druid-1.0.9.jar,不要忘了mysql驱动jar包。
2、在src目录下创建配置文件(将资料中的配置文件复制进去即可)druid.properties
3、加载properties属性文件
4、获取连接池对象:DruidDataSourceFactory.createDataSource(Properties pro);
5、获取连接
  • 代码示例
public static void main(String[] args) throws Exception {
  //加载配置文件
  Properties properties=new Properties();
  InputStream is = DruidDataSourceTest.class.getClassLoader().getResourceAsStream("druid.properties");
  properties.load(is);
  //3、获取连接池对象:DruidDataSourceFactory.createDataSource(Properties pro);
  DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
  //4、获取连接
  Connection conn = dataSource.getConnection();
  System.out.println("conn = " + conn);
}
  • 修改JDBCUtils工具类
/*
    目的:封装连接池对象,一个应用程序有一个连接池就够了
    做哪些事:
        1、加载properties配置文件
        2、初始化连接池对象
        3、对外提供一个方法获取连接
        4、对外提供一个方法释放资源
        5、对外提供一个获取连接池对象的方法。
 */
public class JDBCUtils {
    private static DataSource ds;  //ctrl+alt+f
    static {
        //1、加载properties配置文件
        //1.1 创建Properties对象
        Properties properties=new Properties();
        //1.2 调用load方法
        InputStream is = JDBCUtils.class.getClassLoader()
                .getResourceAsStream("druid.properties");
        try {
            properties.load(is);
            // 2、初始化连接池对象
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //3、对外提供一个方法获取连接
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    //5、对外提供一个获取连接池对象的方法。
    public static DataSource getDataSource(){
        return ds;
    }
    //4、对外提供一个方法释放资源
    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();
            }
        }
    }
}

2.JdbcTemplate工具类

2.1 JdbcTemplate执行增、删、改操作

  • JdbcTemplate介绍
    JdbcTemplate是Spring框架给我们提供的一个简化jdbc操作的工具类,封装了增删改查的操作。
  • 实现步骤
前提:导入相关的开发jar包(5个)+mysql驱动jar包(有就不需要了)+连接池jar包(有就不需要了)
1、创建JdbcTemplate对象
2、调用update(String sql,Object... 代替?的参数值 )方法。
  • 代码示例
public class JdbcTemplateDMLTest {
  //1. 修改1号数据的 salary 为 10000
  @Test
  public void testUpdate(){
    //1、创建JdbcTemplate对象
    JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
    //2、调用update(String sql,Object... 代替?的参数值 )方法。
    int count = template.update("update emp set salary=10000 where id=?", 1001);
    System.out.println("count = " + count);
  }
  //2. 添加一条记录
  @Test
  public void testAdd(){
    //1、创建JdbcTemplate对象
    JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
    //2、调用update(String sql,Object... 代替?的参数值 )方法。
    String sql="insert into emp values(null,?,?,?,?,?,?,?)";
    int count = template.update(sql, "杨锌怒", 3, 1006, "2000-12-17", 20000, null, 30);
    System.out.println("count = " + count);
  }

  //3. 删除刚才添加的记录
  @Test
  public void testDelete(){
    //1、创建JdbcTemplate对象
    JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
    // 2、调用update(String sql,Object... 代替?的参数值 )方法。
    int count = template.update("delete from emp where id=?", 1015);
    System.out.println("count = " + count);
  }
}

2.2 JdbcTemplate执行查询操作

  • 实现步骤
前提:导入相关的开发jar包(5个)+mysql驱动jar包(有就不需要了)+连接池jar包(有就不需要了)
1、创建JdbcTemplate对象
2、调用query()或者queryForObject()方法
  • 查询多条数据–多行多列,封装成自定义java对象
//6. 查询所有记录,将其封装为Emp对象的List集合 重点
@Test
public void test4(){
  //1、创建JdbcTemplate对象
  JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
  //2 调用query方法
  List<Emp> list = template.query("select * from emp", new BeanPropertyRowMapper<Emp>(Emp.class));
  for (Emp emp : list) {
    System.out.println(emp);
  }
}
  • 查询一条数据–单行多列,封装成一个自定义的java对象,异常要try…catch
//8. 查询id为1001的记录,将其封装为Emp集合  重点
@Test
public void test6(){
  //1、创建JdbcTemplate对象
  JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
  //2、调用queryForObject
  Emp emp = null;
  try {
    emp = template.queryForObject("select * from emp where id=?",new BeanPropertyRowMapper<Emp>(Emp.class), 1001);
  } catch (DataAccessException e) {
    e.printStackTrace();
  }
  System.out.println(emp);
}
  • 查询多条数据–多行单列,指定要存入的集合的泛型类型
//9 查询每一个用户的姓名,多行单例 结果肯定是list集合
@Test
public void test7(){
  //1、创建JdbcTemplate对象
  JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
  //2 调用
  List<String> list = template.queryForList("select ename from emp", String.class);
  for (String s : list) {
    System.out.println(s);
  }
}
  • 查询一条数据–单行单列,这个值是什么类型就是用什么类型的Class来封装
//7. 查询总记录数 select count(*) from emp;  单行单列 14
@Test
public void test5(){
  //1、创建JdbcTemplate对象
  JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
  //2、调用queryForObject()
  Integer count = template.queryForObject("select count(*) from emp", Integer.class);
  System.out.println(count);
}

总结

1、连接池
	共讲解了c3p0和druid两个连接池,这两个连接池的使用都需要配置文件。
	核心:将druid连接池封装到JDBCUtils工具类中。
	public class JDBCUtils{  //重点
		private static DataSource ds;
    static{
      //加载配置文件
      //1 创建Properties对象
      Properties properties=new Properties();
      //2 调用load方法加载配置文件
      InputStream is
  =JDBCUtils.class.getClassLoader().getResourcesAsStream("druid.properties");
      properties.load(is)
      //初始化druid连接池对象
      ds=DruidDataSourceFactory.createDataSource(properties);
    }
    //5、对外提供一个获取连接池对象的方法。
    public static DataSource getDataSource(){
      return ds;
    }
	}
2、JdbcTemplate工具类
	增删改思路:
		1 创建JdbcTemplate对象,需要传递连接池对象。
			JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
		2 调用update(String sql,Object... args)方法
			int count=template.update("delete from account where id=?",1);	
	查询:
		1 创建JdbcTemplate对象,需要传递连接池对象。
			JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
		2 调用query(String sql,RowMapper<T> rowMapper,Object... args)或者queryForObject(String sql,RowMapper<T> rowMapper,Object... args)方法。
		重点是多列需要使用自定义Java对象封装。例如:
		List<Emp> list = template.query("select * from emp", new BeanPropertyRowMapper<Emp>(Emp.class));
		emp = template.queryForObject("select * from emp where id=?",new BeanPropertyRowMapper<Emp>(Emp.class), 1001);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值