一、数据库连接池
1. 概念
其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
2. 好处
节约资源用户访问高效
3. 实现
标准接口:DataSource javax.sql包下
方法
获取连接:getConnection()归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接 一般我们不去实现它,有数据库厂商来实现
C3P0:数据库连接池技术Druid:数据库连接池实现技术,由阿里巴巴提供
4. C3P0:数据库连接池技术
4.1 步骤
导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar , 不要忘记导入数据库驱动jar包定义配置文件: 名称: c3p0.properties 或者 c3p0-config.xml 路径:直接将文件放在src目录下即可。创建核心对象 数据库连接池对象 ComboPooledDataSource获取连接: getConnection
4.2 代码
DataSource ds
= new ComboPooledDataSource();
Connection conn
= ds
.getConnection();
5. Druid
数据库连接池实现技术,由阿里巴巴提供
5.1 步骤
导入jar包 druid-1.0.9.jar定义配置文件: 是properties形式的 可以叫任意名称,可以放在任意目录下加载配置文件。Properties获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory获取连接:getConnection
5.2 代码
Properties pro
= new Properties();
InputStream is
= DruidDemo
.class.getClassLoader().getResourceAsStream("druid.properties");
pro
.load(is
);
DataSource ds
= DruidDataSourceFactory
.createDataSource(pro
);
Connection conn
= ds
.getConnection();
5.3 定义工具类
定义一个类 JDBCUtils提供静态代码块加载配置文件,初始化连接池对象提供方法:
获取连接方法:通过数据库连接池获取连接释放资源获取连接池的方法
5.4 代码
public class JDBCUtils {
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(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();
}
}
}
public static DataSource
getDataSource(){
return ds
;
}
}
二、Spring JDBC
Spring框架对JDBC的简单封装提供了一个JDBCTemplate对象简化JDBC的开发
1. 导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource
JdbcTemplate template
= new JdbcTemplate(ds
);
3. 调用JdbcTemplate的方法来完成CRUD的操作
* update():执行DML语句。增、删、改语句
* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
* 注意:这个方法查询的结果集长度只能是1
* queryForList():查询结果将结果集封装为list集合
* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
* query():查询结果,将结果封装为JavaBean对象
* query的参数:RowMapper
* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
* new BeanPropertyRowMapper<类型>(类型.class)
* queryForObject:查询结果,将结果封装为对象
* 一般用于聚合函数的查询
4. 练习
4.1 需求:
修改1号数据的 salary 为 10000添加一条记录删除刚才添加的记录查询id为1的记录,将其封装为Map集合查询所有记录,将其封装为List查询所有记录,将其封装为Emp对象的List集合查询总记录数
4.2 代码:
import cn
.itcast
.domain
.Emp
;
import cn
.itcast
.utils
.JDBCUtils
;
import org
.junit
.Test
;
import org
.springframework
.jdbc
.core
.BeanPropertyRowMapper
;
import org
.springframework
.jdbc
.core
.JdbcTemplate
;
import org
.springframework
.jdbc
.core
.RowMapper
;
import java
.sql
.Date
;
import java
.sql
.ResultSet
;
import java
.sql
.SQLException
;
import java
.util
.List
;
import java
.util
.Map
;
public class JdbcTemplateDemo2 {
private JdbcTemplate template
= new JdbcTemplate(JDBCUtils
.getDataSource());
@Test
public void test1(){
String sql
= "update emp set salary = 10000 where id = 1001";
int count
= template
.update(sql
);
System
.out
.println(count
);
}
@Test
public void test2(){
String sql
= "insert into emp(id,ename,dept_id) values(?,?,?)";
int count
= template
.update(sql
, 1015, "郭靖", 10);
System
.out
.println(count
);
}
@Test
public void test3(){
String sql
= "delete from emp where id = ?";
int count
= template
.update(sql
, 1015);
System
.out
.println(count
);
}
@Test
public void test4(){
String sql
= "select * from emp where id = ? or id = ?";
Map
<String, Object> map
= template
.queryForMap(sql
, 1001,1002);
System
.out
.println(map
);
}
@Test
public void test5(){
String sql
= "select * from emp";
List
<Map
<String, Object>> list
= template
.queryForList(sql
);
for (Map
<String, Object> stringObjectMap
: list
) {
System
.out
.println(stringObjectMap
);
}
}
@Test
public void test6(){
String sql
= "select * from emp";
List
<Emp> list
= template
.query(sql
, new RowMapper<Emp>() {
@Override
public Emp
mapRow(ResultSet rs
, int i
) throws SQLException
{
Emp emp
= new Emp();
int id
= rs
.getInt("id");
String ename
= rs
.getString("ename");
int job_id
= rs
.getInt("job_id");
int mgr
= rs
.getInt("mgr");
Date joindate
= rs
.getDate("joindate");
double salary
= rs
.getDouble("salary");
double bonus
= rs
.getDouble("bonus");
int dept_id
= rs
.getInt("dept_id");
emp
.setId(id
);
emp
.setEname(ename
);
emp
.setJob_id(job_id
);
emp
.setMgr(mgr
);
emp
.setJoindate(joindate
);
emp
.setSalary(salary
);
emp
.setBonus(bonus
);
emp
.setDept_id(dept_id
);
return emp
;
}
});
for (Emp emp
: list
) {
System
.out
.println(emp
);
}
}
@Test
public void test6_2(){
String sql
= "select * from emp";
List
<Emp> list
= template
.query(sql
, new BeanPropertyRowMapper<Emp>(Emp
.class));
for (Emp emp
: list
) {
System
.out
.println(emp
);
}
}
@Test
public void test7(){
String sql
= "select count(id) from emp";
Long total
= template
.queryForObject(sql
, Long
.class);
System
.out
.println(total
);
}
}