一、 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.使用建议
- 业务逻辑比较简单,当类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的, 即业务逻辑大多数是对单表操作,简单,直观 一个类就包括了数据访问和业务逻辑.
- ActiveRecord虽然有业务逻辑, 但基本上都是基于单表的. 跨表逻辑一般会放到当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)中.
- 如果对象间的关联越来越多, 你的事务脚本越来越庞大, 重复的代码越来越多, 就不建议使用了
- 模型容易混乱,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;
}
- 使用
注意
- 乐观锁数据类型支持int、integer、long、timestamp
- 仅支持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的检索条件