什么是MybatisPlus
为简化而生!
快速入门
1.创建一个springboot项目,记得修改默认的maven配置
2.导入依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-plus依赖,使用了plus就尽量不要导入mybatis的依赖了,避免版本冲突-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>
3.连接数据库以及编写数据库配置文件
spring.datasource.username=root
spring.datasource.password=Gyh!1027
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
4.编写pojo以及mapper
public class User {
private int id;
private String name;
private int age;
private String email;
}
// 在对应的Mapper上继承BaseMapper<T>,所有的CRUD就自动编写完成了
@Mapper
// 显示的指定要扫描的接口,否则会爆 could not autowired
@Component(value = "UserMapper")
public interface UserMapper extends BaseMapper<User> {
}
5.测试查询所有的用户及结果
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List<User> userList = userMapper.selectList(null);
for (User user : userList) {
System.out.println(user);
}
}
配置日志
由于mybatis-plus所有的sql不可见,需要配置才能看见,方便调试
# 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
主键生成策略
在测试插入方法时,出现了这种情况User{id=1450026548601081857, name='yuu', age=18, email='3562090042@qq.com'}
这里的id生成使用的是twitter的雪花算法,是一个Long类型的ID
自动填充
在企业开发中,几乎所有的表都有gmt_create、gmt_modify字段,用来记录数据创建时间以及修改时间,而且是自动化填写的
首先在上面的数据库中新增两个字段,create_time和update_time,类型都为datetime
//实体类中的date属性,mybatis-plus官方给定的为LocalDateTime类型
@TableField(fill = FieldFill.INSERT) //只在插入时填充
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) //在插入和更新时都填充
private LocalDateTime updateTime;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
// 配置相应的填充策略类
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
分页查询
编写一个配置类
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisConfig {
// 分页查询组件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 这里是什么类型的数据库就用什么类型
return interceptor;
}
}
// 分页查询
@Test
void selectUserByPage() {
Page<User> page = new Page<>(1,5);
userMapper.selectPage(page, null);
List<User> userList = page.getRecords();
for (User user : userList) {
System.out.println(user);
}
}
条件构造器
用于复杂sql的处理
@SpringBootTest
public class WrapperTest {
@Autowired
private UserMapper userMapper;
// 查询name和email不为空,年龄大于等于12岁的用户
@Test
void test1(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.isNotNull("name")
.isNotNull("email")
.ge("age",12); // 大于等于 greater than和be equal to 的缩写
List<User> userList = userMapper.selectList(wrapper);
for (User user : userList) {
System.out.println(user);
}
}
// 查询年龄在20到30之间的用户数量
@Test
void test2(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age",20,30);
Long num = userMapper.selectCount(wrapper);
System.out.println(num);
}
// 查询name中不含字母o,email为testxxx开头的用户
@Test
void test3(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.notLike("name","o")
// likeRight代表模糊查询的%在右边,这里即 test%
.likeRight("email","test");
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
// forEach的lambda表达式
maps.forEach(System.out::println);
}
// 内查询
@Test
void test4(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 在子sql语句中查询出符合条件的id
wrapper.inSql("id","select id from user where id < 3");
List<Object> obj = userMapper.selectObjs(wrapper);
obj.forEach(System.out::println);
}
// 通过年龄降序排列
@Test
void test5(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("age");
List<User> list = userMapper.selectList(wrapper);
list.forEach(System.out::println);
}
}
代码自动生成器
依赖包:mybatis-plus,自动生成器依赖,模板引擎
<!-- mybatis-plus依赖,使用了plus就尽量不要导入mybatis的依赖了,避免版本冲突-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>
<!--代码自动生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!--代码自动生成器的模板引擎依赖-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
需要先设计好数据库,连接数据库,配置数据库连接
模板
// 代码自动生成器
public class MyCodeAutoGenerator {
public static void main(String[] args) {
// 构建一个代码自动生成器的对象
AutoGenerator generator = new AutoGenerator();
// 1.全局配置
GlobalConfig config = new GlobalConfig();
String projectPath = System.getProperty("user.dir"); // 得到当前工程根目录
config.setOutputDir(projectPath+"/src/main/java"); // 生成的代码输出目录
config.setAuthor("yuu"); // 作者签名
config.setOpen(false); // 生成后不打开资源文件夹
config.setFileOverride(false); // 覆盖已经有的文件
config.setServiceName("%sService"); // 去掉Service的'I'前缀
config.setIdType(IdType.AUTO); // 设置主键自增
config.setDateType(DateType.ONLY_DATE); // 日期格式
config.setSwagger2(true); // 设置Swagger接口文档,需要导入对应的jar包
generator.setGlobalConfig(config);
// 2.数据源配置
DataSourceConfig sourceConfig = new DataSourceConfig();
sourceConfig.setDbType(DbType.MYSQL);
sourceConfig.setUsername("root");
sourceConfig.setPassword("Gyh!1027");
sourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC");
sourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
generator.setDataSource(sourceConfig);
// 3.包的配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.yuu");
packageConfig.setEntity("pojo");
packageConfig.setService("service");
packageConfig.setController("controller");
packageConfig.setMapper("mapper");
generator.setPackageInfo(packageConfig);
// 4.数据库策略配置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setInclude("user"); // 设置要映射的表名,可以一次性映射多个
strategyConfig.setNaming(NamingStrategy.underline_to_camel); // 下划线转驼峰命名
strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel); // 下划线转驼峰命名
TableFill createTime = new TableFill("create_time", FieldFill.INSERT); // 创建时间的自动填充
TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE); // 修改时间的自动填充
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(createTime);
tableFills.add(updateTime);
strategyConfig.setTableFillList(tableFills);
generator.setStrategy(strategyConfig);
generator.execute();
}
}