搭建Spring Boot应用(数据层框架采用Mybatis,集成Mapper插件)
Spring Boot中使用Mybatis
引入mybatis-spring-boot-starter依赖 引入数据库连接驱动(Oracle:ojdbc6;Mysql:mysql-connector-java) 引入druid-spring-boot-starter依赖(Druid数据源,功能:数据库连接池、监控) 配置Druid数据源
server:
servlet:
context-path: /makelocks
spring:
datasource:
druid:
# 数据库访问配置, 使用druid数据源
db-type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost.cn:3306/mysql?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
username: root
password: 123456
# 连接池配置
initial-size: 5
min-idle: 5
max-active: 20
# 连接等待超时时间
max-wait: 30000
# 配置检测可以关闭的空闲连接间隔时间
time-between-eviction-runs-millis: 60000
# 配置连接在池中的最小生存时间
min-evictable-idle-time-millis: 300000
validation-query: select '1' from dual
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-open-prepared-statements: 20
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
# Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
aop-patterns: cn.makelocks.management.service.*
# WebStatFilter配置
web-stat-filter:
enabled: true
# 添加过滤规则
url-pattern: /*
# 忽略过滤的格式
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
# StatViewServlet配置
stat-view-servlet:
enabled: true
# 访问路径为/druid时,跳转到StatViewServlet
url-pattern: /druid/*
# 是否能够重置数据
reset-enable: false
# 需要账号密码才能访问控制台
login-username: druid
login-password: druid123
# IP白名单
allow: 127.0.0.1
# IP黑名单(共同存在时,deny优先于allow)
deny: 127.0.0.1
# 配置StatFilter
filter:
stat:
log-slow-sql: true
使用Mybatis(根据数据库表创建实体、Dao层接口、Mapper映射文件、Service层接口及实现类、Controller接口) Mybatis相关配置
mybatis:
# 配置映射文件扫描路径
mapper-locations: classpath:mapper/*.xml
configuration:
# 开启驼峰命名转换
map-underscore-to-camel-case: true
在Application类加入@MapperScan注解,自动扫描Dao层接口
Mybatis通用Mapper插件和PageHelper分页插件
引入依赖:通用mapper及pagehelper分页插件
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
mybatis:
# type-aliases扫描路径
type-aliases-package: cn.makelocks.management.po
配置通用Mapper插件(在application.yml中):需要先自定义GenericMapper接口
mapper:
mappers: cn.makelocks.management.common.GenericMapper
not-empty: false
identity: mysql
配置PageHelper(在application.yml中)
pagehelper:
dialect: com.github.pagehelper.PageHelper
reasonable: true
support-methods-arguments: true
params: count=countSql
配置Generator(src/main/resources/下新建mybatis-generator.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<!-- 该配置会使生产的Mapper自动继承MyMapper -->
<property name="mappers" value="cn.makelocks.management.common.GenericMapper" />
<!-- caseSensitive默认false,当数据库表名区分大小写时,可以将该属性设置为true -->
<property name="caseSensitive" value="false"/>
</plugin>
<!-- 阻止生成自动注释 -->
<commentGenerator>
<property name="javaFileEncoding" value="UTF-8"/>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 数据库链接地址账号密码 -->
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://mloveyh.cn:3306/makelock"
userId="root"
password="930725">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成Model类存放位置 -->
<javaModelGenerator targetPackage="cn.makelocks.management.po" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件存放位置 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成Dao类存放位置 -->
<!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件的代码
type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.makelocks.management.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 配置需要生成的表 -->
<table tableName="m_area" domainObjectName="AreaPO" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
在IDEA的右侧栏点击Maven,选中添加的Mybatis-generator插件并运行,就可以得到相应的代码 代码生成后,最好将pom.xml中刚刚开启的插件重新注释掉。因为在项目打包的时候会自动运行该插件,这样如果生成的代码后续有修改的话,将会被覆盖掉。所以通常的做法是只有在需要生成代码的时候才将该插件开启。 自定义一个通用的Service接口(GenericService接口)
@Service
public interface GenericService<T> {
List<T> selectAll();
T selectByKey(Object key);
int save(T entity);
int delete(Object key);
int updateAll(T entity);
int updateNotNull(T entity);
List<T> selectByExample(Object example);
}
实现通用的Service接口(BaseService类)
public abstract class BaseService<T> implements GenericService<T> {
@Autowired
protected Mapper<T> mapper;
public Mapper<T> getMapper() {
return mapper;
}
/**
* 查询所有数据
* @return
*/
@Override
public List<T> selectAll() {
return mapper.selectAll();
}
/**
* 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
* @param key 主键值
* @return
*/
@Override
public T selectByKey(Object key) {
return mapper.selectByPrimaryKey(key);
}
/**
* 保存一个实体,null的属性也会保存,不会使用数据库默认值
* @param entity 待保存的实体
* @return
*/
@Override
public int save(T entity) {
return mapper.insert(entity);
}
/**
* 根据主键字段进行删除,方法参数必须包含完整的主键属性
* @param key 主键值
* @return
*/
@Override
public int delete(Object key) {
return mapper.deleteByPrimaryKey(key);
}
/**
* 根据主键更新实体全部字段,null值会被更新
* @param entity 待更新的实体
* @return
*/
@Override
public int updateAll(T entity) {
return mapper.updateByPrimaryKey(entity);
}
/**
* 根据主键更新实体不为null的字段
* @param entity 待更新实体
* @return
*/
@Override
public int updateNotNull(T entity) {
return mapper.updateByPrimaryKeySelective(entity);
}
/**
* 根据Example条件进行查询
* 重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
* @param example
* @return
*/
@Override
public List<T> selectByExample(Object example) {
return mapper.selectByExample(example);
}
}
后续各功能模块中的Service接口只需要继承自GenericService接口即可;对应Service接口的实现类只需要继承自BaseService类并实现对应的Service接口即可 注意点:
异常:java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider; 解决:使用@MapperScan注解时应该导入import tk.mybatis.spring.annotation.MapperScan这个包。 异常:com.github.pagehelper.PageException: java.lang.ClassNotFoundException: mysql; 解决:PageHelper版本差异导致的dialect加载问题,需要将dialect的值设置为com.github.pagehelper.PageHelper。
PageHelper插件的使用:
@GetMapping("/selectByPage/{pageNum}/{pageSize}")
public PageInfo<LockTypePO> selectByPage(@PathVariable int pageNum, @PathVariable int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<LockTypePO> lockTypes = lockTypeService.selectAll();
return new PageInfo<>(lockTypes);
}