数据库连接池
- 概念:其实就是一个容器(集合),存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将里阿尼额对象归还给容器
- 好处
- 节约资源
- 用户访问高效
- 实现
- 标准接口:DataSource javax.sql包下的
方法
获取连接:getConnection()
归还连接:Connection.close().如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会在关闭连接了,而是归还连接
- 一般我们不去实现它,而是有数据库厂商来实现
C3P0:数据库连接池即使
Bruid:数据库连接池实现技术,由阿里巴巴提供的
C3P0:数据库连接池技术
- 步骤
- 导入jar包(两个)c3po-0.9.5.2.jar mchange-commons-java-0,2,12,jar,
- 定义配置文件
名称:c3po.properties或者c3po-config.xml
路径:字节将文件放在src目录下即可
- 创建核心对象 数据库连接池对象 CombopooledDataSource
- 获取连接:getConnection
Druid:数据库连接池实现技术
- 步骤
- 导入jar包 druid-1.0.9.jar
- 定义配置文件:是properties形式的,可以叫任意名称,可以放在任意名称下
- 加载配置文件。Properties
- 获取数据库连接池对象:通过工厂来获取DruidDataSourceFactory
- 获取连接getConnection
package C3P0Demo1;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
import java.util.concurrent.Callable;
public class DruidDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5。获取连接
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
spring JDBC
- Spring 框架会JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
- 步骤
- 导入jar包
- 创建jdbcTemplate对象,依赖于数据源DataSource
jdbctemplate template = new JdbcTemplate(ds)
- 调用Jdbctemplate的方法来完成crud的操作
update():执行DML语句,增,删,改语句
queryForMap():查询结果将结果封装为map集合
queryForList():查询轮结果将结果封装为list集合
query():查询结果,将结果封装为javabean对象
querry的参数RowMapper:
一般我们使用 BeanPropertyRowMapper实现类,可以完完成数据到javabean的自动封装
new BeanPropertyRowMapper<类型>(类型.class)
queryforObject:查询结果,将结果封装为对象
练习:
需求:
- 修改1好数据salary为10000
- 添加一天记录
- 删除刚才添加的记录
- 插叙jd为1的巨鹿,将其封装为map集合;//这个方法查询的结果集只能是1,将列名作为key,将值作为calue,封装为map集合
- 查询所有巨鹿,将其封装为list:注意:将每一条记录封装为一个map集合,在将map集合装载到list集合中
- 查询所有记录,将其封装为emp对象的list集合
- 查询总记录数
package Domain;
import JDBCTemplate.JDBCUtils;
import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.Map;
public class jdbctemplatedemo {
//junit单元测试,可以让方法独立执行
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Test
public void test1(){
//或骗取jdbctempalte对象
//2.定义sql
String sql = "update emp set salary = 1000 where id =1001";
//执行sql
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(){//这个方法查询的结果集只能是1,将列名作为key,将值作为calue,封装为map集合
String sql = "select * from emp where id = ? or id =?";
Map<String,Object> map = template.queryForMap(sql,1001,1002);
System.out.println(map );
//{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=1000.00, bounds=null, dept_id=20}
}
@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 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);
}