Spring Boot 2系列(一):整合Mybatis + 通用Mapper + PageHelper分页 + Druid数据库连接池
前言:必须要感谢伟大的开源思想,感谢所有的开源团队和个人,他们提供了如此多的优秀开源项目,这是一件伟大的事。
Spring Boot 开发模板:spring-boot-template,此模板基于 Spring Boot 2.0.4 Release 版本的快速开发模板, 尽量采用 boot-starter 依赖, 使用最精简的配置。
集成了 MySQL, Druid, Mybatis, Common Mapper, pageHelper, Log4j2, Shiro, JSTL, Web页面支持 JSP, 支持打 war 包, 支持打 Docker 镜像。
使用描述
- 如果是接口数据,建议统一返回 ResultBean 对象。若是分页查询,将查询数据装到 PageInfo 里, PageInfo 对象封装到 ResultBean 的 data 属性中。
- 将 java 配置文件和组件分开存放,让项目结构更清晰。
- 实体类
- 所有实体类建议都实现序列化接口, 生成序列化版本号。
- 实体类 entity 包下的 base 目录里有个实体类的基类 BaseEntity , 基类里面包含 id,pageNum,pageSize` 三个公用属性,
其中 pageNum(页码) 和 pageSize(每页显示条数) 是分页参数, 这两个属性不参与持久化。 - 让实体类继承 BaseEntity 基类, 在 properties 配置文件添加支持方法参数分页配置(pagehelper.supportMethodsArguments=true),
在实体类作为查询参数时就会根据 pageNum 和 pageSize 这两个属性执行自动分页, 可以省略查询方法前的 PageHelper.startPage(pageNum, pageSize) 设置。 - 若查询参数和和分页参数不封装在实体类里, 是直接作为方法参数传递, 在执行查询方法前需要设置分页参数(PageHelper.startPage(pageNum, pageSize))。
- 通用 Mapper 默认是根据实体类名首字母小写来找对应的表,若实体类名与表名无法对应,可在实体类上添加注解(@Table(name = “table_name”))来映射表名。
- 通用 Mapper 默认支持下划线和驼峰规则转换,若属性名与表字段无法匹配, 可在属性上添加注解(@Column(name = “column_name”))来映射表字段。
- MyBatis
- 在配置文件开启了对实体类别名支持, 别名默认是实体类名首字母小写,在 XML 接收实体类参数和返回实体类时,可直接写别名而不用写全限定实体类名。
- 开启了实体类属性名驼峰规则和下划线的转换, 若转换后可对应表字段, 在 XML 里的字段和属性映射可省略。
- MyBatis 的自动配置默认开启了 Mapper 级别(二级)缓存的支持, 若需要使用缓存, 可在业务 mapper 接口上添加缓存引用注解 @CacheNamespaceRef(XxxMapper.class),
在 mapper.xml 文件中添加缓存配置<cache />
, 有多个属性支持详细配置,例如 flushInterval 设置缓存刷新间隔,单位是毫秒。 - 缓存的配置还有另一种方式:若只使用通用 Mapper 接口中的方法, 只需在业务接口上添加 @CacheNamespace 注解来启用缓存, 如果要和 XML 混合使用缓存, 需要在 XML 文件添加缓存引用
<cache-ref namespace="业务mapper接口的全限定名,即该mapper接口在mapper文件的命名空间" />
。 通用 Mapper 的作者发现此方式会报错并给 Mybatis 提交了 issue,但在此模板项目上验证未出现异常。
- Mapper
- 在 mapper 包下的 base 目录里, 有个
BaseMapper<T>
基础接口, 此接口继承了通用 mapper 中的Mapper<T>, MySqlMapper<T>
两个接口,
此基础接口不能被 Spring 扫描到,否则会报错, 此项目配置扫描 mapper 包时设置了 markerInterface 参数, 即只扫描该参数值的父级包下的 mapper 接口文件。 - 若不需要使用
MySqlMapper<T>
中的独有方法, 则业务方法可直接继承通用 mapper 的Mapper<T>
接口。
- 在 mapper 包下的 base 目录里, 有个
- Shiro
- 使用了 Shiro 的认证功能对登录用户身份进行认证, 用户登录密码使用 Shiro 的 Md5Hash 进行加密码。
- Docker
- 在pom.xml文件里集成了将应用打包成 docker 镜像的插件, Dockerfile 文件指向 src/main/docker 目录。
- 打镜像命令见 document 目录下的 【打Docker镜像命令.txt】 文件内容。
项目改造
拉取项目模板, 改造成实际要开发的项目。以下描述基于 IDEA 开发工具。
- 修改项目名称
File → Project Structure → Project Settings → Project, 修改 Project name 为实际开发的项目名称;
点击 Modules , 修改 Name 名称为实际模块名称。 - 修改包路径名
将 com.springboot.template 改为实际需要的包路径名, 包括测试的包路径, 同步修改包下的 Java 文件中的引用包路径。 - 修改 pom.xml 文件
将文件中的 groupId、 artifactId、 name三个标签的值,改为实际项目信息。 - 修改日志配置文件
log4j2.xml
将日志文件里log.file
名称改为实际项目名称。 - 修改数据源信息
根据实际的开发、测试、生产环境的数据库修改链接、账号、密码信息。 - 替换Web页面
- 需要的话修改登录路径
pom.xml
1 |
|
properties
- application.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45spring.profiles.active=dev
#=============SERVER=====================
server.tomcat.uri-encoding=utf-8
#=============DATASOURCE=================
#Druid 数据源配置,继承spring.datasource.* 配置,相同则覆盖
spring.datasource.name=master
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=1
spring.datasource.druid.max-active=30
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-wait=60000
spring.datasource.druid.validation-query=select 1
spring.datasource.druid.validation-query-timeout=1
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.async-init=true
spring.datasource.druid.async-close-connection-enable=true
#============MyBatis配置===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.springboot.template.entity
mybatis.configuration.map-underscore-to-camel-case=true
#===========通用Mapper=====================
mapper.mappers=com.springboot.template.mapper.base.BaseMapper
mapper.safe-update=true
mapper.safe-delete=true
mapper.not-empty=true
mapper.check-example-entity-class=true
#=============pagehelper==================
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
#===========SpringMVC Web=================
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
#===========Jackson======================
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss - application-dev.properties
1
2
3
4
5
6
7
8#============datasource==========================
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/sakila?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=123456
#====JSP 开发环境动态即时更新页面,不需重新编译===========
server.servlet.jsp.init-parameters.development=true - application-pro.properties 备注:生产环境的数据源的账号密码应加密显示, 连接没有使用 log4jdbc, 否则会打印太多的查询结果数据降低性能。
1
2
3
4
5
6#============datasource==========================
#=====这里的 driver-classs配置可省略,数据源的自动配置会根据连接类型来匹配驱动=====
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/sakila?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=123456
Spring Boot 2系列(一):整合Mybatis + 通用Mapper + PageHelper分页 + Druid数据库连接池
http://blog.gxitsky.com/2018/05/18/SpringBoot-01-mybatis-mapper-pagehelper-druid/