MyBatis-Plus

文章详细介绍了如何在SpringBoot项目中集成MyBatis-Plus,包括创建数据库、配置依赖、编写代码、测试查询,以及主键策略、自动填充、分页查询和逻辑删除等MyBatis-Plus的常用功能。
摘要由CSDN通过智能技术生成

MyBatis-Plus:(简称MP),是Mybatis的增强工具,在MyBatis的基础上只做了增强,不做改变。为简化开发、提高效率而生

一、SpringBoot集成MP

1、创建数据库,并插入数据

-- 创建一张用户表
CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_name` varchar(255) DEFAULT NULL COMMENT '用户姓名',
  `user_age` int DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- 插入数据
INSERT INTO user(user_name, user_age) VALUES ('test_user_01', 20);
INSERT INTO user(user_name, user_age) VALUES ('test_user_02', 21);
INSERT INTO user(user_name, user_age) VALUES ('test_user_03', 22);
INSERT INTO user(user_name, user_age) VALUES ('test_user_04', 23);

image.png

2、新建SpringBoot项目

3、加入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <!--springboot使用这个版本-->
    <version>2.2.1.RELEASE</version>
    <relativePath/>
  </parent>

  <groupId>com.xyh</groupId>
  <artifactId>mybatisplus</artifactId>
  <version>1.0.0</version>
  <name>mybatisplus</name>

  <properties>
    <java.version>1.8</java.version>
    <!--指定mybatis-plus版本-->
    <mybatis-plus-versoin>3.3.1</mybatis-plus-versoin>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!--mybatis-plus-->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>${mybatis-plus-versoin}</version>
    </dependency>
    <!--mysql驱动:其他版本的springboot,这里引入的依赖可能不同-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

4、配置数据库信息

application.properties中添加数据库配置。
根据jdbc驱动的不同,需要配置不同的数据库链接配置
SpringBoot2.0之前默认集成jdbc5驱动;SpringBoot2.1之后默认集成jdbc8驱动

jdbc5驱动:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp-test
spring.datasource.username=root
spring.datasource.password=123456
jdbc8驱动:
  • driver-class-name需要使用com.mysql.cj.jdbc.Driver
  • url中需要指定时区serverTimeZone=GMT%2b8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp-test?serverTimeZone=GMT%2b8
spring.datasource.username=root
spring.datasource.password=123456

5、编写代码

创建实体类包,并新建User实体类

com.xyh.mybatisplus包下,新建entity实体类包,并新建UserEntity对象

@Data//使用lombok自动添加get、set方法
@TableName("user")//如果表名和类名不一致,需要指定表名
public class UserEntity {
    private Long id;
	private String userName;
	private String userAge;
}    
创建mapper包,并新建UserMapper接口

com.xyh.mybatisplus包下,新建mapper包,并新建UserMapper对象

@Repository//将Dao层的实现类标识为Spring容器中的组件
public interface UserMapper extends BaseMapper<UserEntity> {
}
在启动类上添加注释

在启动类上,添加@MapperScan("com.xyh.mybatisplus.mapper")注解

@SpringBootApplication
//指定要扫描的Mapper接口所在的包名,让MyBatis自动创建Mapper接口的实现类。
@MapperScan("com.xyh.mybatisplus.mapper")
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}
配置sql输出日志

application.properties中添加sql输出日志配置。

#mybatis输出sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

6、测试

编写测试类,查询数据库中所有数据,用于测试上述步骤是否已经成功。

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
    //引入UserMapper
	@Autowired
	private UserMapper userMapper;

	@Test
	public void testSelectAll(){
        //查询所有的user数据
		List<UserEntity> userList = userMapper.selectList(null);
        //输出
		System.out.println(userList);
	}
}

image.png

二、扩展

1、主键策略

AUTO:自增、NONE:默认、INPUT:自己输入、ASSIGN_ID: 雪花id、ASSIGN_UUID: UUID
配置方式:

  • 实体类中使用注解指定: @TableId(type = IdType.AUTO)
  • 在application.properties中全局配置:mybatis-plus.global-config.db-config.id-type=auto
@Data//使用lombok自动添加get、set方法
@TableName("user")//如果表名和类名不一致,需要指定表名
public class UserEntity {
    //设置主键策略为 AUTO--自增
    @TableId(type = IdType.AUTO)
    private Long id;
	private String userName;
	private String userAge;
}    
测试插入
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

	@Test
	public void testInsert(){
		UserEntity user = new UserEntity();
		user.setUserName("test_user_insert_01");
		user.setUserAge(10);
		int insert = userMapper.insert(user);
		System.out.println("插入成功条数:" + insert);
	}
}

image.png

2、自动填充

一般的数据表中,都会记录create_time(创建时间)、和update_time(更新时间),用于记录数据的变化情况

a、表中添加两个字段
alter table `user` add column `create_time` datetime COMMENT '创建时间';
alter table `user` add column `update_time` datetime COMMENT '更新时间';
b、实体类中添加数据,并添加注解
@Data//使用lombok自动添加get、set方法
@TableName("user")//如果表名和类名不一致,需要指定表名
public class UserEntity {
	//设置主键策略为 AUTO--自增
	@TableId(type = IdType.AUTO)
	private Long id;
	private String userName;
	private Integer userAge;

	//创建时间
	@TableField(fill = FieldFill.INSERT)//插入的时候自动填充
	private Date createTime;
	//更新时间
	@TableField(fill = FieldFill.INSERT_UPDATE)//插入或更新的时候自动填充
	private Date updateTime;
}
c、创建MyMetaObjectHandler

com.xyh.mybatisplus包下,新建handler包,并新建MyMetaObjectHandler对象,实现MetaObjectHandler接口

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
	/**
	 * 插入的时候,自动填充的数据
	 * @param metaObject
	 */
	@Override
	public void insertFill(MetaObject metaObject) {
		this.setFieldValByName("createTime", new Date(), metaObject);
		this.setFieldValByName("updateTime", new Date(), metaObject);
	}

	/**
	 * 更新的时候,自动填充的数据
	 * @param metaObject
	 */
	@Override
	public void updateFill(MetaObject metaObject) {
		this.setFieldValByName("updateTime", new Date(), metaObject);
	}
}

测试插入
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

	@Test
	public void testInsertWithFill(){
		UserEntity user = new UserEntity();
		user.setUserName("test_user_insert_02");
		user.setUserAge(10);
		int insert = userMapper.insert(user);
		System.out.println("插入成功条数:" + insert);
	}
}

image.png

测试更新
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

	@Test
	public void testUpdateWithFill(){
		UserEntity user = new UserEntity();
		user.setId(7L);
		user.setUserAge(11);
		int update = userMapper.updateById(user);
		System.out.println("更新成功条数:" + update);
	}
}

image.png

3、分页查询

a、配置分页插件

com.xyh.mybatisplus包下,新建config包,并新建MyBatisPlusConfig对象。添加PaginationInterceptorbean

/**
 * Created by: xuyuhang
 * Created time:    2023/5/20 21:21
 * Description: mybatis-plus配置
 */
@Configuration
public class MyBatisPlusConfig {

	/**
	 * 分页配置
	 * @return
	 */
	@Bean
	public PaginationInterceptor paginationInterceptor(){
		return new PaginationInterceptor();
	}
}
b、测试使用
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

	@Test
	public void testSelectPage(){
		//创建Page对象,并传入两个参数:pageNum--当前页,pageSize--页记录数
		Page<UserEntity> page = new Page<>(1,3);
		Page<UserEntity> userPage = userMapper.selectPage(page, null);
		System.out.println("总页数:" + userPage.getPages());
		System.out.println("当前页:" + userPage.getCurrent());
		System.out.println("查询数据集合" + userPage.getRecords());
		System.out.println("总记录数:" + userPage.getTotal());
		System.out.println("是否存在下一页:" + userPage.hasNext());
		System.out.println("是否存在上一页:" + userPage.hasPrevious());
	}
}

image.png

4、逻辑删除

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条数据
  • 逻辑删除:假删除,将对应数据中代表删除的字段,修改为"已删除状态",之后数据库中依旧可以查询到此条数据
a、数据库中添加字段
-- 插入deleted字段,历史数据默认为 0 :未删除
alter table `user` add column `deleted` boolean default 0 COMMENT '删除标志,0:未删除,1:已删除';
b、实体类中添加属性
@Data//使用lombok自动添加get、set方法
@TableName("user")//如果表名和类名不一致,需要指定表名
public class UserEntity {
	//设置主键策略为 AUTO--自增
	@TableId(type = IdType.AUTO)
	private Long id;
	private String userName;
	private Integer userAge;

	//创建时间
	@TableField(fill = FieldFill.INSERT)//插入的时候自动填充
	private Date createTime;
	//更新时间
	@TableField(fill = FieldFill.INSERT_UPDATE)//插入或更新的时候自动填充
	private Date updateTime;
	//删除标志,0:未删除,1:已删除
	@TableLogic
	private Integer deleted;
}

c、添加配置
#如果配置值=默认值,下面配置可以省略
#删除的value值(默认:1)
mybatis-plus.global-config.db-config.logic-delete-value=1
#未删除的value值(默认:0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0
测试使用
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

	/**
	 * 测试逻辑删除
	 * 注:历史共6条数据,默认都为未删除
	 */
	@Test
	public void testLogicDelete(){
		//删除一条数据
		userMapper.deleteById(7);
		//查询共有几条数据
		List<UserEntity> userList = userMapper.selectList(null);
		System.out.println(userList);
	}
}

image.png
image.png

三、条件构造器(Wrapper)

1、ge、gt、le、lt、isNull、isNotNull

符号含义sql中表示
ge大于等于>=
gt大于>
le小于等于<=
lt小于<
isNull为nullis null
isNotNull不为nullis not null
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest {

	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

	/**
	 * 测试QueryWrapper中的 ge 操作
	 */
	@Test
	public void testQueryWrapper_ge(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.ge("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 gt 操作
	 */
	@Test
	public void testQueryWrapper_gt(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.gt("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 le 操作
	 */
	@Test
	public void testQueryWrapper_le(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.le("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 lt 操作
	 */
	@Test
	public void testQueryWrapper_lt(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.lt("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 isNull 操作
	 */
	@Test
	public void testQueryWrapper_isNull(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.isNull("create_time");
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 isNotNull 操作
	 */
	@Test
	public void testQueryWrapper_isNotNull(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.isNotNull("create_time");
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}
}

2、eq、ne

符号含义sql中表示
eq等于=
ne不等于!= 或 <>
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest {

	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

    /**
	 * 测试QueryWrapper中的 eq 操作
	 */
	@Test
	public void testQueryWrapper_eq(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 ne 操作
	 */
	@Test
	public void testQueryWrapper_ne(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.ne("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}
}

3、between、notBetween

符号含义sql中表示
between区间BETWEEN ? AND ?
notBetween区间NOT BETWEEN ? AND ?
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest {

	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

	/**
	 * 测试QueryWrapper中的 between 操作
	 */
	@Test
	public void testQueryWrapper_between(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.between("user_age", 12, 30);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 between 操作
	 */
	@Test
	public void testQueryWrapper_notBetween(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.notBetween("user_age", 12, 30);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}
}

4、like、notLike、likeLeft、likeRight

符号含义sql中表示
like模糊查询like ‘%condition%’
notLike模糊查询not like ‘%condition%’
likeLeft模糊查询like ‘%condition’
likeRight模糊查询like ‘condition%’
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest {

	//引入UserMapper
	@Autowired
	private UserMapper userMapper;

	/**
	 * 测试QueryWrapper中的 like 操作
	 */
	@Test
	public void testQueryWrapper_like(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.like("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 notLike 操作
	 */
	@Test
	public void testQueryWrapper_notLike(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.notLike("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 likeLeft 操作
	 */
	@Test
	public void testQueryWrapper_likeLeft(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.likeLeft("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}

	/**
	 * 测试QueryWrapper中的 likeRight 操作
	 */
	@Test
	public void testQueryWrapper_likeRight(){
		QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
		queryWrapper.likeRight("user_age", 12);
		Integer selectCount = userMapper.selectCount(queryWrapper);
		System.out.println("共有"+ selectCount + "条数据符合查询条件");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值