欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mybaits-plus实战(二)

程序员文章站 2022-07-11 10:40:17
1. Mybaits plus实战(二) 1.1. mybatis plus插件 1.1.1. 用法 1. 先举个例子介绍用法,如下:直接作为Bean注入,一般来讲插件太多印象性能,所以大部分插件都只在测试,开发环境使用,一般不上生产环境,下面我介绍的插件都以xml格式配置为例,因为那样参数展示会多 ......

1. mybaits-plus实战(二)

1.1. mybatis-plus插件

1.1.1. 用法

  1. 先举个例子介绍用法,如下:直接作为bean注入,一般来讲插件太多印象性能,所以大部分插件都只在测试,开发环境使用,一般不上生产环境,下面我介绍的插件都以xml格式配置为例,因为那样参数展示会多一些,使用时直接pom使用或作为如下bean注入
    @bean
    public performanceinterceptor performanceinterceptor() {
        performanceinterceptor performanceinterceptor = new performanceinterceptor();
        /*<!-- sql 执行性能分析,开发环境使用,线上不推荐。 maxtime 指的是 sql 最大执行时长 -->*/
        performanceinterceptor.setmaxtime(1000);
        /*<!--sql是否格式化 默认false-->*/
        performanceinterceptor.setformat(false);
        return performanceinterceptor;
    }

1.1.2. 分页插件

<plugins>
    <!--
     | 分页插件配置
     | 插件提供二种方言选择:1、默认方言 2、自定义方言实现类,两者均未配置则抛出异常!
     | overflowcurrent 溢出总页数,设置第一页 默认false
     | optimizetype count优化方式 ( 版本 2.0.9 改为使用 jsqlparser 不需要配置 )
     | -->
    <!-- 注意!! 如果要支持二级缓存分页使用类 cachepaginationinterceptor 默认、建议如下!! -->
    <plugin interceptor="com.baomidou.mybatisplus.plugins.paginationinterceptor">
        <property name="sqlparser" ref="自定义解析类、可以没有" />
        <property name="localpage" value="默认 false 改为 true 开启了 pageheper 支持、可以没有" />
        <property name="dialectclazz" value="自定义方言类、可以没有" />
    </plugin>
</plugins>

1.1.2.1. json序列化移除transient

  1. 看到有个jackson的json序列化溢出transient功能,即controller层请求返回对象中属性若有transient修饰,则去掉该属性不传回去
  2. 但我不习惯用jackson,所以改了fastjson的方式
@configuration
public class webconfig implements webmvcconfigurer {
    @override
    public void configuremessageconverters(list<httpmessageconverter<?>> converters) {
        fastjsonhttpmessageconverter fastjsonhttpmessageconverter = new fastjsonhttpmessageconverter();
        fastjsonconfig fj = new fastjsonconfig();
        fj.setserializerfeatures(serializerfeature.skiptransientfield);
        fastjsonhttpmessageconverter.setfastjsonconfig(fj);
        converters.add(fastjsonhttpmessageconverter);
    }
}

1.1.3. 执行分析插件

  1. 用作拦截全表的delete和update操作,防止瞎写的sql语句
<plugins>
    <!-- sql 执行分析拦截器 stopproceed 发现全表执行 delete update 是否停止运行 -->
    <plugin interceptor="com.baomidou.mybatisplus.plugins.sqlexplaininterceptor">
        <property name="stopproceed" value="false" />
    </plugin>
</plugins>

1.1.4. 性能分析插件

  1. 用于输出每条 sql 语句及其执行时间
<plugins>
    ....

    <!-- sql 执行性能分析,开发环境使用,线上不推荐。 maxtime 指的是 sql 最大执行时长 -->
    <plugin interceptor="com.baomidou.mybatisplus.plugins.performanceinterceptor">
        <property name="maxtime" value="100" />
        <!--sql是否格式化 默认false-->
        <property name="format" value="true" />
    </plugin>
</plugins>

1.1.5. 乐观锁插件

  1. 实体字段需要加上@version注解
<bean class="com.baomidou.mybatisplus.plugins.optimisticlockerinterceptor"/>
public class user {

    @version
    private integer version;

    ...
}

1.1.6. 注入自定义sql

  1. 自定义注入全表删除方法 deteleall

1.1.6.1. java

  1. 配置注入方法
public class mysqlinjector extends autosqlinjector {

    @override
    public void inject(configuration configuration, mapperbuilderassistant builderassistant, class<?> mapperclass,
            class<?> modelclass, tableinfo table) {
        /* 添加一个自定义方法 */
        deletealluser(mapperclass, modelclass, table);
    }

    public void deletealluser(class<?> mapperclass, class<?> modelclass, tableinfo table) {

        /* 执行 sql ,动态 sql 参考类 sqlmethod */
        string sql = "delete from " + table.gettablename();

        /* mapper 接口方法名一致 */
        string method = "deleteall";
        sqlsource sqlsource = languagedriver.createsqlsource(configuration, sql, modelclass);
        this.addmappedstatement(mapperclass, method, sqlsource, sqlcommandtype.delete, integer.class);
    }

}

1.1.6.2. mapper

  1. 声明方法
public interface usermapper extends basemapper<user> {

    /**
     * 自定义注入方法
     */
    int deleteall();

}

1.1.6.3. xml

  1. 启用
<!-- 定义 mp 全局策略,安装集成文档部分结合 -->
<bean id="globalconfig" class="com.baomidou.mybatisplus.entity.globalconfiguration">
    .....

  <!-- 自定义注入 deleteall 方法  -->
  <property name="sqlinjector" ref="mysqlinjector" />
</bean>

<!-- 自定义注入器 -->
<bean id="mysqlinjector" class="com.baomidou.test.mysqlinjector" />

1.1.7. 公共字段自动填充

mymetaobjecthandler的用法,前一篇文章有用到

1.1.8. 逻辑删除

logicsqlinjector的用法,前一篇有用到

1.1.9. 读写分离与多数据源

  1. 集成pom
<dependency>
  <groupid>com.baomidou</groupid>
  <artifactid>dynamic-datasource-spring-boot-starter</artifactid>
  <version>2.x.x</version>
</dependency>
  1. 配置主从数据源
spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master,如果你主从默认下主库的名称就是master可不定义此项。
      datasource:
        master:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.driver
          url: jdbc:mysql://47.100.20.186:3306/dynamic?characterencoding=utf8&usessl=false
        slave_1:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.driver
          url: jdbc:mysql://47.100.20.186:3307/dynamic?characterencoding=utf8&usessl=false
        slave_2:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.driver
          url: jdbc:mysql://47.100.20.186:3308/dynamic?characterencoding=utf8&usessl=false
       #......省略
       #以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
  1. 切换数据源
    使用 @ds 注解切换数据源。

1.1.9.1. 读写分离

1.1.9.1.1. 配置
sharding:
  jdbc:
    datasource:
      names: ds_master,ds_slave_0,ds_slave_1
      ds_master:
        ...
      ds_slave_0:
        ...
      ds_slave_1:
        ...
    config:
      masterslave:
        load-balance-algorithm-type: round_robin
        name: ds_ms
        master-data-source-name: ds_master
        slave-data-source-names: ds_slave_0,ds_slave_1

1.1.10. sequence主键

  1. 它提供了id_worker,id_worker_str,uuid三种自定义主键生成器,对oracle可以用oraclekeygenerator配置主键自增
  2. id_worker就是雪花算法

1.1.11. 其他功能

  1. 多租户 sql 解析器
  2. 通用枚举扫描并自动关联注入

1.2. 条件构造器

  1. 开始接触mybatis-plus肯定会常常看到abstractwrapper这个条件包装类,通常使用两个实现querywrapperupdatewrapper
  2. 我列一些觉得常用的
    1. alleq,常用alleq(map<r, v> params)alleq(map<r, v> params, boolean null2isnull),分别表示key对应的值为null,需不需要判断isnull;alleq(bipredicate<r, v> filter, map<r, v> params)应该比较少用
      • 例子:值的范围大于2000的条件才被入选
      map<string, object> map = new hashmap<>();
      map.put("daily_price_id", 1117l);
      querywrapper<dailyprice> querywrapper = new querywrapper<dailyprice>().alleq((k, v) -> ((long) v) > 2000l, map);
      list<dailyprice> dailyprices = dailypriceservice.getbasemapper().selectlist(querywrapper);
    2. eq,很明显,=
    3. ne不等于
    4. 大于小于gt,lt,范围betweenlike,常用的关键字都有
    5. last直接拼接sql到最后,如:last("limit 1")
  3. 至于联合查询什么的,或者条件比较复杂的and,or啥的,我觉的还是直接在mapper.xml里直接写sql比较好,那样更简洁明了,它的语法查些简单的语句还是不错的

1.3. 附加知识点

  1. 在逐步研究mybatis-plus的过程中,遇到的一些实用知识点整理下

1.3.1. 跳过transient属性的值

  1. 我们从数据库所取的字段很多时候是有冗余的,加了transient字段,在controller层返回的时候,json会过滤掉它
  2. 还需要配置内容如下,主要是serializerfeature.skiptransientfield
@configuration
public class webconfig implements webmvcconfigurer {

    @override
    public void configuremessageconverters(list<httpmessageconverter<?>> converters) {
        fastjsonhttpmessageconverter fastjsonhttpmessageconverter = new fastjsonhttpmessageconverter();
        fastjsonconfig fj = new fastjsonconfig();
        // 跳过transient属性的值,浏览器兼容,日期自动格式化
        fj.setserializerfeatures(serializerfeature.skiptransientfield,serializerfeature.browsercompatible,serializerfeature.writedateusedateformat);
        fastjsonhttpmessageconverter.setfastjsonconfig(fj);
        converters.add(fastjsonhttpmessageconverter);
    }
   }

1.3.2. 日期自动格式化

  1. 对日期字段,返回前端需要的是格式化后的,所以也如上配置serializerfeature.writedateusedateformat即可

官网gitee:https://baomidou.gitee.io/mybatis-plus-doc/#/page-plugin
官网:https://mp.baomidou.com/guide/wrapper.html#abstractwrapper