Mybatis Plus 10分钟上手
程序员文章站
2022-04-01 10:54:31
mybatis plus 是一款mybatis增强插件,可以在mybatis基础上来进行灵活的单表操作,不用再写SQL语句(仅限于单表),是一款简单易用的工具,本文结合SpringBoot来对Mybatis plus进行一个详细的讲解。1、初始化1.1 选择一个数据库,然后创建表CREATE TABLE `student` ( `id` bigint(20) NOT NULL, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4...
mybatis plus 是一款mybatis增强插件,可以在mybatis基础上来进行灵活的单表操作,不用再写SQL语句(仅限于单表),是一款简单易用的工具,本文结合SpringBoot来对Mybatis plus进行一个详细的讲解。
1、初始化
1.1 选择一个数据库,然后创建表
CREATE TABLE `student` (
`id` bigint(20) NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`create_time` datetime(0) NULL DEFAULT NULL,
`update_time` datetime(0) NULL DEFAULT NULL,
`status` int(1) NULL DEFAULT NULL,
`version` int(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
1.2 使用IDEA来创建SpringBoot项目
1.3 引入POM依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.14</version>
</dependency>
<!--mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.1</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<!--freemarker对自动生成代码支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
1.4 修改配置文件application.yml
spring:
application:
name: mybatis-plus-practise
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
server:
port: 8080
logging:
level:
cn.amoqi.mybatis.plus : debug
org.springframework: warn
mybatis-plus:
# mybatis的xml文件位置
mapper-locations: classpath:/mapper/**/*Mapper.xml
# entity实体类包位置
typeAliasesPackage: cn.amoqi.mybatis.plus.api.entity
global-config:
db-config:
# 数据库主键生成方式:AUTO:数据库自增,ID_WORKER:雪花算法生成(框架默认),
#可在字段上加@TableId(type = IdType.ID_WORKER) 覆盖
id-type: AUTO
# 影响添加、更新、Wapper生成条件,not_empty字段为空的不进行操作,IGNORED忽略判断
#可在字段上加@TableField(strategy = FieldStrategy.IGNORED)覆盖默认
field-strategy: not_empty
# 数据库字段强行按照java实体的骆驼式命名法大写字母前转化为下划线加小写
column-underline: true
# 逻辑删除有效为1 删除为0
logic-not-delete-value: 1
logic-delete-value: 0
# 是否自动刷新 Mapper 对应的 XML 文件,
# Mapper 对应的 XML 文件会自动刷新,更改 XML 文件后,无需再次重启工程,由此节省大量时间。
refresh: true
configuration:
# 开启驼峰,数据库字段转换为驼峰命名
map-underscore-to-camel-case: true
cache-enabled: false
使用CodeGenerator
类来生成controller、service、entity、mapper等,因为篇幅原因暂时就不列出代码生成器了,代码会传到gitee上,地址放到底部,需要的可以自取。
1.5 为启动类添加注解@MapperScan注解,指向mapper接口路径
@SpringBootApplication
@MapperScan("cn.amoqi.mybatis.plus.api.mapper")
public class MybatisPlusPractiseApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusPractiseApplication.class, args);
}
}
1.6 目录如下
2、基本功能
2.1 添加
@Test
public void add(){
Student student = new Student();
student.setName("赵六");
student.setAge(23);
student.setAddress("广东");
studentService.save(student);
}
2.2 修改
@Test
public void edit(){
Student student = new Student();
student.setName("赵六111");
student.setId(1288121141721862146L);
studentService.updateById(student);
}
2.3 删除
@Test
public void del(){
studentService.removeById("1288121141721862146");
}
2.4 列表
@Test
public void list(){
List<Student> list = studentService.list(Wrappers.<Student>lambdaQuery()
.ge(Student::getAge, 5));
System.out.println(list);
//复杂的
/*SELECT id,name,age,address FROM student WHERE name = ? AND ( age = ? OR address = ? ) */
List<Student> list1 = studentService.list(Wrappers.<Student>lambdaQuery().eq(Student::getName, "张三")
.and(wrapper -> wrapper.eq(Student::getAge, 3).or().eq(Student::getAddress, "山东")));
System.out.println(list1);
}
2.5 分页
引入Mybatis plus分页插件
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {
/**
* mybatis-plus配置
*/
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
}
分页测试1
@Test
public void pageList(){
IPage<Student> page = studentService.page(new Page<Student>(1, 10),
Wrappers.<Student>lambdaQuery().ge(Student::getAge, 3));
System.out.println(page.getRecords());
}
复杂分页查询,使用xml关联别的表,查询列表分页的情况
创建一个school
表
CREATE TABLE `school` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of school
-- ----------------------------
INSERT INTO `school` VALUES (1, '明天中学');
为Student实体类中添加
private Integer schoolId;
@TableField(exist = false)
private String schoolName;
mapper
public interface StudentMapper extends BaseMapper<Student> {
@Select("select st.*,sc.name school_name from student st left join school sc on st.school_id = sc.id")
IPage<Student> selectListWithSchool(Page page);
}
service
@Override
public IPage<Student> selectListWithSchool(Integer page){
Page<Student> studentPage = new Page<Student>(page, 10);
IPage<Student> studentIPage = this.baseMapper.selectListWithSchool(studentPage);
return studentIPage;
}
分页测试2
@Test
public void pageList2(){
IPage<Student> studentIPage = studentService.selectListWithSchool(1);
System.out.println(studentIPage.getRecords());
}
3、其他
3.1 逻辑删除
配置mybatis-plus
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
在实体类字段上加上
@TableLogic
private Integer deleted;
3.2 生成主键
mybatis-plus:
global-config:
db-config:
# 数据库主键生成方式:AUTO:数据库自增,ID_WORKER:雪花算法生成(框架默认),
#可在字段上加@TableId(type = IdType.ID_WORKER) 覆盖
id-type: AUTO
3.3 自动填充功能
实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ...."); //日志
this.setFieldValByName("create_time",new Date(),metaObject);
this.setFieldValByName("update_time",new Date(),metaObject);
this.setFieldValByName("status",1,metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("update_time", new Date(), metaObject);
}
}
字段上加入
@TableField(fill = FieldFill.INSERT)
private Date create_time;
@TableField(fill = FieldFill.INSERT_UPDATE)
结语
一名四年工作经验的程序猿,目前从事物流行业的工作,有自己的小破网站amoqi.cn。欢迎大家关注公众号【CoderQi】,一起来交流JAVA知识,包括但不限于SpringBoot+微服务,更有奇奇学习过程中学习的视频、面试资料和专业书籍等免费放送,希望大家能够喜欢。
本文地址:https://blog.csdn.net/u011830181/article/details/107702918