• Mybaits-plus实战(二)


    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

  • 相关阅读:
    [转]三五个人十来条枪 如何走出软件作坊成为开发正规军
    [转]asp.net页面字体变大问题总结
    [练手7]传值和传引用区别
    [练手3]选择排序
    [练手5]希尔排序
    oracle用select for update 中断后无法操作表的处理:杀掉SESSION
    [转]最省时管理法:让你一天随意
    [练手4]插入排序
    没有对“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”的写访问权限
    NUnit单元测试编写指南
  • 原文地址:https://www.cnblogs.com/sky-chen/p/10775856.html
Copyright © 2020-2023  润新知