数据库连接池/JDBC Template
JDBC
每次查询数据都要加载驱动,创建连接对象
package com.test.Demo01;
import java.sql.*;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCyh {
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
//1,加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2,链接数据库
conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis","root","123456");
//3,得到发送查询语句的对象
stmt=conn.createStatement();
//4,发送语句
String sql="select * from user";
rs=stmt.executeQuery(sql);
//5,打印
while(rs.next()){
System.out.print("id号:"+rs.getInt("id"));
System.out.print("姓名:"+rs.getString("name"));
System.out.println("年龄:"+rs.getInt("age"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
//6释放资源
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
// 关闭stmt
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt=null;
}
//关闭连接
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
}
}
数据库连接池
概念:其实就是一个容器,集合,用来存放数据库连接的容器
系统初始化后,容器被创建,容器中会申请一些连接对象,当用户访问数据库时,从容器中获取连接对象,用户访问完毕后,会将连接对象还给容器(连接池)
好处
1.节约资源
2.用户访问高效
Interface DataSource
这DataSource
对象代表的物理数据源的连接工厂。一种替代的DriverManager
设施,一DataSource
对象获得连接的首选方法。实现DataSource
接口通常是与命名服务基于java™命名和目录注册一个对象(JNDI)API。
的DataSource
接口是由一个驱动程序供应商实施。有三种类型的实现:
- 基本实现生产标准
Connection
对象 - 连接池的实现,产生一个
Connection
对象将自动参与连接池。此实现与一个中间层连接池管理器一起工作。 - 分布式事务实现–产生
Connection
对象可用于分布式事务几乎总是参与连接池。此实现与一个中间层事务管理器一起工作,并且几乎总是与一个连接池管理器一起工作。
一个DataSource
对象的属性,可以进行修改,必要时。例如,如果数据源被移动到不同的服务器,服务器的属性就可以改变了。好处是,因为数据源的属性可以被更改,任何代码访问该数据源不需要改变。
Modifier and Type Method and Description
Connection getConnection()
试图建立这种 DataSource对象代表数据源连接。
Connection getConnection(String username, String password)
试图建立这种 DataSource对象代表数据源连接。
获取连接
getconnection
归还连接
Connection.close
数据库连接池厂商
C3P0: 数据库连接池技术
Druid: 阿里巴巴
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
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://47.93.197.238:3306/test</property>
<property name="user">root</property>
<property name="password">root123456</property>
<!-- 连接池参数 -->
<!--初始化的申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">10</property>
<!--连接超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://47.93.197.238:3306/test</property>
<property name="user">root</property>
<property name="password">root123456</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
Druid :数据库连接池技术
1.导入jar包
2.定义配置文件 druid.properties
3.加载配置文件 Properties
4.获取连接池对象 DruidDataSourceFactory
5.获取连接 Getconnection
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://47.93.197.238:3306/test?characterEncoding=UTF-8
username=root
password=root123456
# 初始化连接数
initialSize=5
#最大连接数
maxActive=10
#超时时间
maxWait=3000
定义工具类
JDBC Template
JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。
需要的依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.6</version>
</dependency>
在JdbcTemplate中执行SQL语句的方法大致分为3类:
-
execute
:可以执行任何SQL语句,一般用于执行DDL(data definition language)语句。 -
update
:用于执行INSERT
、UPDATE
、DELETE
等DML(data manipulation language)语句。 -
queryXxx
:用于DQL(数据查询语言DQL)数据查询语句。
JDBC工具类
package util;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
//Jdbc工具类
public class JDBCUtill {
private static DruidDataSource dataSource;
static {
try {
Properties properties = new Properties();
//读取properties文件
InputStream inputStream = JDBCUtill.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(inputStream);
//创建数据库连接池
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
System.out.println(dataSource.getConnection());
} catch (Exception e) {
e.printStackTrace();
}
}
//获取数据库连接池
public static Connection getConnection() {
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭连接
public static void close(Connection conn) {
if(conn !=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 获取数据源
public static DruidDataSource getDataSource(){
return dataSource;
}
}
JdbcTemplate配置连接池
org.springframework.jdbc.core.JdbcTemplate
类方便执行SQL语句
创建JDBCTemplate对象。依赖于数据源DataSource
public JdbcTemplate(DataSource dataSource)
JdbcTemplate template = new JdbcTemplate(JDBCUtill.getDataSource());
调用JdbcTemplate的方法来完成CRUD的操作
update():执行DML语句。增删改语句
@Test
public void test01(){
String sql="update user set name ='zqh' where id=2";
int count =template.update(sql);
System.out.println(count);
}
queryForMap():查询结果将结果集封装为Map集合,查询的结果集只能为1,列名为Key,值为Value,将这一条记录封装为一个map集合
@Test
public void test04(){
String sql ="select * from user where id=? ";
Map<String, Object> map = template.queryForMap(sql,1);
System.out.println(map);
//com.mysql.cj.jdbc.ConnectionImpl@6e171cd7
//{id=1, name=zqh, pwd=123456}
}
一般只能用来查询一条结果
如果查询多条会报错org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2
@Test
public void test04(){
String sql ="select * from user where id=? or id =?";
Map<String, Object> map = template.queryForMap(sql,1,3);
System.out.println(map);
}
queryForList():查询结果将结果集封装为List集合,将每一条记录封装为一个Map,再将所有记录封装为一个List
@Test
public void test05(){
String sql ="select * from user ";
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
com.mysql.cj.jdbc.ConnectionImpl@6e171cd7
{id=1, name=zqh, pwd=123456}
{id=3, name=李四, pwd=987654}
{id=4, name=AAA, pwd=wewae}
query():查询结果,将结果封装为JavaBean对象
query的参数:RowMapper
一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
new BeanPropertyRowMapper(类型〉(类型.class)
@Test
public void test06(){
String sql ="select * from user ";
List<User> list = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
for (User user : list) {
System.out.println(user);
}
}
queryForObject:查询结果,将结果封装为对象
@Test
public void test06(){
String sql ="select count(*) from user ";
Integer count = template.queryForObject(sql,Integer.class);
System.out.println(count);
}
ry(sql, new BeanPropertyRowMapper(User.class));
for (User user : list) {
System.out.println(user);
}
}
```java
queryForObject:查询结果,将结果封装为对象
@Test
public void test06(){
String sql ="select count(*) from user ";
Integer count = template.queryForObject(sql,Integer.class);
System.out.println(count);
}