写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
据说公司项目要使用mybatis-plus,以下简称MP,作为小白的我有点慌,毕竟没有用过,而且即便是mybatis也已经很久没用过了,趁着这两天有时间,赶紧学习以下,也顺便记录以下。
我只是记录了以下我认为接下来项目中可能会用到的知识点,而且只是粗略的过了一遍,具体详细的使用看官方文档:https://mybatis.plus/guide/ 另外我想说,这官方文档真的太详细了,给文档编写者点赞!
整合MP系列文章暂时先只记录我到目前为止学习的知识点,以后用到会继续补充,贴一个git的提交列表吧,大体就这些:
首先说以下我的测试环境,本想在前几篇博客用的环境基础之上整合MP的,但是好像包冲突了,找了很久也没找到springboot-mybatis-MP三者相匹配的版本,于是就干脆新创建一个项目了,我的环境是:springboot2.3.3.RELEASE+MP3.4.0+Mysql5.7。
首先贴一下依赖包(之前都是边学边写博客,用到啥依赖现引入,这次是学了两天之后再记录以下博客的,其间用到的所有依赖一并导入):
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<!-- lombok依赖 -->
<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>${mybatis-plus.version}</version>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 代码生成器依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<!-- 模板引擎依赖 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
数据库:
User实体类:
@Data
@TableName(value = "t_user")
public class User {
@TableId(value = "user_id",type = IdType.AUTO)
private Integer userId;
private String userName;
private Integer age;
}
yml文件配置只贴MP相关的:
mybatis-plus:
configuration:
# sql输出到控制台 方便查看
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
另外,在源码MybatisConfiguration类中有以下截图的这么一段配置,默认开启了驼峰命名,所以不用再配置。
编写Mapper类:
public interface UserMapper extends BaseMapper<User> {
}
看下这个BaseMapper类:
配置扫描包,我新建一个MybatisPlusConfig配置类,将包扫描也加到这上面,以后所有MP相关的配置都将加在这个类里,现在还没有添加任何配置:
@Configuration
@MapperScan("com.example.springbootmp.domain.repository")
public class MybatisPlusConfig {
}
顺便说一下@MapperScan注解,因为我看有的博客上在Mapper接口上添加了@Mapper注解,其实这是不必要的,@MapperScan注解不就是为了避免你在每个接口上加@Mapper注解吗?
至此,我们已经获得了CURD功能。
测试一下插入:
@Test
public void aInsert() {
User user = new User();
user.setUserName("zhangsan");
user.setAge(20);
userMapper.insert(user);
}
执行后看数据库中:
虽然已经保存成功了,但是BaseMapper接口提供的保存方法实只有一个insert方法:int insert(T entity); 没有批量保存的方法,关于批量的方法,mp还为我们提供了IService接口,这里面有批量相关的方法,这个以后再介绍,先看下官方文档:
测试一下删除:
@Test
public void bDelete() {
userMapper.deleteById(1);
List<Integer> ids = new ArrayList<>();
ids.add(2);
ids.add(3);
userMapper.deleteBatchIds(ids);
LambdaQueryWrapper<User> queryWrapper = new QueryWrapper<User>().lambda();
queryWrapper.eq(User::getUserId,4);
userMapper.delete(queryWrapper);
HashMap map = new HashMap();
map.put("user_id",5);
userMapper.deleteByMap(map);
}
如上:删除方法还好点,提供了一个deleteBatchIds方法,可以进行批量删除,至于这个玩意LambdaQueryWrapper,它叫做条件构造器,可以看官方文档,有很详细的说明,总之这个删除可以按照条件删除,还可以传一个map,按照map删除,但是这个deleteByMap很鸡肋,看下源码你就知道了,它只能按照表字段删除,也就是说封装如map的条件必须是表字段,这在实际开发中谁用啊,直接从实体中获取属性多方便,你这还得巴拉巴拉表,看下字段名,顺便贴下deleteByMap的源码:
测试一下修改:
@Test
public void cUpdate() {
User user = userMapper.selectById(1);
user.setUserName(null);
user.setAge(50);
userMapper.updateById(user);
User user1 = userMapper.selectById(2);
user1.setAge(30);
userMapper.updateById(user1);
}
执行结果:
如上:修改成功,更新相关的方法有很多,就不一一测试了。
需要留意的是userName为空,并没有更新,updateById会忽略调空值,打印的sql如下:
UPDATE t_user SET age=?, sex=?, created_time=?, updated_time=?, created_by=?, updated_by=? WHERE user_id=?
想要空值的时候也进行更新操作,可以通过注解@TableField(updateStrategy = FieldStrategy.IGNORED)进行忽略
此时打印的sql如下:
UPDATE t_user SET user_name=?, age=?, updated_time=?, updated_by=?, version=? WHERE user_id=?
更多的关于注解的使用之后单独记录,先简单看下源码中的注释:
测试一下查询:
查询方法比较多,就不截图了,详情看官方文档吧!
@Test
public void dSelect() {
LambdaQueryWrapper<User> queryWrapper = new QueryWrapper<User>().lambda();
queryWrapper.eq(User::getUserId,1);
User user1 = userMapper.selectOne(queryWrapper);
System.out.println(user1);
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
List<User> userList = userMapper.selectBatchIds(ids);
System.out.println(userList);
LambdaQueryWrapper<User> queryWrapper1 = new QueryWrapper<User>().lambda();
queryWrapper1.gt(User::getAge,10);
List<User> userList1 =userMapper.selectList(queryWrapper1);
System.out.println(userList1);
}
这里需要注意一个地方,就是这个selectById()方法,默认使用的主键名是id,如果数据库中表中主键名称不为id,如user_id,此时需要使用@TableId注解手动指定,如@TableId(value = "user_id")。
只测试了几个方法,感兴趣的可以自己试下其它方法。
是不是很简单,只要继承一个BaseMapper接口就可以获得CURD能力,最起码到目前为止还没写xml,至此,快速体验阶段结束。