【Java基础】JDBC连接池

一、 数据库连接池: (用空间换时间)

1) 概念: 一个容器,存放数据库连接的容器;

当系统初始化好时,容器被创建,容器会申请一些连接对象;当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器;
构造方法— 初始化 new Person()作用:—创建对象/堆内存开辟空间/初始化对象/返回地址值

2) 好处: 节约资源/用户访问高效

3) 规范:

  1. 用池子管理连接,可以重复利用
  2. 不是自己创建连接,是通过池子获取连接
  3. 使用完之后,调用连接的close()方法归还连接;(不是关闭)
  4. 连接池的技术可以完成连接的再次使用

4) 实现:

标准接口:DataSource   javax.sql包下 
方法: 	
获取连接:getConnection() 	
归还连接:close()
连接对象是从连接池中获取的,则调用colse()就是归还连接,不是关闭;

二、 常用连接池技术: dbcp…

1) C3P0:操作简单

步骤: 
	1.	先导包:C3P0的两个包 和 数据驱动包
    2.	定义配置文件:c3p0.properties/c3p0-config.xml放入src文件下
	    配置文件里面有两个配置: (一般选择默认)
	    	默认配置:创建对象时不传配置名,则选择默认配置;
	    	命名配置:创建连接池对象时需要传入指定配置名(otherc3p0);
	    配置文件参数说明:<见下图>

    3.	创建连接池对象 (用父类DataSource接收)
	    DataSource ds = new ComboPooledDataSource(“c3p0-config.xml”);
    4.	通过连接池对象获取连接
 	   Connection conn = ds.getConnection();
    5.	归还连接
 	   conn.close();
    	注意:
		    1. C3P0会自动加载配置文件,配置文件名不可写错;
		    2. 配置文件一定要放在src文件路径下;

C3P0配置文件参数说明

2) Druid:阿里巴巴提供,功能强大,性能好;

步骤:
    1.	导入jar包
    2.	定义配置文件: (文件名: druid.properties)
	    特点:
		    是properties形式的
		    可以叫任意名称,放在任意目录下; ---因为不会自动加载配置文件
	3.	加载配置文件  (一般后三步合在一起写更好)
	    Properties pro = new Properties()
	    ClassLoader cl = 类名.class.getClassLoader
	    InputStream is = cl.getResourceAsStream(“配置文件名”);
	    pro.load(is);
    4.	获取数据库连接池对象:
   		DataSource ds = DruidDataSourceFactory.createDataSource(pro);
    5.	获取连接 (ds.getConnection())
   		注意:druid的配置文件名称没有规定,但是里面的属性key值要一致;

三、 Druid连接池定义工具类

目的:连接池比连接更站资源,为了让程序运行时,只创建一个连接池对象;

步骤:

//1.定义一个类JDBCUtils
//2.定义成员变量: DataSource 
private static DataSource ds;
//3.定义一个静态代码块,实现加载配置文件;
static{
	try{
		Properties pro = new Properties();
		InputStream is = JDBCUtils.class.getClassLoader.getResourceAsStream(“配置文件名”);
	/*为了降低耦合性,可以用线程的方法来获取类加载器
	用Thread.currentThread().getContextClassLoader() 
	代替类名.class.getClassLoader*/
		pro.load(is)
		ds = DruidDataSourceFactory.createDataSource();
	}catch(IOExcrption e){
		e.printStackTrace();
	}catch(Exception e){
		e.printStackTrace();
	}
}
//4.定义获取连接和获取连接池的方法;
	//定义获取连接池的方法
public static DataSource getDataSource(){
	return ds;  
}
    //定义获取连接的方法
public static Connection getConnection() throws SQLException {
	return  ds.getConnection();
}
//5.	定义释放资源的方法
[见上一篇文章](https://blog.csdn.net/weixin_43773867/article/details/86440161)

四、 Spring JDBC

1) 概述:

  • Spring框架对JDBC的简单封装,提供了JDBCTemplate对象简化JDBC的开发;

2) 步骤:

1. 导入jar包 (5个)

2. 创建JDBCTemplate对象,依赖于数据源DataSource —需要传参

JDBCTemplate Template = new JDBCTemplate(ds);

3. 使用JDBCTemplate的方法完成CRUD的操作:

1)	update(String sql,Object...args):执行DML语句.增删改
    可变参数,为prepareStatement的?赋值,如果参数则不写;
2)	query():查询结果封装为JavaBean对象
    注意:参数为RowMapper接口,需要实现RowMapper接口才可以使用; 
[实现方式一: 匿名内部类:] —很麻烦,可以直接用已有的实现类
eg://查询所有记录,封装为Phone对象;
List<Phone> list = template.query("SELECT * FROM phone", new RowMapper<Phone>() {
	  @Override
	  public Phone mapRow(ResultSet rs, int i) throws SQLException {
	         Phone p = new Phone();
	         p.setId(rs.getInt("id"));
	         p.setBrand(rs.getString("brand"));
	         p.setPrice(rs.getInt("price"));
	         return p;
 	  }
});
[实现方式二:使用具体的实现类] — 常用方式
//BeanPropertyRowMapper 完成JavaBean的自动封装 
/*格式: 重点 ---template.query(sql,new BeanPropertyRowMapper<类型>(类型.class)) */
//eg:查询所有记录,封装为Phone对象;
List<Phone> list = template.query("SELECT * FROM phone", new BeanPropertyRowMapper<Phone>(Phone.class));

3) queryForMap():查询结果将结果集封装为map集合

  • 注意:
    1. 查询结果集的长度为1,只可以封装一条记录;
    2. 将列名当做key,将值当做value,
//eg: 查询id为1的记录,将其封装为Map集合
Map<String, Object> map = template.queryForMap("SELECT * FROM phone WHERE id = ?", 1);

4) queryForList(): 查询结果将结果集封装为list集合

  • 注意: 将每条记录封装为一个map集合,再装载到list集合;
//eg:查询所有记录,封装到
List<Map<String, Object>> list = template.queryForList("SELECT * FROM phone");

5) queryForObject():查询结果封装为对象;

  • 注意: 一般用来聚合函数的查询
//eg:查询总记录数
Long sum = template.queryForObject("select count(id) from phone", Long.class);//  --- 查询的结果为long类型

五、 反射复习:

之前的文章

概念:反向获取
	在运行的时候,可以获取/调用任何一个类的所有方法和属性
应用:
	一些通用性比较高的代码,框架,大部分使用反射来实现的;
	在框架中都是基于配置文件开发,在配置文件配置了类的全类名,在运行的时候,
	可以通过反射得到类的所有的内容,就可以让类中的某个方式执行, 
	className = com.itheima.student
类的所有内容:  属性,无参/有参构造方法,成员方法;

六、 BeanUtils 工具类:

  • 用来简化对JavaBean的操作;
//方法:设置和获取
	static void setProperty(Object bean, String name, Object value):
	/*封装属性值到java中
	参数:
	bean:javaBean对象
	name:属性的名称
	value:属性的值*/;
	//eg: 创建一个javaBean对象
	Student s = new Student();
	//给javaBean对象里面的name属性赋值
	BeanUtils.setProperty(s,"name","张三");
	static String getProperty(Object bean, String name):
	//获取javaBean里面属性的值
	//eg: 获取javabean对象里面的name属性的值
	String name = BeanUtils.getProperty(s, "name");	
//重点方法:
	static void populate(Object bean, Map properties): 
	//把map集合中的数据映射到java对象里面
 	//eg:批量为对象的属性赋值 
	HashMap<String,Object> hs = new HashMap<>(); //创建map集合
	hs.put("name","王五");//向map集合中添加数据
	hs.put("age",80); //key:属性名 value:属性值
	BeanUtils.populate(s,hs);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值