- 数据库连接池
1. 数据库连接池,存放Connection对象的容器
当系统初始化好后,容器被创建,容器中申请一些连接对象,用户当需要访问数据库时,先从容器中获取连接对象
使用完成后,归还连接对象
2. 实现:
a. 标准接口:javax.sql.DataSource
b. 方法:
1. 获取连接:getConnection()
2. 归还连接:
如果连接对象Connection对象是从连接池获取的,此时调用成员方法close必不会关闭连接
而是将连接对象归还给数据库连接池
c. 有数据库厂商实现:
1. C3P0:较为就的数据库连接池技术
2. Druid:有阿里巴巴提供的较新的数据库连接池技术
3. C3P0:数据库连接池技术
a. 使用步骤:
1. 导入jar包(两个):
c3p0-0.9.5.2.jar和c3p0依赖的mchange-commons-java-0.2.12.jar
2. 创建配置文件:<会自动加载下面个命名的配置文件>
仅使用以下名称
c3p0.properties或c3p0-config.xml
3. 创建数据库连接池对象:ComboPooledDataSource
4. 获取连接对象,调用getConnection方法
4. Druid:数据连接池技术:
a. 使用步骤:
1. 导入jar包:
druid-1.0.9.jar
2. 创建配置文件:
使用properties文件类型作为配置文件,可以自定义文件名,自定义文件路径
使用时需要自己加载配置文件
一些常用的额外配置:
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
3. 创建数据库连接池对象:
通过工厂来创建数据库连接池对象:DruidDataSourceFactory
4. 获取连接对象:调用getConnection方法
5. Spring JDBC:
a. Spring框架对JDBC的简单封装
提过了一个JDBCTemplate对象简化JDBC的开发
b. 使用步骤:
1. 导包:
commons-logging-1.2.jar
spring-beans-5.0.0.RELEASE.jar
spring-core-5.0.0.RELEASE.jar
spring-jdbc-5.0.0.RELEASE.jar
spring-tx-5.0.0.RELEASE.jar
2. 创建JDBCTemplate对象:
需要传入DataSource对象作为参数来创建
JDBCTemplate template = new JDBCTemplate(DataSource ds);
3. 调用JDBCTemplate成员方法进行CRUD操作
1. update():执行DML语句
2. queryForMap():查询结果将结果集封装为map集合
注意:
1. 列名为key,数据为value
2. 查询的结果集只能是1行,这样才能封装为一个map集合
3. queryForList():查询结果将结果集封装为list集合
注意:
1. 可以封装为map对象后装在list对象中
List<Map<String,Object>> list = template.queryForList(sql);
4. query():查询结果将结果集封装为JavaBean对象
注意:
1. 封装为JavaBean对象需要实现RowMapper结构表明封装的时什么类型对象
List<Emp> list = template.query(sql,new RowMapper<Emp>(){
@Override
public Emp mapRow(Result rst, int i) throws SQLException{
Emp emp = new Emp();
Xxx xx = rst.getXxx();
emp.setXxx(xx);
return emp;
}
})
2. 使用BeanPropertyRowMapper对象来简化操作:
BeanPropertyRowMapper实现了RowMapper接口
list<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));
* 如果表中有数据项为NULL值,在Emp类的定义中应该使用包装类对象作为数据类型
否则基本数据类型接收NULL将会出现错误
5. queryForObject():查询结果将结果集封装为对象
一般用来执行一些聚合函数
例如:
String sql = "select count(id) from emp";
Long total = template.queryForObject(sql,Long.class);
sout(total);
- 对于多个成员方法完成多个功能的类的书写,我们可以使用测试类的书写方式,使用Junit方式<添加@Test注解>,每个功能单独执行测试