数据库连接池
- 概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器。 - 好处:
- 节约资源
 - 用户访问高效
 
 - 实现:
- 标准接口:
DataSourcejavax.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.jar2. 定义配置文件:- 是properties形式的- 可以叫任意名称,可以放在任意目录下3. 加载配置文件。`Properties`4. 获取数据路连接池对象:通过工厂类来获取 `DruidDataSourceFactory`5. 获取连接:`getConnection`2. 定义工具类1. 定义一个类 `JDBCUtils`2. 提供静态代码块加载配置文件,初始化连接池对象3. 提供方法1. 获取连接方法:通过数据库连接池获取连接2. 释放资源3. 获取连接池方法工具类代码:```javaimport 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.定义成员变量 DataSourceprivate static DataSource dataSource;static {try {//1.加载配置文件Properties properties = new Properties();properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));//2.获取DataSourcedataSource = 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.定义SqlString sql = "insert into account values(null,?,?)";//3.获取pstm对象pstm = connection.prepareStatement(sql);//4.赋值pstm.setString(1,"wudi");pstm.setDouble(2,3000);//5.执行sqlint 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*/@Testpublic void test() {//2.定义sqlString sql = "update account set balance = 3000 where id = ?";//3.执行sqlint update = template.update(sql, 3);if (update > 0) {System.out.println("修改成功");} else {System.out.println("添加失败");}}/*** 添加一条记录*/@Testpublic 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("添加失败");}}/*** 删除刚添加的数据*/@Testpublic 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*/@Testpublic 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集合*/@Testpublic 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集合*/@Testpublic void test6() {String sql = "Select * from account";List<Accounts> list = template.query(sql, new RowMapper<Accounts>() {@Overridepublic 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集合*/@Testpublic 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);}}/*** 查询总记录数*/@Testpublic void test8(){String sql = "Select count(1) from account";Long aLong = template.queryForObject(sql, Long.class);System.out.println(aLong);}
} ```
