spring-boot-starter-dao是基于spring-boot开箱即用原则,集成了mybatis,通用mapper,pagehelper,druid的dao层库。致力于降低数据层的开发复杂度,让mybatis配置彻底告别xml,让基于mybatis的开发嵌入jpa的身影,极大降低mybatis的入门门槛,也极大的增加mybatis的可用性,减少重复代码的工作量。让mybatis新手使用mybatis轻轻松松,让mybatis老手开发效率和编码质量更上一层楼。
spring-boot-starter-dao项目特点:
1. 配置及其简单,非常容易上手;
2. 支持读写分离;
3. 支持多数据源;
4. 支持注解方式指定枚举与数据库存储值的对应;
5. 基于通用mapper快速实现单表的增删查改;
6. 基于pagehelper便捷易用的数据库物理分页实现;
7. 基于druid的服务器监控。
8. 可以根据数据库表以及表中字段注释,生成带完整注释的model,生成基于通用mapper的dao层
快速开始
1.项目依赖
在spring-boot项目中引入依赖
<dependency>
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dao</artifactId>
<version>${spring-boot-starter-dao.version}</version>
</dependency>
如果需要快速生成dao,model,mapper另外还需要引入依赖
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
<optional>true</optional> <!-- 打包时该jar包不需要被打包 -->
</dependency>
2. 配置项目
在spring-boot的application.yml
配置文件中增加配置项
druid监控配置
spring:
druid:
stat:
enable: true # 启用druid监控控制台,在web项目中,该值设置为true,才会启用druid监控
allow: '' # IP白名单 (没有配置或者为空,则允许所有访问)
deny: '' # IP黑名单 (存在共同时,deny优先于allow)
loginUsername: 'leige' # 用户名
loginPassword: 'leige' # 密码
exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*' # WebStatFilter忽略资源
resetEnable: false #禁用HTML页面上的“Reset All”功能
filter-url-patterns: '/*'
druid连接池默认配置项
spring:
druid:
default: # druid连接池默认参数,具体主库或者从库的配置会继承该配置
enable: true
initial-size: 5 # 链接池初始化大小
max-active: 500 # 链接池中最大的链接数
min-idle: 5 # 链接池中最少要保留的链接数
max-wait: 3000 # 链接池中最大等待的链接数
filters: wall,stat # 启用过滤器
username: reger # 数据库登陆名
password: reger_123 # 数据库登陆密码
default-auto-commit: true # 是否自动提交事务,如果设置为false,代码中不启用事务数据将没法持久化
mybatis配置参数
spring:
mybatis:
configuration: # mybatis具体的配置参数,所有的mybatis实例都会使用该配置
cache-enabled: true # 是否启用缓存
local-cache-scope: session # 缓存范围
lazy-loading-enabled: true # 是否启用懒加载
default-executor-type: simple # sql执行模式
map-underscore-to-camel-case: true # 开启驼峰转换
mybatis数据源配置
spring:
mybatis:
nodes:
user: # 该数据源的名字,可以配置多个数据源
order: after # mybatis生成主键的顺序,如果要在insert into 数据前获得主键,配置为 BEFORE,否则配置为 AFTER 默认值为 BEFORE
mapper: MYSQL # mybatis通用mapper使用的mapper接口集合,mysqldb时使用使用 MYSQL,SqlServer 时使用MSSQL,其它db类型时使用DEFAULT, 默认值是 DEFAULT
primary: false # 是否是默认的数据对象, 最多只有一个为true,如果配置多个只有第一个生效
base-package: com.reger.test.user.dao # mybatis mapper接口文件的配置位置,该值不可以为空,可以用正则匹配,多个用逗号分隔
mapper-package: com.reger.test.user.mapper # mybatis mapper 的xml配置文件的位置 ,该值最好不要为空,可以用正则匹配,多个用逗号分隔
type-aliases-package: 'com.reger.test.user.model' # model类所在的包,该值可以为空,可以用正则匹配,多个用逗号分隔
master: # 主库配置,不可为空,参数默认继承spring.druid.default,可以写参数覆盖默认配置
url: jdbc:mysql://127.0.0.1:3306/user?useSSL=true # 主库的jdbc地址
slaves: # 从库配置,可以为空,可以配置多个,参数默认继承spring.druid.default,可以写参数覆盖默认配置
- url: jdbc:mysql://127.0.0.1:3307/user?useSSL=true
- url: jdbc:mysql://127.0.0.1:3308/user?useSSL=true
- url: jdbc:mysql://127.0.0.1:3309/user?useSSL=true
配置项至此完毕
3.快速生成dao,model,代码
3.1 添加生成代码需要的配置文件
在 resources
目录增加配置文件generator.properties
,编写文件内容如下
mybatis.nodeName=message # 数据源结点的名字,必须配置
# extend
extends.modelClass= # 生成的model希望继承的基类,如果不写将继承java.long.Object
extends.mapperInterface= # 生成dao接口希望继承的接口,如果不写将不会继承
# java config
java.delimiter=` # 指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引
java.encoding=utf-8 # 代码编码,如果不写,默认utf-8
# generator table config
table.primarykey=id # 生成表的主键id
table.columnMatch= ^ # 匹配的表中列,可以匹配去除列前缀,如^[idcb],会去除列首的字符i,d,c,b
table.tableName=% # 需要生成的表面,可以用%匹配多个,但建议每次只生成一个
table.tableModl= # 生成表的model名字,如果表名匹配多个时,该字段必须为空
# generator package config
package.model= # 生成的model存放的包路径,如果为空将使用数据源节点下对应包路径下的第一个完整包路径
package.repo= # 生成的mapper接口存放的包路径,如果为空将使用数据源节点下对应包路径下的第一个完整包路径
package.mapper= # 生成的mapper的xml存放的包路径,如果为空将使用数据源节点下对应包路径下的第一个完整包路径
3.2 生成代码
以Application方式启动项目,选择包含main方法的com.reger.mybatis.generator.GeneratorMain
,运行。
稍等,如果没有出现异常,基本就生成好了你数据表的对应的包括中文注释的dao,mapper,model。
4.读写分离实现
读写分离有两种方式分别是,
4.1 基于注解
你可以在service方法上加注解@DataSourceChange(slave=false)
,让方法调用过程在主库查询,也可以@DataSourceChange(slave=true)
,让方法调用过程在从库查询
4.2 基于java
你可以在方法调用时通过Proxy.master(() -> { 方法调用过程 return null; });
,让方法调用过程在主库查询,也可以Proxy.slave(() -> { 方法调用过程 return null; });
,让方法调用过程在从库查询
注意数据更新操作,必须在主库执行,从库都是只读的
5. 基于注解,实现枚举到数据库字段的映射
创建枚举如下
import com.reger.datasource.annotation.EnumTypeHandler;
@EnumTypeHandler(field= "intCode")// 设置枚举在数据库保存的值
public enum State {
delete(-1), disable(0), enable(1);
private final int intCode;
private State(final int code) {
this.intCode=code;
}
}
给枚举添加注解@EnumTypeHandler(field= "intCode")
,这样在持久化到数据库,或者查询出来时,就会用intCode
来转化枚举,保存到数据库的就是-1,0,1。这里的field除了自己定义的以外,枚举还默认有name,ordinal
可用。