Spring Boot 之 ORM
ORM
- ORM:Object Relational Mapping:对象关系映射
- 通过 MyBatis 操作数据库
基本步骤
- 添加
mybatis
起步依赖:完成mybatis
对象自动配置,对象放在容器中 pom.xml
配置文件中指定将src/main/java
目录中的xml
文件编译- 创建实体类
- 创建
dao
接口- 定义数据库操作方法
- 创建对应的
mapper.xml
文件- 进行 sql 语句编写
- 创建
service
层- 创建
service
接口和实现类 - 调用
dao
的方法完成数据库操作,实现具体业务逻辑
- 创建
- 创建
controller
,访问service
方法实现业务 - 写
application.properties
配置文件- 配置数据库连接信息
起步依赖
- 三方提供的 SpringBoot 依赖以第三方名开始
- SpringBoot 提供的依赖 以 spring 为开始 id
- 添加起步依赖之后相关依赖都已经被导入
- 添加 mybatis 依赖
- mysql 驱动依赖
数据源
- 配置 MySQL 数据源信息
- 默认使用框架中封装的连接池:Hikari
spring:
# 配置数据源,默认框架中封装的 HikariDataSource
datasource:
#自定义数据源类型
type: com.alibaba.druid.pool.DruidDataSource
#驱动类: MySQL 8.0 新的驱动文件,速度更快
driver-class-name: com.mysql.cj.jdbc.Driver
# MySQL 连接的 url
# useUnicode 使用Unicode编码,编码格式 UTF-8
# serverTimezone:执行时区
# GMT:标准时区;%2B8:+8小时
url: jdbc:mysql://localhost:3306/demo01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: 123456
UTC
:全球标准时间- 以原子时计时,更加精准适应现代社会的精确计时
GMT
:格林威治标准时间- 指位于伦敦郊区的皇家格林尼治天文台的标准时间
- 北京时区即东八区,领先 UTC 和 GMT 八个小时
- 一般视为无差别,即:北京时间 = UTC + 8 = GMT + 8
Druid
-
需要导入 SpringBoot 中的 Druid 起步依赖才能自动配置
- 导入 Maven 普通依赖无效,需要手动配置 druid
<!-- Druid SpringBoot 起步依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency>
Druid 配置
- druid 配置完成
- 包括 扩展插件配置:数据源监控功能
- 可以直接使用,或手动写配置类进行监控功能配置
spring:
# 配置数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo01?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
# 配置 druid 连接属性
druid:
# 初始化连接数
initialSize: 5
# 最小连接数
minIdle: 5
# 最大连接数
maxActive: 20
# 最大等待时间,配置获取连接等待超时,时间单位都是毫秒ms
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,又作为 testWhileIdle 执行的依据
timeBetweenEvictionRunsMillis: 60000
# 连接保持空闲而不被驱逐的最小时间
minEvictableIdleTimeMillis: 300000
# 用来检测连接是否有效的 sql,必须是一个查询语句
# mysql 中为 select 'x'、oracle 中为 select 1 from dual
validation-query: select 'x'
# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
# 建议配置为true,不影响性能,并且保证安全性
testWhileIdle: true
# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
testOnBorrow: false
# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
testOnReturn: false
# 是否缓存preparedStatement,即 PSCache;MySQL5.7 不要开
# 使用了MyBatis且使用了$的值引入方式,则无需担心SQL注入问题。Prepared statement不再需要
# PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
poolPreparedStatements: true
# 启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true
maxPoolPreparedStatementPerConnectionSize: 20
# 合并多个 DruidDataSource 的监控数据
useGlobalDataSourceStat: true
# 通过别名的方式配置扩展插件
# 监控统计:stat, 日志:log4j,防御SQL注入:wall
# wall 用于防火墙;SpringBoot 中没有 log4j,改成了 log4j2
filters: stat,wall,log4j2
# 通过 connectProperties 属性来打开 mergeSql 功能;慢 SQL 记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
# 配置 StatFilter,或者在配置类中手动配置
web-stat-filter:
# 默认为 false,设置为 true 启动
enabled: true
# 被过滤的请求路径
url-pattern: "/*"
# 不被过滤的请求
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置StatViewServlet,或者在配置类中手动配置
stat-view-servlet:
url-pattern: "/druid/*"
# 允许访问 ip
allow: 127.0.0.1
# 设置访问 druid 监控页的账号和密码,默认没有
login-username: admin
login-password: 123456
# 禁止访问 ip
deny: 192.168.1.102
# 是否可以重置
reset-enable: true
# 启用
enabled: true
mybatis:
# mapper 文件映射
mapper-locations: classpath:mapper/*.xml
# 打印 sql 语句执行日志到控制台
configuration.log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 类别名配置
type-aliases-package: mybatis2.pojo
server:
port: 80
数据源监控
- Druid数据源具有监控的功能,并提供了一个 web 界面方便用户查看
- 编写 Druid 配置类来配置监控
- 或在配置文件中直接配置
- 使用普通项目 Mavne 的 druid 依赖时需要手动配置
/*
* Druid 配置类
*/
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDatasource() {
return new DruidDataSource();
}
/*
* 配置 Druid 监控管理后台的Servlet;
* 内置 Servlet 容器没有 web.xml 文件,所以使用 Spring Boot 的注册 Servlet 方式
*/
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 参数可以在 StatViewServlet 的父类 ResourceServlet 中找到
Map<String, String> initParams = new HashMap<>();
//后台登录账号密码设置
initParams.put("loginUsername", "admin");
initParams.put("loginPassword", "123456");
//默认就是允许所有访问
initParams.put("allow", "");
//deny:Druid 后台拒绝谁访问,表示禁止此ip访问
initParams.put("deny", "192.168.10.132");
//是否可以重置数据
initParams.put("resetEnable","false");
//设置初始化参数
bean.setInitParameters(initParams);
return bean;
}
//2、配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter() {
//创建过滤器
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String, String> initParams = new HashMap<>();
// 或略过滤的形式
initParams.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
bean.setInitParameters(initParams);
//设置过滤路径
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
@Mapper
@Mapper
注解在 Dao 接口上- 通知 MyBatis 被注解的是 dao 接口
- 创建此接口的代理对象
- 属于 MyBatis 的注解,不会自动装配到 Spring 容器中
- 自动注入时 Idea 可能会爆红因为找不到 bean,但并没有错
- 再添加
@Repository
注解将 bean 注入到 容器- 可有可无,不影响注入结果
@Mapper
//@Repository
public interface DemoDao {
//方法定义略
}
- 其他步骤没有区别
@MapperScan
@Mapperscan
注解在主启动类- 属性
basePackages
指定 dao 接口所在包- 属性类型为 String[] 数组,可以同时指定多个包
- 属性
- 指定此注解后无需再使用
@Mapper
@SpringBootApplication
@MapperScan(basePackages = "springboot_mybatis.dao")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
dao 和 mapper
- 将 dao 接口 和 mapper.xml 文件分离,进行分开管理
- 将
mapper.xml
文件放到resources
资源目录下
- 将
- pom.xml 文件中指定编译
resources
目录下资源文件 application.properties
文件中指定mapper
文件路径
#指定 mapper 文件位置:mapper 目录下所有 xml 文件
mybatis.mapper-locations=classpath:mapper/*.xml
#打印 sql 语句执行日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
事务
Spring 中事务
- 定义管理事务的对象
- 事务管理器:接口,有很多实现类
- 例如:jdbc、mybatis 访问数据库的
DataSourceTransactionManager
- 声明式事务:xml 配置文件或注解说明事务控制的内容
- 控制事务:隔离级别、传播行为、超时
- 事务处理方式
- 使用
Spring
框架中的@Transaction
注解 - 使用
aspecjt
框架在 xml 配置文件中声明事务控制的内容
- 使用
SpringBoot 中事务
仍可使用 Spring 中方式进行
- 在业务方法加入
@Transactional
- 添加注解后业务方法即具有事务功能
- 明确在主启动类上加入
@EnableTransactionManagement
- 启用事务管理器
- 可以不加,建议添加