文章目录
MybatisPlus自定义xml的sql脚本
与Mybatis自定义xml是sql脚本没有区别
<?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">
全局配置文件
config-location和configuration不能同时出现
application.properties
# 第一种
# 配置mybatis plus打印sql⽇志
#mybatis-plus.configuration.logimpl=org.apache.ibatis.logging.stdout.StdOutImpl
# 第二种
# 配置最新全局配置⽂件
mybatis-plus.config-location=classpath:mybatis-config.xml
#配置mybatis包路径
mybatis-plus.type-aliases-package=net.xdclass.shopmanager.model
#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
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>
【面试】性能优化之指定select字段查询
select *
和 select
指定字段的区别
网络IO问题
select *
会查出所有的字段,有些是不需要的,当应用程序和服务器不在同⼀个局域网时,字段过多会影响网络传输的性能
索引问题
在指定字段有索引的情况下,mysql是可以不用读data,直接使用index里面的值就返回结果的。但是⼀旦用了select *,就会有其他列需要从磁盘中读取才会返回结果,这样就造成了额外的性能开销
MybatisPlus指定查询字段
bannerMapper.selectList(new QueryWrapper<BannerDO>().select("id","name"));
乐观锁
定义:每次取数据的时候都认为别人不会修改,更新的时候判断别⼈是否已经修改了数据,通过版本来判断,如果数据被修改了就拒绝更新
Java里面⼤量使用CAS,CAS属于乐观锁,性能较悲观锁有很大提高
AtomicXXX等原子类底层就是CAS实现,⼀定程度比synchonized好,因为后者是悲观锁
悲观锁适合写操作多的场景,乐观锁适合 读操作 多的场景,乐观锁的吞吐量会比悲观锁多
数据库的乐观锁
⼤多是基于数据版本 (Version)记录机制实现。
数据版本:为数据增加⼀个版本标识,在基于数据库表的版本解决方案中,⼀般是通过为数据库表增加⼀个version
字段来实现。
读取出数据时,将此版本号⼀同读出,之后更新时,对此版本号+1
。此时,将提交数据的版本数据与数据,库表对应记录的当前版本信息进行比对,如果提交的数据版本号⼤于数据库表当前版本号,则予以更新,否则认为是过期数据
乐观锁实战
Mybatis Plus自带⼀个插件,可以轻松实现乐观锁
1、实体类增加version属性配置
@Version
private Integer version;
2、数据库增加version版本字段
CREATE TABLE `banner` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`img` varchar(524) DEFAULT NULL COMMENT '图⽚',
`url` varchar(524) DEFAULT NULL COMMENT '跳转地址',
`weight` int(11) DEFAULT NULL COMMENT '权重',
`version` int(11) DEFAULT '1' COMMENT '乐观锁版本号',
`deleted` int(11) DEFAULT '0' COMMENT '0是未删除,1是已经删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
3、增加乐观锁插件
public class MybatisPlusPageConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
注意:
- 乐观锁数据类型支持int、integer、long、timestamp
- 仅支持updateById和update方法
测试乐观锁
@Test
public void testOptimi(){
//先根据ID找记录,得到id 和 version
BannerDO bannerDO = new BannerDO();
bannerDO.setVersion(1);
bannerDO.setId(1);
bannerDO.setUrl("open1024.com");
bannerMapper.updateById(bannerDO);
}
先根据ID找记录,得到id=1和version=1,修改了url,更新时判断version,如果version等于1
则更新成功,如果version不等于1
则更新失败
MybatisPlus逻辑删除
简单来说,就是用户删除了订单,只不过是更新了标记,不会真正的物理删除。这样运营⼈员可以分析和审查数据,也⽅便将数据沉淀下来用于商业分析
数据库增加deleted字段(0是未删除,1表示删除)实体类增加属性配置@TableLogic
或者在配置文件增加指定
1、实体类增加属性配置
@TableLogic
private Integer deleted;
2、配置文件新增配置
#删除是1
mybatis-plus.global-config.db-config.logicdelete-value=1
#未删除是0
mybatis-plus.global-config.db-config.logicnot-delete-value=0
#如果java实体类没加注解@TableLogic,则可以配置这个,推荐这⾥配置
mybatis-plus.global-config.db-config.logicdelete-field=deleted
注意:
- deleteById删除后就是,结果就是更新 字段
- 查询的时候会⾃动拼接上
deleted=0
的检索条件