目录
(一)整合JDBC使用
1.1 SpringData简介
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理,Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库,Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等齐名的知名项目。
- Sping Data 官网:https://spring.io/projects/spring-data
- 数据库相关的启动器 :可以参考官方文档:https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
1.2 创建测试项目测试数据源
1、我去新建一个项目测试:springboot-data-jdbc ; 引入相应的模块,基础模块
2、项目建好之后,发现自动帮我们导入了如下的启动器
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-jdbc
</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>mysql
</groupId>
-
<artifactId>mysql-connector-java
</artifactId>
-
<scope>runtime
</scope>
-
</dependency>
3、编写yaml配置文件连接数据库
-
spring:
-
datasource:
-
username: root
-
password:
-
url:
"jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8"
-
driver-
class-name: com.mysql.jdbc.Driver
4、配置完这一些东西后,我们就可以直接去使用了,因为SpringBoot已经默认帮我们进行了自动配置;去测试类测试一下
-
@SpringBootTest
-
class
Springboot04DataApplicationTests {
-
-
@Autowired
-
DataSource dataSource;
-
-
@Test
-
void
contextLoads
()
throws SQLException {
-
-
//看一下默认数据源
-
System.out.println(dataSource.getClass());
-
//获得连接
-
Connection
connection
= dataSource.getConnection();
-
System.out.println(connection);
-
//关闭连接
-
connection.close();
-
}
-
-
}
结果:我们可以看到他默认给我们配置的数据源为 : class com.zaxxer.hikari.HikariDataSource , 我们并没有手动配置
我们来全局搜索一下,找到数据源的所有自动配置都在 :DataSourceAutoConfiguration文件
-
@Import(
-
{Hikari.
class, Tomcat.
class, Dbcp2.
class, Generic.
class, DataSourceJmxConfiguration.
class}
-
)
-
protected
static
class
PooledDataSourceConfiguration {
-
protected PooledDataSourceConfiguration() {
-
}
-
}
这里导入的类都在 DataSourceConfiguration 配置类下,可以看出 Spring Boot 2.2.5 默认使用HikariDataSource 数据源,而以前版本,如 Spring Boot 1.5 默认使用 org.apache.tomcat.jdbc.pool.DataSource 作为数据源;
HikariDataSource 号称 Java WEB 当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加优秀;
可以使用 spring.datasource.type 指定自定义的数据源类型,值为要使用的连接池实现的完全限定名。
关于数据源我们并不做介绍,有了数据库连接,显然就可以 CRUD 操作数据库了。但是我们需要先了解一个对象 JdbcTemplate
1.3 JDBCTemplate
- 有了数据源(com.zaxxer.hikari.HikariDataSource),然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;
- 即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即JdbcTemplate。
- 数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
- Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,程序员只需自己注入即可使用
- JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 JdbcTemplateConfiguration 类
JdbcTemplate主要提供以下几类方法:
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
- update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
- query方法及queryForXXX方法:用于执行查询相关语句;
- call方法:用于执行存储过程、函数相关语句。
1.4 测试
编写一个Controller,注入 jdbcTemplate,编写测试方法进行访问测试;
-
package com.
example.
controller;
-
-
import org.
springframework.
beans.
factory.
annotation.
Autowired;
-
import org.
springframework.
jdbc.
core.
JdbcTemplate;
-
import org.
springframework.
web.
bind.
annotation.
GetMapping;
-
import org.
springframework.
web.
bind.
annotation.
PathVariable;
-
import org.
springframework.
web.
bind.
annotation.
RequestMapping;
-
import org.
springframework.
web.
bind.
annotation.
RestController;
-
-
import java.
util.
List;
-
import java.
util.
Map;
-
-
@RestController
-
@RequestMapping(
"/jdbc")
-
public
class
JdbcController {
-
-
/**
-
* Spring Boot 默认提供了数据源,默认提供了 org.springframework.jdbc.core.JdbcTemplate
-
* JdbcTemplate 中会自己注入数据源,用于简化 JDBC操作
-
* 还能避免一些常见的错误,使用起来也不用再自己来关闭数据库连接
-
*/
-
@Autowired
-
JdbcTemplate jdbcTemplate;
-
-
//查询employee表中所有数据
-
//List 中的1个 Map 对应数据库的 1行数据
-
//Map 中的 key 对应数据库的字段名,value 对应数据库的字段值
-
@GetMapping(
"/list")
-
public
List<
Map<
String,
Object>>
userList(
){
-
String sql =
"select * from mybatis.user";
-
List<
Map<
String,
Object>> maps = jdbcTemplate.
queryForList(sql);
-
return maps;
-
}
-
-
//新增一个用户
-
@GetMapping(
"/add")
-
public
String
addUser(
){
-
//插入语句,注意时间问题
-
String sql =
"insert into mybatis.user(id, name, pwd)" +
-
" values (5,'Test','888888')";
-
jdbcTemplate.
update(sql);
-
//查询
-
return
"addOk";
-
}
-
-
//修改用户信息
-
@GetMapping(
"/update/{id}")
-
public
String
updateUser(
@PathVariable("id") int id){
-
//插入语句
-
String sql =
"update mybatis.user set name=?,pwd=? where id="+id;
-
//数据
-
Object[] objects =
new
Object[
2];
-
objects[
0] =
"AAA";
-
objects[
1] =
"999999";
-
jdbcTemplate.
update(sql,objects);
-
//查询
-
return
"updateOk";
-
}
-
-
//删除用户
-
@GetMapping(
"/delete/{id}")
-
public
String
delUser(
@PathVariable("id") int id){
-
//插入语句
-
String sql =
"delete from mybatis.user where id=?";
-
jdbcTemplate.
update(sql,id);
-
//查询
-
return
"deleteOk";
-
}
-
-
}
(二)、整合Druid
2.1 Druid简介
Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池,Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。
Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池,Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。
Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源,我们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。
Github地址:https://github.com/alibaba/druid/
2.2 配置数据源
1、添加上 Druid 数据源依赖
-
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
-
<dependency>
-
<groupId>com.alibaba
</groupId>
-
<artifactId>druid
</artifactId>
-
<version>1.1.12
</version>
-
</dependency>
2、切换数据源;之前已经说过 Spring Boot 2.0 以上默认使用 com.zaxxer.hikari.HikariDataSource 数据源,但可以 通过 spring.datasource.type 指定数据源
-
spring:
-
datasource:
-
username: root
-
password:
-
url:
"jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8"
-
driver-
class-name: com.mysql.jdbc.
Driver
-
type: com.alibaba.druid.pool.DruidDataSource
3、数据源切换之后,在测试类中注入 DataSource,然后获取到它,输出一看便知是否成功切换;
4、切换成功,既然切换成功,就可以设置数据源连接初始化大小、最大连接数、等待时间、最小连接数等设置项;可以查看源码
-
spring:
-
datasource:
-
username: root
-
password: 123456
-
#?serverTimezone=UTC解决时区的报错
-
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=
true&characterEncoding=utf-8
-
driver-class-name: com.mysql.cj.jdbc.Driver
-
type: com.alibaba.druid.pool.DruidDataSource
-
-
#Spring Boot 默认是不注入这些属性值的,需要自己绑定
-
#druid 数据源专有配置
-
initialSize: 5
-
minIdle: 5
-
maxActive: 20
-
maxWait: 60000
-
timeBetweenEvictionRunsMillis: 60000
-
minEvictableIdleTimeMillis: 300000
-
validationQuery: SELECT 1 FROM DUAL
-
testWhileIdle:
true
-
testOnBorrow:
false
-
testOnReturn:
false
-
poolPreparedStatements:
true
-
-
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
-
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
-
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
-
filters:
stat,wall,log4j
-
maxPoolPreparedStatementPerConnectionSize: 20
-
useGlobalDataSourceStat:
true
-
connectionProperties: druid.stat.mergeSql=
true;druid.stat.slowSqlMillis=500
5、导入Log4j 的依赖
-
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
-
<dependency>
-
<groupId>log4j
</groupId>
-
<artifactId>log4j
</artifactId>
-
<version>1.2.17
</version>
-
</dependency>
6、现在需要程序员自己为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成了;我们需要 自己添加 DruidDataSource 组件到容器中,并绑定属性
-
package com.xiaowei.config;
-
-
import com.alibaba.druid.pool.DruidDataSource;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
import org.springframework.context.
annotation.Bean;
-
import org.springframework.context.
annotation.Configuration;
-
-
import javax.sql.DataSource;
-
-
@Configuration
-
public
class
DruidConfig {
-
-
/*
-
将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
-
绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
-
@ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
-
前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
-
*/
-
@ConfigurationProperties(prefix = "spring.datasource")
-
@Bean
-
public DataSource druidDataSource() {
-
return new DruidDataSource();
-
}
-
-
}
2.3 配置Druid数据源监控
Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装 路由器 时,人家也提供了一个默认的 web 页面。
所以第一步需要设置 Druid 的后台管理页面,比如 登录账号、密码 等;配置后台管理:
-
//配置 Druid 监控管理后台的Servlet;
-
//内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式
-
@Bean
-
public
ServletRegistrationBean
statViewServlet(
) {
-
ServletRegistrationBean bean =
new
ServletRegistrationBean(
new
StatViewServlet(),
"/druid/*");
-
-
// 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet
-
// 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
-
Map<
String,
String> initParams =
new
HashMap<>();
-
initParams.
put(
"loginUsername",
"admin");
//后台管理界面的登录账号
-
initParams.
put(
"loginPassword",
"123456");
//后台管理界面的登录密码
-
-
//后台允许谁可以访问
-
//initParams.put("allow", "localhost"):表示只有本机可以访问
-
//initParams.put("allow", ""):为空或者为null时,表示允许所有访问
-
initParams.
put(
"allow",
"");
-
//deny:Druid 后台拒绝谁访问
-
//initParams.put("kuangshen", "192.168.1.20");表示禁止此ip访问
-
-
//设置初始化参数
-
bean.
setInitParameters(initParams);
-
return bean;
-
}
配置完毕后,我们可以选择访问 :http://localhost:8080/druid/login.html
配置 Druid web 监控 filter 过滤器:
-
//配置 Druid 监控 之 web 监控的 filter
-
//WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
-
@Bean
-
public
FilterRegistrationBean
webStatFilter(
) {
-
FilterRegistrationBean bean =
new
FilterRegistrationBean();
-
bean.
setFilter(
new
WebStatFilter());
-
-
//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
-
Map<
String,
String> initParams =
new
HashMap<>();
-
initParams.
put(
"exclusions",
"*.js,*.css,/druid/*,/jdbc/*");
-
bean.
setInitParameters(initParams);
-
-
//"/*" 表示过滤所有请求
-
bean.
setUrlPatterns(
Arrays.
asList(
"/*"));
-
return bean;
-
}
平时在做项目中,按需求进行配置即可,主要用作监控。
(三)整合mybatis
3.1 导入mybatis所需要的依赖
-
<!-- 引入 myBatis,这是 MyBatis官方提供的适配 Spring Boot 的,而不是Spring Boot自己的-->
-
<dependency>
-
<groupId>org.mybatis.spring.boot
</groupId>
-
<artifactId>mybatis-spring-boot-starter
</artifactId>
-
<version>2.1.0
</version>
-
</dependency>
3.2 配置数据库连接信息
-
spring.datasource.username=root
-
spring.datasource.password=
123456
-
spring.datasource.url=jdbc:mysql:
//localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
-
spring.datasource.driver-
class-
name=com.mysql.jdbc.Driver
用默认的数据源;先去测试一下连接是否成功
-
@RunWith(SpringRunner.class)
-
@SpringBootTest
-
public
class
SpringbootDemoMybatisApplicationTests {
-
-
@Autowired
-
DataSource dataSource;
-
-
@Test
-
public void contextLoads() throws SQLException {
-
-
System.
out.println(
"数据源>>>>>>" + dataSource.getClass());
-
Connection connection = dataSource.getConnection();
-
System.
out.println(
"连接>>>>>>>>>" + connection);
-
System.
out.println(
"连接地址>>>>>" + connection.getMetaData().getURL());
-
connection.close();
-
-
}
-
-
}
3.3 创建实体类
-
package com.
example.
pojo;
-
-
import lombok.
AllArgsConstructor;
-
import lombok.
Data;
-
import lombok.
NoArgsConstructor;
-
-
@Data
-
@AllArgsConstructor
-
@NoArgsConstructor
-
public
class
User {
-
private int id;
-
private
String name;
-
private
String pwd;
-
}
3.4 配置Mapper接口类
-
package com.example.mapper;
-
-
import com.example.pojo.User;
-
import org.apache.ibatis.annotations.Mapper;
-
import org.springframework.stereotype.Repository;
-
-
import java.util.List;
-
-
//@Mapper : 表示本类是一个 MyBatis 的 Mapper,等价于以前 Spring 整合 MyBatis 时的 Mapper 接口
-
@Mapper
-
@Repository
-
public
interface
UserMapper {
-
-
//选择全部用户
-
List<User>
selectUser
();
-
//根据id选择用户
-
User
selectUserById
(int id);
-
//添加一个用户
-
int
addUser
(User user);
-
//修改一个用户
-
int
updateUser
(User user);
-
//根据id删除用户
-
int
deleteUser
(int id);
-
-
}
3.5 对应Mapper映射文件
这里将mapper银蛇文件放到 resource/mybatis/mapper 目录下:
-
<?xml version="1.0" encoding="UTF-8" ?>
-
<!DOCTYPE mapper
-
PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
-
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
-
<mapper namespace="com.example.mapper.UserMapper">
-
-
<select id="selectUser" resultType="User">
-
select * from user
-
</select>
-
-
<select id="selectUserById" resultType="User">
-
select * from user where id = #{id}
-
</select>
-
-
<insert id="addUser" parameterType="User">
-
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
-
</insert>
-
-
<update id="updateUser" parameterType="User">
-
update user set name=#{name},pwd=#{pwd} where id = #{id}
-
</update>
-
-
<delete id="deleteUser" parameterType="int">
-
delete from user where id = #{id}
-
</delete>
-
</mapper>
3.6 SpringBoot 整合
以前 MyBatis 未与 spring 整合时,配置数据源、事务、连接数据库的账号、密码等都是在 myBatis 核心配置文件中进行的myBatis 与 spring 整合后,配置数据源、事务、连接数据库的账号、密码等就交由 spring 管理。因此,在这里我们即使不使用mybatis配置文件也可以
既然已经提供了 myBatis 的映射配置文件,自然要告诉 spring boot 这些文件的位置
-
spring.datasource.username=root
-
spring.datasource.password=123456
-
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=
true&characterEncoding=utf-8
-
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-
-
#指定myBatis的核心配置文件与Mapper映射文件
-
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
-
# 注意:对应实体类的路径
-
mybatis.type-aliases-package=com.example.pojo
可以从 org.mybatis.spring.boot.autoconfigure.MybatisProperties 中查看所有配置项
-
@ConfigurationProperties(
-
prefix =
"mybatis"
-
)
-
public
class
MybatisProperties {
-
public
static final
String
MYBATIS_PREFIX =
"mybatis";
-
private
static final
ResourcePatternResolver resourceResolver =
new
PathMatchingResourcePatternResolver();
-
private
String configLocation;
-
private
String[] mapperLocations;
-
private
String typeAliasesPackage;
-
private
Class<?> typeAliasesSuperType;
-
private
String typeHandlersPackage;
-
private
boolean checkConfigLocation =
false;
-
private
ExecutorType executorType;
-
private
Class<?
extends
LanguageDriver> defaultScriptingLanguageDriver;
-
private
Properties configurationProperties;
-
@NestedConfigurationProperty
-
private
Configuration configuration;
-
}
3.7 编写controller
-
package com.
example.
controller;
-
-
import com.
example.
pojo.
User;
-
import com.
example.
mapper.
UserMapper;
-
-
import org.
springframework.
beans.
factory.
annotation.
Autowired;
-
import org.
springframework.
web.
bind.
annotation.
GetMapping;
-
import org.
springframework.
web.
bind.
annotation.
RestController;
-
-
import java.
util.
List;
-
-
@RestController
-
public
class
UserController {
-
-
@Autowired
-
private
UserMapper userMapper;
-
-
//选择全部用户
-
@GetMapping(
"/selectUser")
-
public
String
selectUser(
){
-
List<
User> users = userMapper.
selectUser();
-
for (
User user : users) {
-
System.
out.
println(user);
-
}
-
-
return
"ok";
-
}
-
//根据id选择用户
-
@GetMapping(
"/selectUserById")
-
public
String
selectUserById(
){
-
User user = userMapper.
selectUserById(
1);
-
System.
out.
println(user);
-
return
"ok";
-
}
-
//添加一个用户
-
@GetMapping(
"/addUser")
-
public
String
addUser(
){
-
userMapper.
addUser(
new
User(
5,
"阿毛",
"456789"));
-
return
"ok";
-
}
-
//修改一个用户
-
@GetMapping(
"/updateUser")
-
public
String
updateUser(
){
-
userMapper.
updateUser(
new
User(
5,
"阿毛",
"421319"));
-
return
"ok";
-
}
-
//根据id删除用户
-
@GetMapping(
"/deleteUser")
-
public
String
deleteUser(
){
-
userMapper.
deleteUser(
5);
-
return
"ok";
-
}
-
-
}
转载:https://blog.csdn.net/m0_61506558/article/details/127650987