文章目录
数据库连接池
数据库连接池的概念
连接池的作用,更加效率的连接数据库.
在用户连接数据库时,获得数据库连接池的通道对象
在用户完成操作关闭通道时,这时候通道没有真正的关闭
而是返回数据库连接池,进行重新利用
连接池在连接中释放与使用的规则
- 启动时创建初始化数量的连接
- 当申请的连接达到最小连接数时,创建新的连接
- 当申请的连接达到最大连接数时,让申请进入等待状态
- 当申请进入等待状态超时时,空闲超时释放,获取超时报错
C3P0连接池
C3P0连接池:⼀个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定。
⽬前使⽤它的开源项⽬有Hibernate、 Spring等。
1.导入jar包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
2.定义配置文件
驱动地址,url,数据库账号和密码,初始化连接数,最大最小连接数等
3.定义C3P0Util工具类
在创建对象时调用的是空参构造器(实际使用的是default-config选项)
加载了配置文件
public class C3P0Utils {
private static DataSource dataSource = new ComboPooledDataSource();
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
Durid连接池
Durid连接池:由阿⾥巴巴提供的数据库连接池实现技术,⽀持所有 JDBC 兼容的数据库,包括
Oracle、 MySql等。
1.导入jar包
druid-1.1.16.jar
2.定义配置文件
驱动地址,url,数据库账号和密码,初始化连接数,最大最小连接数等
3.定义DruidUtil工具类
Druid和C3P0不同的是,他使用的是DruidDataSourceFactory来获得datasource
需要传入配置文件.
public class DruidUtils {
private static DataSource dataSource ;
static {
Properties prop = new Properties();
try {
prop.load(DruidUtils.class.getResourceAsStream("druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
DBCP连接池
DBCP连接池:也是⼀个开源的连接池,是Apache Common成员之⼀,也是tomcat内置的连接
池。
1.导入jar包
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
commons-logging-1.2.jar
2.定义配置文件
驱动地址,url,数据库账号和密码,初始化连接数,最大最小连接数等
3.定义DBCPUtil工具类
和Druid数据源类似,所以配置文件也相似
public class DruidUtils {
private static DataSource dataSource ;
static {
Properties prop = new Properties();
try {
prop.load(DruidUtils.class.getResourceAsStream("druid.properties"));
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
JDBCTemplate-spring
JdbcTemplate是通过 SQL语句 + 参数,模板化了编程.它是Spring框架中提供的⼀个对象
,是对原始 Jdbc API 对象的简单封装。
与他相似的是DBUtils-apache(QueryRunner)
1.导入jar包
commons-logging-1.2.jar
spring-beans-5.2.6.RELEASE.jar
spring-core-5.2.6.RELEASE.jar
spring-jdbc-5.2.6.RELEASE.jar
spring-tx-5.2.6.RELEASE.jar
2.创建JdbcTemplate对象
jdbcTemplate-这是基于数据源技术的
所以还需要传入一个数据库连接池
JdbcTemplate jdbcTemplate=new JdbcTemplate(DruidUtil.getDataSource());
3. 调⽤JdbcTemplate的⽅法来完成CRUD的操作
update():执⾏DML语句。增、删、改语句
// 定义sql语句
String sql = "insert into user2 values(?,?,?)";
// 执行sql语句
String uuid = UUID.randomUUID().toString().replaceAll("-","");
// 传入sql语句和参数
jdbcTemplate.update(sql, uuid, "lucy","12345");
queryForMap():将结果封装到map集合中.
其中key就是字段名, value就是字段对应的数据
注意: 结果集要求只能有一条数据, 多了 expected 1, actual 2 (单行多列)
public void test01() {
// 定义sql语句
String sql = "select * from emp where empno = ?";
// 传入sql语句和参数
Map<String, Object> map = jdbcTemplate.queryForMap(sql, 7369);
// {empno=7369, ename=SMITH, job=CLERK, mgr=7902, hiredate=1980-12-17, sal=800, comm=null, deptno=20}
System.out.println(map);
}
queryForList():查询结果将结果集封装为list集合
注意:将每⼀条记录封装为⼀个Map集合,再将Map集合装载到List集合中
public void test02() {
// 定义sql语句
String sql = "select * from emp where empno = ? or empno = ?";
// 传入sql语句和参数
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, 7369, 7521);
list.forEach(System.out::println);
}
query():查询结果,将结果封装为JavaBean对象
query的参数: RowMapper
⼀般我们使⽤ BeanPropertyRowMapper 实现类。
可以完成数据到JavaBean 的⾃动封装
new BeanPropertyRowMapper<类型>(类型.class)
public void test03() {
// 定义sql语句
String sql = "select * from emp ";
List<Emp> list = jdbcTemplate.query(sql,
new BeanPropertyRowMapper<Emp>(Emp.class));
list.forEach(System.out::println);
}
queryForObjec():查询结果,将结果封装为对象
⼀般⽤于聚合函数的查询
注意:如果没有查到数据, 就会抛异常 必须查到一个值 expected 1, actual 0/2
public void test05() {
// 定义sql语句
String sql = "select count(*) from emp ";
Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(integer);
}