mybatis增强版,对mybatis只做增强不做改变,引入它不会对现有工程产生影响
基础配置:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/ssm?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# mybatis打印日志
@Repository
public interface UserMapper extends BaseMapper<User> {
}
数据库id默认插入值:全局的唯一id
雪花算法:twitter发明的分布式ID生成算法,本质是一个long型int,核心思想:41bit为毫秒数,10bit作为机器的ID,12bit为毫秒内的流水号,最后还有一个永远为0的符号位,几乎可以保证全球唯一。
主键自增:1.实体类相应字段上@TabledId(type=IdType.AUTO) 2.数据库相应字段要自增
NONE 未设置主键
INPUT 手动输入
ID_WORKER 默认全局唯一ID
uuid 全局唯一ID
mybatis的自动填充
1.数据库层面
(1)在创建时间字段的时候
DEFAULT CURRENT_TIMESTAMP
表示当插入数据的时候,该字段默认值为当前时间
ON UPDATE CURRENT_TIMESTAMP
表示每次更新这条数据的时候,该字段都会更新成当前时间
这两个操作是mysql数据库本身在维护,所以可以根据这个特性来生成【创建时间】和【更新时间】两个字段,且不需要代码来维护
如下:
CREATE TABLE `mytest` ( `text` varchar(255) DEFAULT '' COMMENT '内容', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2)更新实体类字段
private Date create_time
private Date update_time
2.代码层面
实体类上相应字段上添加@tablefield字段,(数据库相应字段上取消current_timestamp),编写处理类MetaObjectHandler处理增加/更新数据时的事件。
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date create_time;
@TableField(fill=FieldFill.INSERT_UPDATE)
private Date update_time;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("insert is finsh");
this.setFieldValByName("create_time",new Date(),metaObject);
this.setFieldValByName("update_time",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("update_time",new Date(),metaObject);
}
}
乐观锁
数据库新增字段version,默认值为1,实例类亦然,version字段加上@version标签。注册MP乐观锁组件
@Configuration
@EnableTransactionManagement
@MapperScan("com.wu.mybatisdemo.mapper")
public class OptimisticConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
查询
@Test
void SelectT(){
List<User> lists=userMapper.selectBatchIds(Arrays.asList(1,2,3));
lists.forEach(System.out::println);
}
@Test
void SelectT(){
HashMap<String,Object> map=new HashMap<String,Object>();
map.put("name", "wu");
List<User> users=userMapper.selectByMap(map);
users.forEach(System.out::println);
}
分页
注册分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
//paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
@Test
void PageT( ){
//参数一:当前页 参数二:一页多少个记录
Page page=new Page(1,5);
userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
System.out.println(page.getTotal());
}
逻辑删除
数据库加deleted字段,实体类加字段和@Tablelogic注解,注册逻辑删除插件,properties里设置逻辑删除和保存的符号。
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
性能分析插件
1.config里注册插件
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor=new PerformanceInterceptor();
performanceInterceptor.setFormat(true);
performanceInterceptor.setMaxTime(1);
return performanceInterceptor;
}
2.properties里把profile改为开发环境
spring.profiles.active=dev
条件构造器
@Test
void wrapperT(){
QueryWrapper<User> queryWrapper=new QueryWrapper();
queryWrapper.isNotNull("name")
.isNotNull("age")
.ge("age",24);
List<User> users=userMapper.selectList(queryWrapper);
}
@Test
void wrapperT2(){
QueryWrapper<User> queryWrapper=new QueryWrapper();
queryWrapper.like("name","o")
.likeLeft("email","om");
User user=userMapper.selectOne(queryWrapper);
System.out.println(user);
}
@Test
void wrapperT3(){
QueryWrapper<User> queryWrapper=new QueryWrapper();
// inSql("id", "select id from table where id < 3")--->id in (select id from table where id< 3)
queryWrapper.inSql("age","select age from user where name like '%o%'");
List<User> users=userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
@Test
void wrapperT4(){
QueryWrapper<User> queryWrapper=new QueryWrapper();
queryWrapper.orderByDesc("age");
List<Map<String,Object>> maps=userMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
代码自动生成器
package com.mpt.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
public class MPTConfig {
public static void main(String[] args){
// 需要构建一个 代码自动生成器 对象
AutoGenerator mpg = new AutoGenerator();
//配置策略
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath+"/src/main/java");
gc.setAuthor("吴神说");
gc.setOpen(false);
gc.setFileOverride(false);//是否覆盖
gc.setServiceName("%sService");//去Service的I前缀
gc.setIdType(IdType.ID_WORKER);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
//2、设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/ssm?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
//3、包的配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("wublog");
pc.setParent("com.mpt.demo");
pc.setEntity("entity");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);
//4、策略配置
StrategyConfig strategy =new StrategyConfig();
strategy.setInclude("user");//设置要映射的表名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);// 自动Lombok;
strategy.setLogicDeleteFieldName("deleted");
//自动填充配置
TableFill create_time=new TableFill("create_time", FieldFill.INSERT_UPDATE);
TableFill update_time=new TableFill("update_time", FieldFill.UPDATE);
ArrayList<TableFill> tableFills=new ArrayList<>();
tableFills.add(create_time);
tableFills.add(update_time);
strategy.setTableFillList(tableFills);
//乐观锁
strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategy);
mpg.execute();
}
}