JavaWeb学习笔记02:JDBC连接池&Template

1、数据库连接池
  • 之前每次做依次数据库操作时,都需要建立数据库连接,而这种操作是向底层申请资源,非常耗时。
    -> 解决方法:数据库连接池技术 -> 解决性能低、资源浪费的情况。
  • 用户访问数据库,从容器(池子,数据库连接池)拿数据库连接
  • 概念:其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
  • 好处:节约资源,用户访问高效
  • 实现:
    • 标准结构:DataSource javax.sql包下的
      • 方法:
        • 获取连接:getConnection()
        • 归还连接:如果连接对象Connection()是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接。
    • 一般我们不去实现它,由数据库厂商来实现(开源的数据库连接池)
      • C3P0:数据库连接池技术
      • Druid:数据库连接池技术,由阿里巴巴提供
2、C3P0:数据库连接池技术
  • 步骤
    • 导入jar包 c3p0-0.9.5.2.jar mchange-commins-java-0.2.12.jar(依赖jar包),以及数据库的驱动jar包
    • 定义配置文件:
      • 名称:c3p0.properties 或 c3p0.config.xml
      • 路径:需要放在项目的内路径中,直接将文件放置再src目录下即可
    • 创建核心对象 数据库连接池对象 ComboPooledDataSource
    • 获取连接 getConnection()
3、Druid:数据库连接池技术
  • 步骤:
    • 导入jar包 druid-1.0.9.jar
    • 定义配置文件:
      • 特点:是properties形式的;可以叫任意名称,可以放在任意目录下,即 需要手动加载进来
    • 加载配置文件
    • 获取数据库连接池对象(数据源resource):通过工厂来获取DruidDataResourceFactory
    • 获取连接:getConnection()
  • 代码示例:
public class druid_demo1{
	public static void main(String[] args) throws Exception {
		// 1.导入jar包
		// 2.定义配置文件
		Properties pro = new Poperties();
		InputStream is = druid_demo1.class.getClassLoader().getResourceAsStream("druid.properties");
		// 3.加载配置文件
		pro.load(is);

		// 4.获取连接池对象
		DataSource ds = DruidDataSourceFactory.createDataSource(pro);
		// 5.获取连接
		Connection conn = ds.getConnection();
	}
}
4、定义工具类 JDBCUtils
  • 步骤:

    • 定义一个类 JDBCUtils
    • 提供静态代码块加载配置文件,初始化连接池对象
    • 提供方法
      • 获取连接方法:通过数据库连接池获取连接
      • 释放资源
      • 获取连接池的方法
  • 代码示例

public class JDBCUtils {
	// 定义成员变量 DataSource
	private static DataSource ds;
	
	static{
		try{
			// 加载配置文件
			Properties pro = new Properties();
			pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
			ds = DruidDataSourceFactory.createDataSource(pro);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 获取连接
	public static Connection getConnection() throws SQLException {
		return ds.getConnection();
	}

	// 释放资源
	public static void close(ResultSet res, Statement stat, Connection conn){
		if (res != null) {
			try{
				res.close();
			} catch (SQLException e){
				e.printStackTrace();
			}
		}
		if (stat != null ) {
			try {
				stat.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try{
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	// 重写close()函数
	public static void close(Statement stat, Connection conn) {
		close(null, statc, conn);
	}

	// 获取连接池的方法
	public static DataSource getDataSource(){
		return ds;
	}
}
5、Spring JDBC:JDBCTemplate
  • 作用:简化JDBC编程
  • Spring框架提供的对JDBC的简单封装,提供了JDBCTemplate对象简化JDBC的开发
  • 步骤:
    • 导入jar包
    • 创建JDBCTemplate对象,依赖于数据库DataSource
      jdbcTemplate template = new JdbcTemplate(ds);
    • 调用JdbcTemplate的方法来完成CRUD操作(增删改查):
      • update():执行DML语句:增删改语句
      • queryForMap():查询结果将结果集封装成map集合。
        注意:查询的结果集长度只能是1,将列名作为key,将值作为value,将这条记录封装为一个map集合
      • queryForList():查询结果将结果集封装为list集合
        注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
      • query():查询结果,将结果封装为JavaBean对象
        注意:JavaBean最好不要用基本类型,用引用类型比较好,不然null赋值会报错。
        参数:RowMapper 一般我们使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装
        List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
        new BeanPropertyRowMapper<类型>(类型.class)
        类型.class 类型的字节码对象
      • queryForObject():查询结果,将结果封装为对象。多用于语句中的聚合函数
  • 示例代码:
public class JDBCTemplate_demo{
	public static void main(String[] args) {
		// 1.导入jar包
		// 2.创建JDBCTemplate对象
		JdbcTempalte template = new JdbcTemplate(JDBCUtils.getDataSource());
		// 3.调用方法
		String sql = "update db_user set balance = 5000 where id = ? ";
		int count = template.update(sql, 4);
		System.out.println(count);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值