MybatisPlus 高级进阶

本文详细介绍了MybatisPlus的使用,包括自定义XML实现SQL脚本,全局配置文件设置,如日志输出和SQL打印。还探讨了SQL性能优化,强调了指定查询字段的重要性。此外,讲解了乐观锁的概念及其在MybatisPlus中的实现,以及MybatisPlus的逻辑删除功能,如何避免物理删除带来的问题。最后,展示了如何配置乐观锁插件和逻辑删除字段。
摘要由CSDN通过智能技术生成

一、 MybatisPlus 自定义xml的sql脚本

1.新建xml  在resources|mapper目录|BannerMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--这个名称空间是Mapper接口的路径,记得修改-->
<mapper namespace="net.hlx.shop0907.mapper.BannerMapper">
    <!--配置查询所有-->
   <select id="all" resultType="net.hlx.shop0907.vo.BannerDO">
       select * from banner
   </select>
</mapper>

 2.配置文件告诉mapper.xml路径(如果采用默认路径可以不配)-application.xml

源码:

3.测试

 

 

二、MybatisPlus全局配置文件

  • 创建mybatis-config.xml
   <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--控制台输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

 注意:config-location和configuration不能同时出现,需要注释配置文件里的相关配置

#配置mybatis plus打印sql日志
#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#默认配置xml路径
mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml

#配置最新全局配置mybatis-config.xml文件,上面的日志注释了
mybatis-plus.config-location=classpath:mybatis-config.xml
  • 配置文件配置 自定义sql的包扫描-application.properties
② 配置文件配置 自定义sql的包扫描-application.properties
#配置mybatis的实体类路径
mybatis-plus.type-aliases-package=net.hlx.shop0907.vo
  • mybatis-config.xml改为如下:可以测试一下
<!--<select id="all" resultType="net.hlx.shop0907.vo.BannerDO">-->
<select id="all" resultType="BannerDO">
    select * from banner
</select>
  • mybatis plus下划线转驼峰配置,默认就是true
mybatis plus下划线转驼峰配置,默认就是true
mybatis-plus.configuration.map-underscore-to-camel-case=true
  • 配置全局默认主键类型,实体类就不用加 @TableId(value = "id", type = IdType.AUTO)
mybatis-plus.global-config.db-config.id-type=auto

运行测试:

 解决:

 三、SQL性能优化面试题之Mybatis Plus指定select字段查询

面试题:select * 和 select 指定字段的区别

(1)网络IO问题

select * 会查出所有的字段,有些是不需要的,当应用程序和服务器不在同一个局域网时,字段过多会影响网络传输的性能

(2)索引问题

在指定字段有索引的情况下,mysql是可以不用读data,直接使用index里面的值就返回结果的。但是一旦用了select *,就会有其他列需要从磁盘中读取才会返回结果,这样就造成了额外的性能开销

MybatisPlus指定查询字段

bannerMapper.selectList(new QueryWrapper<BannerDO>().select("id","url"));

 

四、Mybatis Plus的探索-ActiveRecord使用 

1.什么是ActiveRecord(只做简单了解即可)

Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。

2.Mybatis Plus对AR有一定支持, 在MP中开启AR,仅需要实体类继承Model类即可

@Data
@TableName("banner") //表名映射
public class BannerDO extends Model<BannerDO> 
 {
    //属性
    @TableId(value = "id",type = IdType.AUTO) //主键自动标识
    private Integer id;
    private String img;
    private String url;
    @TableField("weight") //属性名与数据库表的字段名不一致
    private Integer weight;

    //数据库表中没有这个字段
    @TableField(exist = false) //默认true是存在,修改成false不存在;
    private String address;

3.测试 

4.使用建议

  1. 业务逻辑比较简单,当类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的, 即业务逻辑大多数是对单表操作,简单,直观 一个类就包括了数据访问和业务逻辑.
  2. ActiveRecord虽然有业务逻辑, 但基本上都是基于单表的. 跨表逻辑一般会放到当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)中.
  3. 如果对象间的关联越来越多, 你的事务脚本越来越庞大, 重复的代码越来越多, 就不建议使用了
  4. 模型容易混乱,ActiveRecord保存了数据, 使它有时候看上去像数据传输对象(DTO). 但是ActiveRecord有数据库访问能力, 所以所以分布式或者大型项目基本不用

              POJO: model/domain/dto/vo/bo/do

五、数据库高并发更新必备技能之乐观锁

1.什么是乐观锁

  每次去拿数据的时候都认为别人不会修改,更新的时候会判断是别人是否回去更新数据,通过版本来判断,如果数据被修改了就拒绝更新。

Java里面大量使用CAS, CAS这个是属于乐观锁,性能较悲观锁有很大的提高

AtomicXXX 等原子类底层就是CAS实现,一定程度比synchonized好,因为后者是悲观锁

小结:悲观锁适合写操作多的场景,乐观锁适合读操作多的场景,乐观锁的吞吐量会比悲观锁多

2.数据库的乐观锁

   大多是基于数据版本 (Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。 读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据,库表对应记录的当前版本信息进行比对,如果提交的数据 版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

六、Mybatis Plus高手系列之乐观锁插件

Mybatis Plus里面自带一个插件,可以帮我们轻松实现乐观锁

使用

  • 实体类增加version属性配置
@Version
private Integer version;
  • 数据库增加version版本字段

      

  • 增加乐观锁插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
    //拦截器对象
    MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
    //分页插件(数据库MYSQL)
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    //乐观锁插件
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}
  • 使用

           

 

注意

  1. 乐观锁数据类型支持int、integer、long、timestamp
  2. 仅支持updateById和update方法

 七、Mybatis Plus高手系列之逻辑删除配置

1、什么是逻辑删除

 很多互联网公司在数据库设计规范中都加入了逻辑删除的强制规定,运营人员可以分析和审查数据,也方便将数据沉淀下来用于商业分析;比如用户删除了订单,只不过是更新了标记,不会真正的物理删除。

2、数据量过多,也会采用数据仓库,通过监听应用数据库的数据数据变化,进行迁移到数据仓库

3、MybatisPlus如何使用

  • 数据库增加deleted字段,0是未删除,1表示删除

      

  • 实体类增加属性配置@TableLogic 或者 在配置文件增加指定
@TableLogic
private Integer deleted;
  • 配置文件新增配置
#删除是1
mybatis-plus.global-config.db-config.logic-delete-value=1
#未删除是0
mybatis-plus.global-config.db-config.logic-not-delete-value=0
​
#如果java实体类没加注解@TableLogic,则可以配置这个,推荐这里配置
mybatis-plus.global-config.db-config.logic-delete-field=deleted
  • 测试

 

4、验证结果:

     deleteById删除后就是,结果就是更新字段

    查询的时候会自动拼接上deleted=0的检索条件

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值