一、 数据库连接池: (用空间换时间)
1) 概念: 一个容器,存放数据库连接的容器;
当系统初始化好时,容器被创建,容器会申请一些连接对象;当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器;
构造方法— 初始化 new Person()作用:—创建对象/堆内存开辟空间/初始化对象/返回地址值
2) 好处: 节约资源/用户访问高效
3) 规范:
- 用池子管理连接,可以重复利用
- 不是自己创建连接,是通过池子获取连接
- 使用完之后,调用连接的close()方法归还连接;(不是关闭)
- 连接池的技术可以完成连接的再次使用
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文件路径下;
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();
}
四、 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);