数据库连接池
数据库连接池概念
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包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar , * 不要忘记导入数据库驱动jar包 2. 定义配置文件: * 名称: c3p0.properties 或者 c3p0-config.xml * 路径:直接将文件放在src目录下即可。 3. 创建核心对象 数据库连接池对象 ComboPooledDataSource 4. 获取连接: getConnection * 代码: //1.创建数据库连接池对象 DataSource ds = new ComboPooledDataSource(); //2. 获取连接对象 Connection conn = ds.getConnection(); 5. Druid:数据库连接池实现技术,由阿里巴巴提供的 1. 步骤: 1. 导入jar包 druid-1.0.9.jar 2. 定义配置文件: * 是properties形式的 * 可以叫任意名称,可以放在任意目录下 3. 加载配置文件。Properties 4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory 5. 获取连接:getConnection * 代码: //3.加载配置文件 Properties pro = new Properties(); InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //4.获取连接池对象 DataSource ds = DruidDataSourceFactory.createDataSource(pro); //5.获取连接 Connection conn = ds.getConnection(); 2. 定义工具类 1. 定义一个类 JDBCUtils 2. 提供静态代码块加载配置文件,初始化连接池对象 3. 提供方法 1. 获取连接方法:通过数据库连接池获取连接 2. 释放资源 3. 获取连接池的方法
封装工具类JDBCUtils
package utils; 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; /** * Druid连接池的工具类 */ public class JDBCUtils { //1.定义成员变量 DataSource private static DataSource ds ; static{ try { //1.加载配置文件 Properties pro = new Properties(); pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); //2.获取DataSource ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接 */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 释放资源 */ public static void close(Statement stmt,Connection conn){ /* if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close();//归还连接 } catch (SQLException e) { e.printStackTrace(); } }*/ close(null,stmt,conn); } public static void close(ResultSet rs , Statement stmt, Connection conn){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close();//归还连接 } catch (SQLException e) { e.printStackTrace(); } } } /** * 获取连接池方法 */ public static DataSource getDataSource(){ return ds; } }
Spring JDBC
* Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发 * 步骤: 1. 导入jar包 2. 创建JdbcTemplate对象。依赖于数据源DataSource * JdbcTemplate template = new JdbcTemplate(ds); 3. 调用JdbcTemplate的方法来完成CRUD的操作 * update():执行DML语句。增、删、改语句 * queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合 * 注意:这个方法查询的结果集长度只能是1 * queryForList():查询结果将结果集封装为list集合 * 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中 * query():查询结果,将结果封装为JavaBean对象 * query的参数:RowMapper * 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装 * new BeanPropertyRowMapper<类型>(类型.class) * queryForObject:查询结果,将结果封装为对象 * 一般用于聚合函数的查询
使用JDBC Template及连接池实现增删改查
1. 添加所有的数据库工具外包(文末提供下载)
2. 封装上述的工具类JDBCUtils
3. 定义连接池druid配置文件 druid.properties
driverClassName=com.mysql.jdbc.Driver #url=jdbc:mysql://127.0.0.1:3306/user url=jdbc:mysql:///user username=root password=root initialSize=5 maxActive=10 maxWait=3000
4.建立一个封装类 admin.java
package domain;/* *Created by tao on 2020-03-16. */ public class Admin { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
5. 使用JDBC Template很方便的调用数据库
建立demo1.java
package JDBC_Template;/* *Created by tao on 2020-03-16. */ import domain.Admin; import org.junit.Test; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import utils.JDBCUtils; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Map; public class demo1 { //1.导入jar包 //2.创建JDBCTemplate对象 static JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); public static void main(String[] args) { //3.调用方法 String sql = "update admin set password = '666' where username = ?"; int count = template.update(sql, "ccc"); System.out.println(count); } //1.添加一条记录 @Test public void test1() { String sql = "insert into admin(username,password) values(?,?)"; int count = template.update(sql, "LF", "123"); System.out.println(count); } //2.删除刚才添加的记录 @Test public void test2() { String sql = "delete from admin where username = ?"; int count = template.update(sql, "LF"); System.out.println(count); } /** * 3. 修改记录 */ @Test public void test3() { String sql = "update admin set password = '666' where username = ?"; int count = template.update(sql, "ccc"); System.out.println(count); } /** * 4.条件查询,将其封装为Map集合 * 注意:这个方法查询的结果集长度只能是1 */ @Test public void test4() { String sql = "select * from admin where username = ?"; Map<String, Object> map = template.queryForMap(sql, "admin"); System.out.println(map); } /** * 5. 查询所有记录,将其封装为List */ @Test public void test5() { String sql = "select * from admin"; List<Map<String, Object>> list = template.queryForList(sql); for (Map<String, Object> li : list) { System.out.println(li); } } /** * 6. 查询所有记录,将其封装为Emp对象的List集合 * 手动封装 */ @Test public void test6_1() { String sql = "select * from admin"; List<Admin> list = template.query(sql, new RowMapper<Admin>() { @Override public Admin mapRow(ResultSet rs, int i) throws SQLException { Admin admin = new Admin(); String username = rs.getString("username"); String password = rs.getString("password"); admin.setUsername(username); admin.setPassword(password); return admin; } }); for (Admin admin : list) { System.out.println(admin.getUsername() + "----" + admin.getPassword()); } } /** * 6. 查询所有记录,将其封装为Emp对象的List集合 * 使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装 */ @Test public void test6_2() { String sql = "select * from admin"; List<Admin> list = template.query(sql, new BeanPropertyRowMapper<Admin>(Admin.class)); for (Admin admin : list) { System.out.println(admin.getUsername() + "----" + admin.getPassword()); } } /** * 7. 查询总记录数 */ @Test public void test7() { String sql = "select count(username) from admin"; Long total = template.queryForObject(sql, Long.class); System.out.println(total); } }
需要导入的系列jar包
点击下载
链接:https://pan.baidu.com/s/1ooBjjuLDZytAHWyxkRXwOw
提取码:9bjo
总结
一般写项目中使用JDBC调用数据库时,一般不会直接直接写JDBC的原生代码来获取来连接,相比使用数据库连接池,也有很多弊端:如代码很繁琐,开关连接效率很低,直接调用系统资源没有像连接池哪有有一个过度,对javaBean需要手动封装等等。所以开发中会使用连接池和spring提供的JDBC Template来简化操作,缺点就是使用前需要先配置。配置完之后使用起来就特别爽,相当于只要写sql语句就能调用数据库, 并且有很多直接对javaBean封装的方法。学了spring之后,就会再次升级,使用myBatis管理持久层。