Mybaits-plus实战(二)-程序员宅基地

技术标签: ViewUI  前端  json  数据库  

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

转载于:https://www.cnblogs.com/sky-chen/p/10775856.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33910137/article/details/94462660

智能推荐

Android升级butterknife,如何升级使用butterknife10.1.0及使用注意事项-程序员宅基地

butterknife 是一款能够提高android代码效率的一个编译插件,只需要按照文档教程在规定的地方写好注解,然后在代码规定的地方启动,就能够自定帮你初始化View控件,避免在代码中出现n多的findViewById方法。配合Android ButterKnife Injections这款Android Studio插件将xml和代码关联起来,效率又提高一个层级。添加butterknife1..._butterknife升级

Undefined symbols_undefinedsymbols-程序员宅基地

xcode编译错误Undefined symbols ld: symbol(s) not found for architecture i386clang: error: linker command failed with exit code 1 (use -v to see invocation)网上很多解决方法是 在工作左边导航栏T_undefinedsymbols

IE和Firefox的兼容问题_div.append ie浏览器不支持吗-程序员宅基地

1、Event的问题 在ie中我们可以直接使用event变量,但是在firefox下由于event是局部变量,firefox下我们可以事件绑定到元素上 例如 为了同时兼容ie和firefox 通常在函数种通过以下代码获得事件。 var theEvent = window.event||e; var srcElement = theEvent.srcElement; if (!srcE_div.append ie浏览器不支持吗

FATFS文件系统,实现基于STM32F103_51 支持 fatfs-程序员宅基地

文件系统键值文件系统负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。即在磁盘上组织文件的方法。常见的文件系统FAT/FATFS(小型的嵌入式) NTFS CDFS(光盘) exFATFATFS可以移植到51,PIC,AVR,SH,Z80,H8,ARM等单片机上支持FAT12,FAT16,FAT32支持多个存储媒介,有独立缓冲区,对多个文件进行读写,对8位和16位单片机做了优化可裁剪(可以配置哪些功能要,哪些不要)层次结构解读_FS_TI_51 支持 fatfs

数据库迁移神器——Flyway-程序员宅基地

每天早上七点三十,准时推送干货Hello 大家好,我是阿粉,不知道你有没有遇到过这种场景,一套代码部署在不同的环境中,随着时间的过去,各个环境代码有版本差异,代码层面可以通过不同的版本来..._flyway数据迁移

HTML 与XHTMML之间的区别-程序员宅基地

1、xhtml单标签后边需要加 /2、xhtml的标签必须为小写3、xhtml的属性值必须加双引号

随便推点

Boost::bind-程序员宅基地

bind库在boost库导论中被称作绑定器,其实在STL中已经有类似的功能,称之为函数配接器《C++标准库》中说明“所谓函数配接器是指能够将仿函数和另一个仿函数(或某个值,或某个一般函数)结合起来的仿函数” 在STL中,对于函数对象,成员函数,一般函数分别设计了绑

吴恩达deeplearning.ai最后一课上线,下一次得等多少年?-程序员宅基地

喜大普奔!今天,吴恩达的深度学习系列课程最后一课上线了!去年6月,吴恩达宣布deeplearning.ai创业项目,8月,该项目揭晓:一套由5门课组成的深度学习系列课程——Deep Learning Specialization,旨在推广普及深度学习知识。前3门课程一上线便引发了一股热潮,然而一直到11月,第4门课程才姗姗来迟,之后,吴老师又陷入了沉寂期,开始忙活自己的另外两个创业项目:L

mysql workbench导入mdb_如何将MDB(Access)文件转换为MySQL(或纯SQL文件)?_乖神队长的博客-程序员宅基地

你想转换mdb到mysql(直接传输到mysql或mysql转储)?尝试一个名为访问MySQL的软件。访问MySQL是一个小程序,将Microsoft Access数据库转换为MySQL。向导界面。直接从一台服务器传输数据到另一台。创build一个转储文件。select要传输的表格。select要传输的字段。传输密码保护数据库。支持共享安全和用户级安全。可选的索引转移。可选传输logging。字段..._myworkbench6.3导入access

Linux 学习之RPM包管理-yum在线管理-yum命令-程序员宅基地

yum常用命令:注:yum在线管理1、查询:查询所有可用软件包列表yum list用法,连接网络的情况下,任何地方都可以执行该命令进行查询2、yum search 关键字搜索服务器上所有和关键字相关的包3)yum 安装:yum -y install 包名选项: install 安装 -y 自动...

小程序之WebSocket-程序员宅基地

一,首先大家要先了解一下什么是WebSocketWebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。原先的http协议,无法实现服务器主动向客户端发起消息,如果想动态获取服务器数据,浏览器需要不断的向服务器发出请求,那么只有轮询,然而这样,极易消耗服务器资源,打一个比喻,就好比打电话,http:客户端:喂,大哥啊,有没有新的数据啊服务器:没有,...