基本概念
- 概念:其实就是一个容器(集合),存放数据库连接的容器 - 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。 - 好处: - 节约资源 - 用户访问高效 - 实现: - 标准接口:DateSource javax.sql包下的 - 方法<br /> - 如果连接对象connection是从连接池中获取的,那么调用connection . close()方法则不会关闭连接而是归还连接 - 一般不由我们实现,有数据厂商来实现 - C3P0:数据库连接池技术 - Druid:数据库连接池实现技术,由阿里巴巴提供
C3P0:数据库连接技术
1. 步骤
- 导入jar包<br /> - 不搞这个了,难搞死了
Druid:数据库连接技术
1. 步骤
- 导入jar包(只有一个)<br /> - 搞配置文件(这里有可能会报一个时间上的错,老方法解决,文件名是druid.properties)<br />
driverClassName=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/user?serverTimezone=UTCusername=rootpassword=root #初始化连接数量initialSize=5 #最大连接数量maxActive=10 #最大等待时间maxWait=3000maxIdle=8minIdle=3
- 获取连接(这样可以用)<br />
package druid;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.InputStream;import java.sql.Connection;import java.util.Properties;public class DruidDemo { public static void main(String[] args) throws Exception { //1.导入jar包,只有druid-1.0.9.jar //2.定义配置文件,即druid.properties //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(); System.out.println(conn); }}
- 结果(一级棒)<br /> - 基本步骤(注意配置文件随意放置,代码里需要路径)<br />
2. 配合工具类使用
- 注:关于汉字乱码的问题暂时没有好的办法解决,在sqlyog中乱码比较严重(已解决,详见杂) - 工具类的书写(类名叫做JDBCUtils,全部写静态方法)<br />
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 { //定义成员变量DataSource private static DataSource ds; static { try { //加载配置文件 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(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 void close(Statement stmt,Connection conn){ close(null,stmt,conn); } /** * 获取连接池的方法 */ public static DataSource getDataSource(){ return ds; }}
- 工具类的使用(与连接池配合使用)
package druid;import utils.JDBCUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;public class DruidDemo { public static void main(String[] args) throws Exception { Connection conn=null; PreparedStatement pstmt=null; try { //获取连接 conn = JDBCUtils.getConnection(); //定义sql String sql = "insert into xiaoming values(?,?,?)"; //获取pstmt对象 pstmt = conn.prepareStatement(sql); //给?赋值 pstmt.setString(1, "16"); pstmt.setString(2, "明"); pstmt.setString(3, "2020-01-28"); //执行sql int count = pstmt.executeUpdate(); System.out.println(count); }catch (SQLException e){ e.printStackTrace(); }finally { //释放资源 JDBCUtils.close(pstmt,conn); } }}
- 注意: - 这里使用了?来输入存储的数据
JDBCTemplate:快捷工具
1. 步骤
- 导入jar包(一共有5个,如下)<br />[commons-logging-1.2.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995572624-ef0d8c9d-c4a0-4afa-a279-6e1e92ee6716.jar?_lake_card=%7B%22uid%22%3A%221582293114360-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995572624-ef0d8c9d-c4a0-4afa-a279-6e1e92ee6716.jar%22%2C%22name%22%3A%22commons-logging-1.2.jar%22%2C%22size%22%3A61829%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22IMLoy%22%2C%22card%22%3A%22file%22%7D)[spring-beans-5.1.10.RELEASE.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995572725-41c92f2b-06d2-4180-ba1d-fb5676d8e308.jar?_lake_card=%7B%22uid%22%3A%221582293114360-1%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995572725-41c92f2b-06d2-4180-ba1d-fb5676d8e308.jar%22%2C%22name%22%3A%22spring-beans-5.1.10.RELEASE.jar%22%2C%22size%22%3A673979%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22ahumy%22%2C%22card%22%3A%22file%22%7D)[spring-core-5.1.10.RELEASE.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995572842-be83d186-a8e4-4191-9632-d102288c95da.jar?_lake_card=%7B%22uid%22%3A%221582293114360-2%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995572842-be83d186-a8e4-4191-9632-d102288c95da.jar%22%2C%22name%22%3A%22spring-core-5.1.10.RELEASE.jar%22%2C%22size%22%3A1301116%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%227ju53%22%2C%22card%22%3A%22file%22%7D)[spring-jdbc-5.1.10.RELEASE.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995572961-28c799f8-eda7-4c27-92c2-1daf26ae53b3.jar?_lake_card=%7B%22uid%22%3A%221582293114360-3%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995572961-28c799f8-eda7-4c27-92c2-1daf26ae53b3.jar%22%2C%22name%22%3A%22spring-jdbc-5.1.10.RELEASE.jar%22%2C%22size%22%3A404657%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22bUpvb%22%2C%22card%22%3A%22file%22%7D)[spring-tx-5.1.10.RELEASE.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995573054-15ae3192-9f49-445b-b2b6-7cb3c014143e.jar?_lake_card=%7B%22uid%22%3A%221582293114360-4%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995573054-15ae3192-9f49-445b-b2b6-7cb3c014143e.jar%22%2C%22name%22%3A%22spring-tx-5.1.10.RELEASE.jar%22%2C%22size%22%3A256437%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22t0GEa%22%2C%22card%22%3A%22file%22%7D) - 使用演示(这里需要上文提到的自定义工具类)<br />
package druid;import org.springframework.jdbc.core.JdbcTemplate;import utils.JDBCUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;public class DruidDemo { public static void main(String[] args) { //1.导入jar包 //2.创建JDBCTemplate对象 JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); //3.调用方法 String sql = "update xiaoming set name = 'ming' where age = 15"; int count = template.update(sql); System.out.println(count); }}
2. 方法介绍
- 所有方法简介<br /> - 插入<br /> - 删除<br /> - 封装成Map对象(只能封装单个id)<br /><br /> - 将全部数据封装成list对象(成员是Map对象)<br /><br /> - 将全部记录封装为Emp对象的List集合(这个方法是比较方便的一个,只是被封装了)<br /><br />小前提(弄个Emp的类,加入getter,setter,tostring,注意类变量是数据库行名称,不能用基本类型)<br /> - 查询总记录数(查询的总的数量而不是数字相加,queryForObject用来处理聚合函数)<br /><br />
3. 梳理
- 需要导入的包 - 数据库连接包<br />[mysql-connector-java-8.0.19.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995573149-fbd04fa3-787d-485c-ba77-fb03a136b1a8.jar?_lake_card=%7B%22uid%22%3A%221582303835412-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995573149-fbd04fa3-787d-485c-ba77-fb03a136b1a8.jar%22%2C%22name%22%3A%22mysql-connector-java-8.0.19.jar%22%2C%22size%22%3A2356711%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22Dgfqm%22%2C%22card%22%3A%22file%22%7D) - templata的包<br />[commons-logging-1.2.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995573285-8fd7bfb6-9336-481d-861c-7b2e11a1c280.jar?_lake_card=%7B%22uid%22%3A%221582303890146-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995573285-8fd7bfb6-9336-481d-861c-7b2e11a1c280.jar%22%2C%22name%22%3A%22commons-logging-1.2.jar%22%2C%22size%22%3A61829%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22G0N3f%22%2C%22card%22%3A%22file%22%7D)<br />[spring-beans-5.1.10.RELEASE.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995573399-5fee85d9-3ff3-4398-9a7c-1cb91ffe89a4.jar?_lake_card=%7B%22uid%22%3A%221582303890146-1%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995573399-5fee85d9-3ff3-4398-9a7c-1cb91ffe89a4.jar%22%2C%22name%22%3A%22spring-beans-5.1.10.RELEASE.jar%22%2C%22size%22%3A673979%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22bgZsL%22%2C%22card%22%3A%22file%22%7D)[spring-core-5.1.10.RELEASE.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995573560-c22ab6fc-327a-416f-b773-5dec57bebdc9.jar?_lake_card=%7B%22uid%22%3A%221582303890146-2%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995573560-c22ab6fc-327a-416f-b773-5dec57bebdc9.jar%22%2C%22name%22%3A%22spring-core-5.1.10.RELEASE.jar%22%2C%22size%22%3A1301116%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%227KoTc%22%2C%22card%22%3A%22file%22%7D)<br />[spring-jdbc-5.1.10.RELEASE.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995573665-e5ceab61-04ce-4de9-9a28-fbd810aca2a6.jar?_lake_card=%7B%22uid%22%3A%221582303890146-3%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995573665-e5ceab61-04ce-4de9-9a28-fbd810aca2a6.jar%22%2C%22name%22%3A%22spring-jdbc-5.1.10.RELEASE.jar%22%2C%22size%22%3A404657%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22QMdxH%22%2C%22card%22%3A%22file%22%7D)<br />[spring-tx-5.1.10.RELEASE.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995573776-cf32c5d1-20c8-410e-b793-a4f44fe3b1d0.jar?_lake_card=%7B%22uid%22%3A%221582303890146-4%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995573776-cf32c5d1-20c8-410e-b793-a4f44fe3b1d0.jar%22%2C%22name%22%3A%22spring-tx-5.1.10.RELEASE.jar%22%2C%22size%22%3A256437%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22P5PTp%22%2C%22card%22%3A%22file%22%7D) - 连接池的包包<br />[druid-1.0.9.jar](https://www.yuque.com/attachments/yuque/0/2020/jar/710889/1592995573894-1a07297f-f453-4101-a9ea-af2c53fc5b74.jar?_lake_card=%7B%22uid%22%3A%221582304010178-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2020%2Fjar%2F710889%2F1592995573894-1a07297f-f453-4101-a9ea-af2c53fc5b74.jar%22%2C%22name%22%3A%22druid-1.0.9.jar%22%2C%22size%22%3A1848389%2C%22type%22%3A%22%22%2C%22ext%22%3A%22jar%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22NBPn0%22%2C%22card%22%3A%22file%22%7D) - 需要创建的配置文件 - **druid.properties**(用来建立与Mysql的连接,这里定义数据库)<br />
driverClassName=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/user?serverTimezone=UTCusername=rootpassword=rootinitialSize=5maxActive=10maxWait=3000maxIdle=8minIdle=3
- **JDBCUtils**(Druid连接池的工具类)<br />
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 { //定义成员变量DataSource private static DataSource ds; static { try { //加载配置文件 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(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 void close(Statement stmt,Connection conn){ close(null,stmt,conn); } /** * 获取连接池的方法 */ public static DataSource getDataSource(){ return ds; }}
- **Emp(**封装为JavaBean对象时需要用到的类,这里仅仅用于实验用的数据库,使用前要修改**)<br />**
package domain;import java.util.Date;public class Emp { private Integer age; private String name; private Date birthday; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "Emp{" + "age=" + age + ", name='" + name + '\'' + ", birthday=" + birthday + '}'; }}
- 总述<br />