## 数据库链接池
1、概念:其实就是一个容器(集合),存放数据库链接的容器
当系统初始化好后,容器被创建,容器中会申请一些链接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
2、好处:1.节约资源 2.用户访问高效
3、实现:
1.标准接口:DataSource javax.sql包下的
1.方法:
*获取连接:getConnection()
*归还链接:Connection.close()。如果链接对象Connection是从链接池中获取的,那么调用Connection.close()方法,则不会在关闭链接了,而是归还链接
2.一般我们不去实现他,有数据库厂商来实现
1.C3P0:数据库链接池技术
2.Druid:数据库连接池实现技术,有阿里巴巴提供
4.C3P0:数据库链接池技术
*步骤:
1.导入jar包(两个)和数据库驱动jar包
2.定义配置文件:
*名称:c3p0.properties 或者 c3p0-config.xml
*路径:直接将文件放在src目录下即可
3.创建核心对象 数据库链接池对象 ComboPooledDataSource
4.获取链接: getConnection
public static void main(String[] args) throws SQLException {
//1.创建数据库链接池对象
DataSource ds =new ComboPooledDataSource();
//2.获取链接对象
Connection conn = ds.getConnection();
//3.打印
System.out.println(conn);
}
5.Druid:数据库连接池实现技术,有阿里巴巴提供的
*步骤;
1.导入jar包
2.定义配置文件:
*是properties形式的
*可以叫任意名称,可以放在任意目录下
3.加载配置文件。properties
4.获取数据库链接池对象:通过工厂来获取 DruidDataSourceFactory
5.获取链接:getConnection
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro =new Properties();
InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取链接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取链接
Connection coon = ds.getConnection();
System.out.println(coon);
}
## Spring JDBC
*Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
*步骤:
1.导入jar包
2.创建jdbcTemplate对象。依赖于数据源DataSource
*JdbcTemplate template = new JdbcTemlate(ds);
3.调用jdbcTemplate的方法来完成CRUD的操作
*update() :执行DML语句。增、删、改语句
*queryForMap():查询结果将结果集封装到map集合
*注意:这个方法查询的结果集长度只能是1
*queryForList():查询结果将结果集封装为list集合
*注意:将每一条记录封装为一个Map集合,在将Map集合装在到List集合中
*query():查询结果,将结果封装为JavaBean对象
*query的参数:RowMapper
*一般我们使用BeanPropertyRowMapper实现类。可以完成数据到 v JavaBean的自动封装
*new BeanPropertyRowMapper<类型>(类型。class)
*queryForObject :查询结果,将结果封装为对象
*一般用于聚合函数的查询
//1。获取JDBCTemplate对象
JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDs());
@Test
public void test1(){
//定义sql语句
String sql = "update student set sex='女' where id = 1";
//执行sql
int update = template.update(sql);
System.out.println(update);
}
@Test
public void test2(){
String sql ="insert into student(id,name,address) values(?,?,?)";
int update = template.update(sql,7,"派克","比尔吉沃特" );
System.out.println(update);
}
@Test
public void test3(){
String sql ="delete from student where id = ?";
int update = template.update(sql, 7);
System.out.println(update);
}
/*
* 4.查询id为2的记录,将其封装为Map集合
* 注意:这个方法查询的结果集长度只能是1
* */
@Test
public void test4(){
String sql ="select * from student where id = ?";
Map<String,Object> map = template.queryForMap(sql,2);
System.out.println(map);
}
/*
* 查询所有记录,将其封装为List
* */
@Test
public void test5(){
String sql = "select * from student";
List<Map<String, Object>> maps = template.queryForList(sql);
for (Map<String, Object> map : maps) {
System.out.println(map);
}
}
/*
* 查询所有记录,将其封装为Emp对象的List集合
* */
@Test
public void test6(){
String sql ="select * from student";
List<Student> list =template.query(sql,new BeanPropertyRowMapper<Student>(Student.class));
for (Student student : list) {
System.out.println(student);
}
}
/*
* 查询总记录数
* */
@Test
public void test7(){
String sql = "select count(id) from student";
Long aLong = template.queryForObject(sql, long.class);
System.out.println(aLong);
}