目录
MybatisPlus文档,选择快速开始,创建数据库,依次执行下方代码
创建项目并导入对应的依赖,尽量不要同时导入mybatis和mybatis-plus
快速入门
MybatisPlus文档,选择快速开始,创建数据库,依次执行下方代码
-- 如果数据库中存在user表则删除,然后创建新的
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
-- 添加数据
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
创建项目并导入对应的依赖,尽量不要同时导入mybatis和mybatis-plus
pom.xml
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
配置文件
application.properties 连接数据库
# 数据库连接配置
# myslq 5 驱动不同 com.mysql.jdbc.Driver
# myslq 8 驱动不同 com.mysql.cj.jdbc.Driver 且高版本是兼容低版本的、需要增加时区的配置 serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
使用pring.datasource.data-password=123456 和 spring.datasource.data-username=root有报错,
修改spring.datasource.username=123456 和 spring.datasource.password=root 可正常运行
参考文章:https://www.cnblogs.com/maigy/p/11517861.html
idea可以直接连接数据库
编写代码
user实体类
package com.zt.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author zhangt
* @create 2020-12-16 15:31
* @description 功能描述
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
mapper,需要添加注解
package com.zt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zt.pojo.User;
import org.springframework.stereotype.Repository;
/**
* @author zhangt
* @create 2020-12-16 15:34
* @description 功能描述
*/
@Repository
public interface UserMapper extends BaseMapper<User> {
}
添加注解
package com.zt;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.zt.mapper")
@SpringBootApplication
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
测试
package com.zt;
import com.zt.mapper.UserMapper;
import com.zt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
//查询所有
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
}
配置日志
控制台输出日志
# 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
CRUD扩展
1.主键生成策略
(雪花算法:是Twitter开元的分布式ID生成算法,结果是一个long型的ID——41bit作为毫秒数,10bit机器ID(5个数据中心,5个机器ID),12big毫秒内的流水号,一个符号位,永远是0)
如果实体类中的id是Long类型会使用雪花算法,如果是Integer是0(注意实体类的类型是Long,否则生成失败)
使用方法:在实体类user的id字段上添加注解@TableId(type = IdType.AUTO)
数据库中的id字段要设置自增
注解名称 | 注解含义 |
---|---|
AUTO(0) | 数据库id自增 |
NONE(1) | 未设置主键 |
INPUT(2) | 手动输入 |
ID_WORKER(3) | 默认,全局唯一的id |
UUID(4) | 全局唯一的ID——uuid |
ID_WORKER_STR(5) | 字符串表示法 |
2.自动填充时间字段
方式一 在表中添加(创建时间——create_time;修改时间——update_time;)字段,类型是datetime,默认值是CURRENT_TIMESTAMP(设置当前时间为默认值),并勾选更新列(或勾选根据当前时间戳更新);实体类也需要同步,然后测试
private Date createTime;
private Date updateTime;
方式二 实体类字段属性添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
编写处理器来处理注解
package com.zt.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @description 处理器,关于 create_time和 update_time
*/
@Slf4j
@Component //添加处理器到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill...");
// MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("update insert fill...");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
测试插入和更新,观察时间变化
3.乐观锁
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,携带这个version
- 执行更新时,set version = newVersion where version = oldVersion
- 如果version不相等,更新失败
- 数据库添加version字段(Integer类型,默认值1)
- 实体类中添加version
@Version //乐观锁version注解
private Integer version;
3.注册组件
package com.zt.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@MapperScan("com.zt.mapper")
@EnableTransactionManagement
@Configuration //配置类
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
4.测试
成功
/**
* 测试乐观锁成功
*/
@Test
void testOptimisticLockerForSuccess() {
User user = userMapper.selectById(1L);
user.setName("乐观锁修改成功");
userMapper.updateById(user);
}
失败
/**
* 测试乐观锁失败,多线程下
*/
@Test
void testOptimisticLockerForFail() {
//线程1
User user = userMapper.selectById(1L);
user.setName("乐观锁修改成功111111");
//线程2,模拟插队操作
User user2 = userMapper.selectById(1L);
user2.setName("乐观锁修改成功22222");
userMapper.updateById(user2);
userMapper.updateById(user);//如果没有乐观锁,就会覆盖插队线程的内容
}
4.查询操作
/**
* 查询所有
*/
@Test
void testSelectAll() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
/**
* 根据Id查询
*/
@Test
void testSelectById() {
User user = userMapper.selectById(1L);
System.out.println(user);
}
/**
* 测试批量查询
*/
@Test
void testSelectBatchIds() {
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 1340910531137568769L, 1340911039092948995L));
users.forEach(System.out::println);
}
/**
* 条件查询之一使用map操作
*/
@Test
void testSelectByMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("name","张三修改333");
map.put("age","11");
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
5.分页查询
1.配置拦截器组件
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
2.直接使用Page对象
/**
* 测试分页查询
*/
@Test
void testPage() {
Page<User> page = new Page<>(3,3);
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
}
删除操作
1.基本的删除操作
/**
* 删除操作
*/
//根据Id删除
@Test
void testDeleteById() {
userMapper.deleteById(1340907609960079361L);
}
//通过Id批量删除
@Test
void testDeleteBatchIds() {
userMapper.deleteBatchIds(Arrays.asList(1340910531137568769L,1340911039092948993L,1340911039092948994L));
}
//通过map条件删除
@Test
void testDeleteMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("name","乐观锁修改成功");
userMapper.deleteByMap(map);
}
2.逻辑删除
数据库添加字段:deleted,类型int,默认值0,逻辑删除
实体类中增加属性
@TableLogic //逻辑删除
private Integer deleted;
3.配置
//逻辑删除组件
@Bean
public ISqlInjector iSqlInjector(){
return new LogicSqlInjector();
}
properties
#配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
4.测试
执行删除操作,实际上是修改deleted字段值,逻辑删除之后的内容通过代码查询不到,数据库中还存在
性能分析插件
作用:性能分析拦截器,用于输出每条SQL语句及其执行时间
1.配置,导入插件(注意:要在spirngboot中配置环境为dev或test)
//SQL执行效率插件
@Bean
@Profile({"dev","test"}) //设置 dev test环境开启,保证效率
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100); //ms 设置sql执行的最大时间,如果超过了则不执行
performanceInterceptor.setFormat(true); //是否格式化
return performanceInterceptor;
}
2.测试
查看sql语句是否格式化
条件构造器
Wrapper:使用复杂的sql使用wrapper代替
package com.zt;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zt.mapper.UserMapper;
import com.zt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class WrapperTests {
@Autowired
private UserMapper userMapper;
/**
* 查询操作
*/
@Test
void testSelectAll() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.isNotNull("name") //不为空 IS NOT NULL
.isNotNull("email")
// .ge("age",12) //大于等于 >=
.between("age",20,25) //区间 BETWEEN 20 AND 25
// .eq("email","test3@baomidou.com") //等于 =
.notLike("name","e") //模糊查询 NOT LIKE '%e%' 左右表示%在左或者右%e%
.likeRight("email","t") //LIKE 't%'
.likeLeft("email","m"); //LIKE '%m'
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
//模糊查询
@Test
void testSelectBySqlId() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.inSql("id","select id from user where id<7");
userMapper.selectObjs(wrapper).forEach(System.out::println);
}
//通过id进行排序
@Test
void testSelectOrderById() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
// .orderByDesc("id"); //降序
.orderByAsc("id"); //升序
userMapper.selectList(wrapper).forEach(System.out::println);
}
}
代码自动生成器
遇到的问题:
1.报错信息:java.lang.ClassNotFoundException: org.apache.velocity.context.Context
2.要注意pom中的jar配置
整体代码,需要配置四个部分的代码
- config下的mybatisPlus的配置类
package com.zt.config;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author zhangt
* @create 2020-12-23 14:02
* @description 功能描述
*/
@MapperScan("com.zt.mapper")
@EnableTransactionManagement
@Configuration //配置类
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
//逻辑删除组件
@Bean
public ISqlInjector iSqlInjector(){
return new LogicSqlInjector();
}
//SQL执行效率插件
@Bean
@Profile({"dev","test"}) //设置 dev test环境开启,保证效率
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100); //ms 设置sql执行的最大时间,如果超过了则不执行
performanceInterceptor.setFormat(true); //是否格式化
return performanceInterceptor;
}
}
- application.properties 配置文件
#服务端口
server.port=9000
#设置开发环境
spring.profiles.active=dev
#禁用模板缓存
spring.thymeleaf.cache=false
# 数据库连接配置
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
- 代码自动生成器
package com.zt;
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.*;
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 org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
/**
* 代码自动生成器
*/
@SpringBootTest
public class AutoGeneratorTests {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir"); //项目路径 E:\javaworkspace\mybatis-plus-auto/src/main/java
gc.setOutputDir(projectPath + "/src/main/java"); //项目路径下 E:\javaworkspace\mybatis-plus-auto + /src/main/java
gc.setAuthor("zhangt"); //作者注释
gc.setOpen(false); //是否打开windows文件夹
gc.setFileOverride(false); //是否覆盖原文件
gc.setServiceName("%sService"); //去Service的I前缀
gc.setIdType(IdType.AUTO);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true); //实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 2、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 3、包配置
PackageConfig pc = new PackageConfig();
// pc.setModuleName("blog"); //如果添加,可理解为com.zt.blog 创建地址是 E:\javaworkspace\mybatis-plus-auto + /src/main/java + \com\zt + \blog\ + \blog\entity
pc.setParent("com.zt"); //创建目录 E:\javaworkspace\mybatis-plus-auto + /src/main/java + \com\zt\blog\entity
pc.setEntity("entity");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);
// 4、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user","shops","files"); // 设置要映射的表名,可多个
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true); // 自动lombok;
strategy.setLogicDeleteFieldName("deleted");
// 5、自动填充配置
TableFill gmtCreate = new TableFill("create_time", FieldFill.INSERT);
TableFill gmtModified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
tableFills.add(gmtModified);
strategy.setTableFillList(tableFills);
// 6、乐观锁
strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategy);
mpg.execute(); //执行
}
}
- pom.xml文件
<!--mysql数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<scope>runtime</scope>-->
<version>5.1.21</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--velocity 模板引擎 代码生成器需要-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!--swagger依赖 开始-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
<!--swagger依赖 结束-->
跟着狂神的视频可能遇到的问题就是pom.xml中的依赖不全的问题了,其它都讲解的很详细,我不太了解也是由于我其它内容没有看,直接看的mybatisplus部分
狂神哔站地址:https://space.bilibili.com/95256449?spm_id_from=333.788.b_765f7570696e666f.1