给mybatis插上快速开发的翅膀

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 可用。

相关资源

spring-boot-starter-dao git地址
通用mapper
pagehelper

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章