MybatisPlus学习
1、快速开始
创建表:满足一般字段还需要version乐观锁、delete逻辑删除、gm_create创建时间 、gm_modified 修改时间
依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
注意:mysql如果是8.0以上的需要改变驱动以及在url后面添加时区设置 serverTimezone=GMT%2B8,还有部分情况下useSSL=true 会导致初始化sqlsessionfactory错误将useSSL初始化为false
配置:
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC
步骤:
1、写一个对应数据库的实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
2、写一个实现BaseMapper的接口给定泛型
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
3、测试
@SpringBootTest
class MybatispluslearningApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
//selectList中是一个条件构造器
List<User> userList = userMapper.selectList(null);
for (User user:userList) {
System.out.println(user.toString());
}
}
}
2、配置日志
我们所有的sql都是不可见的,我需要知道怎么执行的!
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
//可以选择sel4j log4j 日志输出 需要导入对应的依赖这里选择控制台输出
3、CRUD
1、添加
//简单的数据添加
@Test
void test1(){
@TableId(type = IdType.ID_WORKER)
User user=new User();
user.setName("java");
user.setAge(18);
user.setEmail("baidu@qq.com");
userMapper.insert(user);
}
id生成策略默认是一个雪花算法,分布式系统唯一id算法:
设定逐渐策略:
//数据库ID自增
AUTO(0),
/**
* 该类型为未设置主键类型
*/
NONE(1),
/**
* 用户输入ID
* 该类型可以通过自己注册自动填充插件进行填充
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 全局唯一ID (idWorker)
*/
ID_WORKER(3),
/**
* 全局唯一ID (UUID)
*/
UUID(4),
/**
* 字符串全局唯一ID (idWorker 的字符串表示)
*/
ID_WORKER_STR(5);
2、删除
关于逻辑删除:
物理删除就是数据库中完全移除,逻辑删除则是在数据库中没有删除,用一个变量控制显示。防止数据的丢失,类似于回收站。
1、数据库中增加字段
2、测试
查询也会自动凭借deleted=0;
3、修改
@Test
void test2(){
User user=new User();
user.setName("java");
user.setAge(3);
user.setId(5L);
user.setEmail("baidu@qq.com");
userMapper.updateById(user);
}
关于自动填充:(gm_create创建时间 、gm_modified 修改时间,阿里巴巴首次明确规定要自动生成与时间相关的数据)
3.1、方式一(数据库级别)
1、表中添加gm_create创建时间 、gm_modified 修改时间 字段 。
3.2、方式二(代码级别)
实体类的属性上需要添加注解!!!
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
编写处理器处理:
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入式的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill .....");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新式的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill .....");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
4、查询
@Test
void Test3(){
List<User> userList = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
userList.forEach(System.out::println);
}
@Test
void Test4(){
HashMap<String,Object> map=new HashMap<>();
map.put("name","java");
List<User> userList = userMapper.selectByMap(map);
userList.forEach(System.out::println);
}
分页查询
1、配置拦截器组件
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
2、测试(分页查询前都会有一个couter(1) 查询)
@Test
void Test5(){
Page<User> page=new Page<>(1,5);
IPage<User> userIPage = userMapper.selectPage(page, null);
userIPage.getRecords().forEach(System.out::println);
}
5、乐观锁
1、给数据库添加version字段!
2、同步实体类
@Version
private Integer version;
3、注册组件
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
6、条件构造器(解决复杂SQl)
@Test
void Test7(){
QueryWrapper<User> wrapper=new QueryWrapper();
wrapper.between("age",10,19);
Integer integer = userMapper.selectCount(wrapper);
}
7、代码自动生成器
下面代码3.5.0以上无法使用
1、依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-core</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2、代码
@Test
void contextLoads() {
//构建一个代码自动生成器对象
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.setSwagger2(true);
gc.setServiceName("%sService");
gc.setIdType(IdType.ID_WORKER);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.huang");
pc.setEntity("pojo");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);
//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user");//设置映射的表名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setLogicDeleteFieldName("deleted");
TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
strategy.setTableFillList(Arrays.asList(createTime,updateTime));
strategy.setVersionFieldName("version");
mpg.setStrategy(strategy);
//自动填充
mpg.execute();
}
8、性能分析插件
以往就是druid,目的就是分析每条sql执行的时间来解决慢sql问题
1、导入插件
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100);//能够执行最大时间,超过就不执行
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
2、配置添加
spring.profiles.active=dev