目录
2.2.6 编写测试用例,加入junit的依赖,测试类不能使用Test类名,测试类的包目录和启动类的路径一致
4.2.1、mapUnderscoreToCamelCase 是否自动开启驼峰命名映射
6.1、com.baomidou.mybatisplus.extension.service.IService接口
6. 2、com.baomidou.mybatisplus.extension.service.impl.ServiceImpl类
6.3.2、自定义业务层实现类,继承ServiceImpl:
7.2.2、代码生成是基于模板做的,这里采用的freemark模块来生成,把template文件夹放到resources
1 、Mybatis-Plus简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。该框架由baomidou(苞米豆)组织开发并且开源的。官网:mybatis.plus 或 https://mp.baomidou.com/,码云地址:baomidou: 苞米豆,为提高生产率而生!
2 、快速入门
2.1、 创建数据库及表
-- 创建测试表
CREATE TABLE `tb_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(20) NOT NULL COMMENT '用户名',
`password` varchar(20) NOT NULL COMMENT '密码',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- 插入测试数据
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('1', 'zhangsan', '123456', '张三', '18', 'test1@chen.cn');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('2', 'lisi', '123456', '李四', '20', 'test2@chen.cn');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('3', 'wangwu', '123456', '王五', '28', 'test3@chen.cn');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('4', 'zhaoliu', '123456', '赵六', '21', 'test4@chen.cn');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('5', 'sunqi', '123456', '孙七', '24', 'test5@chen.cn');
2.2 工程搭建
2.2.1 创建springBoot工程
2.2.2 导入依赖
<!-- 继承Spring boot工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--简化代码的工具包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mybatis-plus的springboot支持-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
log4j.properties:
log4j.rootLogger=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n
2.2.3 配置application.yml
spring:
application:
name: mybatisplusspringboot
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123
# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
mapper-locations: classpath*:mybatis/*.xml
# 设置别名包扫描路径,通过该属性可以给包中的类注册别名
type-aliases-package: com.chen.mp.pojo
2.2.4 启动类
package com.chen;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author:CHENFAN
* @Date:2021/12/1418:54
*/
@SpringBootApplication
@MapperScan(basePackages = "com.chen.mp.mapper")//用于扫描mapper接口文件
public class MpApplication {
public static void main(String[] args) {
System.out.println("ss");
SpringApplication.run(MpApplication.class,args);
}
}
2.2.4 编写pojo
package com.chen.mp.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* @Author:CHENFAN
* @Date:2021/12/1419:00
*/
@Data//使用lombok完成get和set
@TableName("tb_user")//对应数据库的表名
public class User {
@TableId(value = "ID",type = IdType.AUTO)
private Long id;
@TableField("USER_NAME")//此属性名称和数据库中字段名称不符合,所以显示的映射
private String userName;//此属性名称和数据库中字段名称相同,所以隐式的映射
private String password;
private String name;
private Integer age;
private String email;
}
2.2.5 编写mapper接口和配置文件
package com.chen.mp.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.chen.mp.pojo.User;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author:CHENFAN
* @Date:2021/12/1419:11
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
在resources目录下新建一个文件夹mybatis,专门存放mapper配置文件,用于扩展自定义的sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chen.mapper.UserMapper">
</mapper>
2.2.6 编写测试用例,加入junit的依赖,测试类不能使用Test类名,测试类的包目录和启动类的路径一致
package com.chen;
import com.chen.mp.mapper.UserMapper;
import com.chen.mp.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* @Author:CHENFAN
* @Date:2021/12/1419:07
*/
@RunWith(SpringRunner.class)//使用springrunner运行器
@SpringBootTest(classes = MpApplication.class)//启用springboot测试,加载Springboot配置文件
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
//查询所有
@Test
public void testSelectAll(){
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
//查询一个
@Test
public void testSelectOne(){
User user = userMapper.selectById(1);
System.out.println(user);
}
//保存
@Test
public void testSave(){
User user = new User();
user.setUserName("xiaozhao");
user.setAge(40);
user.setPassword("xiaozhao");
user.setName("小赵");
user.setEmail("xiaozhao@email.com");
userMapper.insert(user);
}
//修改
@Test
public void testUpdate(){
User user = new User();
user.setId(1228242594492923909l);
user.setName("老赵");
userMapper.updateById(user);
}
//删除
@Test
public void testDelete(){
int i = userMapper.deleteById(1228242594492923909l);
}
}
3 通用CRUD
完成了demo的搭建,接下来查看我们继承的BaseMapper中的单表操作
3.1插入操作
3.1.1、方法定义:
3.1.2、测试用例:
@Autowired private UserMapper userMapper;
@Test
public void testInsert(){
User user = new User();
user.setAge(20);
user.setEmail("test@itcast.cn");
user.setName("曹操");
user.setUserName("caocao");
user.setPassword("123456");
//返回的result是受影响的行数,并不是自增后的id
int result = this.userMapper.insert(user);
System.out.println("result = " + result);
System.out.println(user.getId()); //自增后的id会回填到对象中
如何设置id的生成策略 ,MP支持的id策略(查看IdType类):
package com.baomidou.mybatisplus.annotation;
public enum IdType {
/**
* 数据库ID自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型
*/
NONE(1),
/**
* 用户输入ID
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。
*/
/**
* 全局唯一ID (idWorker)
*/
ID_WORKER(3),
/**
* 全局唯一ID (UUID)
*/
UUID(4),
/**
* 字符串全局唯一ID (idWorker 的字符串表示)
*/
ID_WORKER_STR(5);
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
3.1.4、@TableField
在MP中通过@TableField注解可以指定字段的一些属性,常常解决的问题有2个:
- 对象中的属性名和字段名不一致的问题(非驼峰)
- 对象中的属性字段在表中不存在的问题
3.2、更新操作
在MP中,更新操作有2种,一种是根据id更新,另一种是根据条件更新。
3.2.1、根据id更新
方法定义:
测试:
@Autowired
private UserMapper userMapper;
@Test
public void testUpdateById() {
User user = new User();
user.setId(6L); //主键
user.setAge(21); //更新的字段
//根据id更新,更新不为null的字段
userMapper.updateById(user); }
3.2.2、根据条件更新
方法定义:
测试:
第一种:通过QueryMapper对象
@Autowired private UserMapper userMapper;
@Test
public void testUpdate() {
User user = new User();
user.setAge(22); //更新的字段
QueryWrapper<User> wrapper = new QueryWrapper<>();
//更新的条件
wrapper.eq("id", 6);
//执行更新操作
int result = this.userMapper.update(user, wrapper);
System.out.println("result = " + result);
第二种: UpdateWrapper对象
@Test
public void testUpdate() {
//更新的条件以及字段
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 6).set("age", 23);
//执行更新操作
int result = this.userMapper.update(null, wrapper);
System.out.println("result = " + result);
}
3.3、删除操作
3.3.1、deleteById
方法定义:
测试用例:
@Autowired
private UserMapper userMapper;
@Test
public void testDeleteById() {
//执行删除操作
int result = this.userMapper.deleteById(6L);
System.out.println("result = " + result);
}
3.3.2、deleteByMap
方法定义:
测试:
@Autowired
private UserMapper userMapper;
@Test
public void testDeleteByMap() {
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("age",20);
columnMap.put("name","张三");
//将columnMap中的元素设置为删除的条件,多个之间为and关系
//执行的sql语句:DELETE FROM tb_user WHERE name = ? AND age = ?
int result = this.userMapper.deleteByMap(columnMap);
System.out.println("result = " + result);
}
3.3.3、delete
方法定义:
测试:
@Test
public void testDeleteByMap() {
User user = new User();
user.setAge(20);
user.setName("张