Mybatis-plus入门
引入依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
不要同时引入mybatis和mybatis-plus。
连接配置
spring:
datasource:
url: jdbc:mysql://xx.xx.xx.xx:3306/cc?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&useUnicode=true
#mysql8版本必须要配置时区
username: root
password: xxx
type: com.alibaba.druid.pool.DruidDataSource #制定了数据源的类型,屏蔽掉了官方自动配置的数据源
driver-class-name: com.mysql.cj.jdbc.Driver
不用手写mapper文件中的内容
直接继承basemapper类就可以使用全部的crud操作
配置日志
mybatis-pluss.confurtion.log-iml=org.apache.ibatis.logging.stdout.StdOutImpl
主键生成策略(主键没有自增insert填充id):
雪花算法:自动生成也全球唯一的id
解决:@tableId(type = ==idType=AUTO==) 数据库主键设置自增即可。
idType解释
idType=input:手动输入。为输入值
none:没有主键
创建时间,更新时间
1.数据库操作
新建两个字段,,设置默认值为CURRENT_TIMESTAMP,相当于新建触发器!增加操作的时间由于没插入时间,触发器启动,自动设置为默认值。更新也是。
2.代码操作
@TableFiled(fill = FiledFill.INSERT)(插入的时候填充)
@TableFiled(fill = FiledFill.INSERT_UPDATE)(更新的时候填充)
**
* 自动填充处理器
*/
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时候的填充策略
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date().getTime(), metaObject);
this.setFieldValByName("updateTime", new Date().getTime(), metaObject);
}
//更新时候的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date().getTime(), metaObject);
}
}
@Test
public void test() {
Customer customer = new Customer();
customer.setName("sjfl");
customer.setBirth(new Date());
customer.setEmail("djsa.com");
int insert = userMapper.insert(customer);
System.out.println(customer);
}
@Test
public void test1() {
Customer customer = new Customer();
customer.setId(69);
customer.setName("sjfl");
customer.setBirth(new Date());
customer.setEmail("dsafewreq.com");
int insert = userMapper.updateById(customer);
System.out.println(customer);
}
}
@Data
@NoArgsConstructor
@ToString
@AllArgsConstructor
@TableName("customers") //指定表名
public class Customer {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String email;
private Date birth;
@TableField(exist = false) //字段不存在数据表中
private String picture;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
乐观锁
1.数据库中增加字段
2.实体类中添加对应字段
@version
private Integer version;
3.注册组件
@Configuration
@EnableTransactionManagement
@MapperScan("com.zero.dao")
public class MyBatisPlusVersion {
//注册乐观锁插件
@Bean
public MybatisPlusInterceptor optimisticLockerInnerInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
@Test
public void test2() {
final Customer customer = userMapper.selectById(68);
customer.setName("chengli");
final Customer customer1 = userMapper.selectById(68);
customer1.setName("tst");
userMapper.updateById(customer1);
userMapper.updateById(customer);
//结果为线程1 更新事变,因为获取的版本和更新时候的版本不一致,所以失败
}
逻辑删除
在表中存储一个deleted字段,然后在实体类中增加字段
@Tablelogical添加注解
然胡在配置文件中设置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启sql日志
global-config:
db-config:
logic-delete-value: 1 #配置逻辑删除
logic-not-delete-value: 0
然后测试就行了。以后所有的增删改查都会带上删除字段对应没删除
条件构造器
用于处理复杂SQL
@Test
public void Test() {
final QueryWrapper<Customer> objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.isNotNull("photo")
.le("birth", new Date());
userMapper.selectList(objectQueryWrapper).forEach(System.out::println);
}
@Test
public void test5() {
final QueryWrapper<Customer> wrapper = new QueryWrapper<>();
wrapper.inSql("id", "select id from customers where id < 3")
.orderByDesc("id" );
userMapper.selectList(wrapper).forEach(System.out::println);
}
代码生成器
引入依赖以及相关mybatis的配置
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
开发配置:
自动数据库字段
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时候的填充策略
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
//更新时候的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
mybatisPlus插件
@Configuration
@EnableTransactionManagement
@MapperScan("com.zero.dao")
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public MybatisPlusInterceptor optimisticLockerInnerInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
//分页插件
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//分页拦截器
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setOverflow(true);//溢出的时候是否调回首页
paginationInnerInterceptor.setMaxLimit(-1L);//限制每页最大条数,-1不限
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
return mybatisPlusInterceptor;
}
//注册逻辑删除组件
// @Bean
// public ISqlInjector sqlInjector() {
// return new LogicSqlInjector();
// }
}
//高版本不用逻辑删除组件,需要配置yml文件:
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启sql日志
global-config:
db-config:
logic-delete-value: 1 #配置逻辑删除
logic-not-delete-value: 0
package com.example.lostfound;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.NamingStrategy;
import java.util.ArrayList;
/**
* @Author Zero
* @Date 2021/8/10 23:42
* @Since 1.8
* @Description
**/
public class MyGenerator {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir"); //当前项目路径
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("zero");
gc.setOpen(false); //是否打开资源管理器
gc.setSwagger2(true); //实体属性 Swagger2 注解
gc.setFileOverride(false);//是否覆盖
gc.setServiceName("%sService");//去掉service的I前缀
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://82.157.191.65:3600/lost_found?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("chl252599");
dsc.setDbType(DbType.MYSQL);//设置数据库为MySQL类型
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
//pc.setModuleName(scanner("模块名"));
pc.setModuleName("lostfound");
pc.setParent("com.example");//设置模块父路径
pc.setEntity("entity");
pc.setController("controller");
pc.setMapper("mapper");
pc.setService("service");
pc.setServiceImpl("impl");
mpg.setPackageInfo(pc);
//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("t_found_commont","t_found_thing","t_loss_commont","t_loss_thing","t_permission","t_user","t_user_permission");
strategy.setNaming(NamingStrategy.underline_to_camel);//包开启驼峰命名
strategy.setColumnNaming(NamingStrategy.underline_to_camel); //字段开启驼峰命名
strategy.setEntityLombokModel(true);//自动了lombok
strategy.setLogicDeleteFieldName("deleted");//设置逻辑删除
//设置自动填充
TableFill gmtCreate = new TableFill("last_login_time", FieldFill.INSERT);//插入填充
final ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
strategy.setTableFillList(tableFills);
//乐观锁
//strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(true);//controller层设置rest风格
strategy.setControllerMappingHyphenStyle(true);//开启controller访问下划线命名s
mpg.setStrategy(strategy);
mpg.execute();
}
}