数据库连接池
- 概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器。 - 好处:
- 节约资源
- 用户访问高效
- 实现:
- 标准接口:
DataSource
javax.sql包下的- 方法:
- 获取连接:
getConnection()
- 归还连接:如果连接对象
Connection
是从连接池中获取的,那么调用Connection.close()
方法,则不会再关闭连接,而是归还连接
- 获取连接:
- 方法:
- 一般我们不去实现它,由数据库厂商来说实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供的
- 标准接口:
- C3P0:数据库连接池技术
- 步骤:
- 导入jar包两个 c3p0-0.9.5.2 jar mchange-commons-java-0.2.12.jar 前提是有mysql的驱动jar包
- 定义配置文件:
- 名称:c3p0.properties 或者 c3p0-config.xml
- 路径:直接将文件放在src目录下即可。
- 创建核心对象 数据库连接池对象
ComboPolledDataSource
配置文件的演示:
- 导入jar包两个 c3p0-0.9.5.2 jar mchange-commons-java-0.2.12.jar 前提是有mysql的驱动jar包
- 步骤:
代码演示:```java package b_datesource.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException;
public class C3P0Demo2 {
public static void main(String[] args) throws SQLException {
//1.获取DataSource,new ComboPooledDataSource()使用默认配置
// DataSource ds = new ComboPooledDataSource(); //1.1获取DataSource 使用指定名称的配置 DataSource ds = new ComboPooledDataSource(“otherc3p0”); //2.获取连接 for (int i = 1; i <= 11; i++) { Connection conn = ds.getConnection(); System.out.println(i + “” + conn);
if (i == 5){//归还连接
conn.close();
}
}
}
}
<br />结果:<br />(第五个归还连接,第六个使用第五个归还的连接,最大连接数量还是10)
5. Druid:数据库连接池实现技术,由阿里巴巴提供的
1. 步骤:
1. 导入jar包:druid -1.0.9.jar
2. 定义配置文件:
- 是properties形式的
- 可以叫任意名称,可以放在任意目录下
3. 加载配置文件。`Properties`
4. 获取数据路连接池对象:通过工厂类来获取 `DruidDataSourceFactory`
5. 获取连接:`getConnection`
2. 定义工具类
1. 定义一个类 `JDBCUtils`
2. 提供静态代码块加载配置文件,初始化连接池对象
3. 提供方法
1. 获取连接方法:通过数据库连接池获取连接
2. 释放资源
3. 获取连接池方法
工具类代码:
```java
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
@SuppressWarnings("All")
public class JDBCUtils {
//1.定义成员变量 DataSource
private static DataSource dataSource;
static {
try {
//1.加载配置文件
Properties properties = new Properties();
properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接的方法
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public static void close(Statement statement,Connection connection){
if (statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null){
try {
connection.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet resultSet,Statement statement,Connection connection){
if (resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
close(statement,connection);
}
/**
* 获取连接池的方法
*/
public static DataSource getDataSource(){
return dataSource;
}
}
测试代码:
import b_datesource.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 使用新的工具类
*/
@SuppressWarnings("All")
public class DruidDemo2 {
public static void main(String[] args) {
/***
* 给account表添加一条记录
*/
Connection connection = null;
PreparedStatement pstm = null;
try {
//1.获取连接
connection = JDBCUtils.getConnection();
//2.定义Sql
String sql = "insert into account values(null,?,?)";
//3.获取pstm对象
pstm = connection.prepareStatement(sql);
//4.赋值
pstm.setString(1,"wudi");
pstm.setDouble(2,3000);
//5.执行sql
int update = pstm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(pstm,connection);
}
}
}
Spring JDBC
- Spring框架对JDBC简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
- 步骤:
- 导入jar包
- 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
- 创建JdbcTemplate对象。依赖于数据源DataSource
JdbcTemplate template = new JdbcTemplate(ds);
- 调用JdbcTemplate的方法来完成CRUD的操作
update()
:执行DML语句。增,删,改语句queryForMap()
:查询结果将结果集封装为map集合,将列名作为key,值作为value- 注意:这个方法查询的结果集长度只能是1
queryForLIst()
:查询结果将结果封装为list集合- 注意:将每一条记录封装为map集合,再将所有map集合封装为list集合
query()
:查询结果,将结果集封装为JavaBean对象queryForObject()
:查询结果,将结果集封装为对象
代码演示:```java package b_datesource.jdbctemplate;
- 导入jar包
import b_datesource.utils.JDBCUtils; import org.junit.jupiter.api.Test; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Map; @SuppressWarnings(“All”) public class JdbcTemplateDemo2 {
//1.获取JDBCTemplate对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//Junit单元测试
/**
* 修改id为3的数据balance为3000
*/
@Test
public void test() {
//2.定义sql
String sql = "update account set balance = 3000 where id = ?";
//3.执行sql
int update = template.update(sql, 3);
if (update > 0) {
System.out.println("修改成功");
} else {
System.out.println("添加失败");
}
}
/**
* 添加一条记录
*/
@Test
public void test2() {
String sql = "insert into account values(null,?,?)";
int jiege = template.update(sql, "jiege", 1000000);
if (jiege > 0) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
}
/**
* 删除刚添加的数据
*/
@Test
public void test3() {
String sql = "Delete from account where id = ?";
int update = template.update(sql, 4);
if (update > 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}
/**
* 查询id为1的记录,将其封装为Map集合
* 注意:这个方法的结果集长度只能是1
*/
@Test
public void test4() {
String sql = "Select * from account where id = ?";
Map<String, Object> map = template.queryForMap(sql,1);
System.out.println(map);
map.forEach((s,q)-> System.out.println(s+"=="+q));
}
/**
* 查询所有的记录,将其封装为list集合
*/
@Test
public void test5() {
String sql = "select * from account";
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
/**
* 将所有对象封装为javaBean对象的list集合
*/
@Test
public void test6() {
String sql = "Select * from account";
List<Accounts> list = template.query(sql, new RowMapper<Accounts>() {
@Override
public Accounts mapRow(ResultSet resultSet, int i) throws SQLException {
Accounts accounts = new Accounts();
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
double balance = resultSet.getDouble("balance");
accounts.setId(id);
accounts.setUser(name);
accounts.setBalance(balance);
return accounts;
}
});
for (Accounts accounts : list) {
System.out.println(accounts );
}
}
/**
* 将所有对象封装为javaBean对象的list集合
*/
@Test
public void test7() {
String sql = "Select * from account";
List<Accounts> list = template.query(sql, new BeanPropertyRowMapper<Accounts>(Accounts.class));
for (Accounts accounts : list) {
System.out.println(accounts);
}
}
/**
* 查询总记录数
*/
@Test
public void test8(){
String sql = "Select count(1) from account";
Long aLong = template.queryForObject(sql, Long.class);
System.out.println(aLong);
}
} ```