文章目录
概要
Mybatis大家肯定都用的很多了,作为一个java持久层的框架,mybatis通过简单的XML或者注解配置文件,将SQL语句与java对象进行映射,从而实现我们能够通过SQL语句直接实现对数据库的操作。
而MybatisPlus不一样,它是在Mybatis的基础上,只做增强不做改变。增强的地方主要有如下几点:
①更简单的CRUD:使用MybatisPlus都不用手写SQL语句了,逻辑的判断全由java代码来实现。
②代码自动生成:使用MybatisPlus插件,是可以自动帮我们生成代码的噢~包括controller层、service层、mapper层以及实体类。这几层是我们使用SpringBoot框架做开发的基础架构。
③集成了分页插件:使用分页功能的时候更加快捷简便。
④MybatisPlus支持多种数据库:MybatisPlus可以在多种数据库之间从容切换。
从零手撕MybatisPlus
介绍这么多,想必大家对MybatisPlus已经有了一个初步的认识,接下来就带领大家手撕MybatisPlus~
0、学习建议
在手撕MybatisPlus的过程中,我们先用原来的步骤自己创建工程结构,感受一下MybatisPlus的运作流程,最后再使用代码生成器去生成代码。其实这是一个学习的过程,只有先熟悉了代码,再自动生成的时候我们也看的懂。就像当初学习java基础的时候,get、set、构造器方法没少折磨,但是学到后面才发现,原来可以一键生成。
1、环境准备
1、数据库
我们需要准备一个数据库:
2、导依赖
使用MybatisPlus需要我们导入相关依赖才能使用。
<!--mybatisplus起步依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
3、写配置
使用MybatisPlus还需要在yml文件中配置MybatisPlus
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句
4、创工程
我们需要创建一个SpringBoot项目,工程目录如下:
5、实体类内容
这里有四个注解我们之前没有用过,在这里做一个简单的介绍:
①:表名,用于实体类和数据库表名不一致时,进行关系绑定映射。
②:表ID:用于实体类的属性和数据库的主键字段进行绑定,type=AUTO是指使用自增。
③:表字段:用于实体类属性和数据库表字段的映射关系。exist=false:代表数据库中不存在这个字段。
④:逻辑删除:物理删除就是我们直接将数据库的数据删除掉了,而逻辑删除用于不想真实删除某些数据,但又不想让其出现时。
6、mapper层
controller层、service层不变,还是原来的写法,仅仅是mapper层继承BaseMapper
7、启动类上扫描mapper层
环境我们已经准备好了,注意,我们现在体验的是最普通的MybatisPlus,后续还可以简化的。现在我们随便写点代码初步体验一下MybatisPlus的CRUD
2、简单的CRUD
①根据Id查询
首先我们在controller层随便写点代码:
代码如下(示例):
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
//根据id查询用户
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id){
User user = userService.getUserById(id);
return user;
}
}
这些代码相比大家都熟悉到不能在熟悉了,不过多做解释,直接来到实现类:
代码如下(示例):
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
//根据id查询用户
@Override
public User getUserById(Long id) {
User user = userMapper.selectById(id);
return user;
}
}
往常进行到这里,是不是就要开始去mapper写代码啦~诶不用!因为我们的mapper层,继承了BaseMapper,因此就不用写SQL语句咯。我们直接运行一下,然后在浏览器直接看结果:
解释:
在BaseMapper中早就已经封装好了基础查询的语法规则了,我们继承以后可以直接拿来用,就是这么简单。
②新增一个用户
controller层代码如下(示例):
//新增用户
@PostMapping
public void getNewUser(@RequestBody User user){
userService.getNewUser(user);
}
实现类也及其简单,代码如下(示例):
//新增用户
@Override
public void getNewUser(User user) {
userMapper.insert(user);
}
因为我们新增用户要用到表单,没有写~我们就用测试工具搞一下:
没报错就是对了~我们去数据库瞅一眼张五这条数据在不在
③修改一个用户
controller层代码如下(示例):
//根据Id修改用户
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id){
userService.updateUser(id);
}
实现类代码如下(示例):
//修改用户
@Override
public void updateUser(Long id) {
User user = userMapper.selectById(id);
user.setName("张二麻子");
userMapper.updateById(user);
}
由于条件苛刻,我们就数据写死,简单测一下即可~
查看一眼数据库:
④删除一个用户
删除太简单了,这里就不测了哈
controller层代码如下(示例):
//根据id删除用户
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id){
userService.deleteUserById(id);
}
实现类代码(示例):
//删除用户
@Override
public void deleteUserById(Long id) {
userMapper.deleteById(id);
}
3、稍微复杂一丢丢的业务
光是简单的CRUD肯定无法满足业务需求,因此就有了按条件查询。其实按条件查询也非常简单,步骤就是如下几步:
①创建QueryWrapper<>对象,泛型是实体类,建议用LambdaQueryWrapper<>;这二者除了写法上有所区别外,内容毫无区别,后者更优雅一些,因此我们都以LambdaQueryWrapper<>为例。
②写条件
③调用BaseMapper的方法
技术名词解释
创建对象就不用说了叭,直接new出来就行了。主要是条件的写法,首先介绍一下条件语法:
eq( ) : 等于 =
ne( ) : 不等于 <>
gt( ) : 大于 >
ge( ) : 大于等于 >=
lt( ) : 小于 <
le( ) : 小于等于 <=
between ( ) : BETWEEN 值1 AND 值2
notBetween ( ) : NOT BETWEEN 值1 AND 值2
in( ) : in
notIn( ) :not in
like 相当于:'%值%'【索引失效】 数量大时
likeLeft 相当于: '%值' 【坚决不写,让索引失效】
likeRight 相当于: '值%' 【可写】
组合条件:
1. 并且关系(and)
2. 或者关系(or)
3. null值的处理
条件语法总体就是这些,我们简单感受一下:
1、查询年龄大于20岁的用户
controller层代码如下(示例):
//查询年龄大于20岁的用户
@GetMapping
public List<User> getUserById(){
List<User> list = userService.getUsers();
return list;
}
实现类代码如下(示例):
//查询年龄大于20岁的用户
@Override
public List<User> getUsers() {
//第一步,创建queryWrapper对象
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
//第二步,写条件
queryWrapper.gt(User::getAge,20);
//第三步,调方法
List<User> list = userMapper.selectList(queryWrapper);
return list;
}
简单解释一下第二步,条件在上面已经罗列出来了,参数的意思如下:
第一个参数是实体类的属性名称,表示需要进行大于比较的属性。
第二个参数是需要进行比较的值,表示查询结果中对应属性的值必须大于该值才符合查询条件。
2、修改指定id的用户
controller层的代码和上面修改指定用户的代码一致,我们只需要更改一下实现类的方法就行。
实现类代码如下(示例):
//修改用户
@Override
public void updateUser(Long id) {
//对于修改专门有updateWapper,但用法和queryWapper一样
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
//先获取指定id的用户
updateWrapper.eq(User::getId,id);
//设置条件
updateWrapper.set(User::getName,"李哈哈哈哈");
//null代表更新所有字段
userMapper.update(null,updateWrapper);
}
3、模糊查询
代码我就不测试了哈,简单给大家看一下实现类的代码即可:
@Override
public List<User> findUserByLike() {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
//queryWrapper.like(User::getName, "张");
//姓张:通配符%在张的右边,因此最好用likeRight
queryWrapper.likeRight(User::getName,"张");
List<User> userList = userMapper.selectList(queryWrapper);
return userList;
}
这些条件查询用法都是一样的,代码都是万变不离其宗的,大家自己去实验一下即可掌握~
4、分页查询
之所以要单独将一下分页查询,是因为我们之前使用mybatis的时候,分页的需求我们都是用分页插件来完成的。而我们的MybatisPlus怎么能没有呢?但是我们现在不用分页插件,而是用内部的分页拦截器来完成。具体操作步骤如下:
1、定义一个配置类:
代码如下(示例):
//注册分页拦截器
@Configuration
public class PageConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1、创建 MP 拦截器对象
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//2、添加分页拦截器
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
//3、返回拦截器对象
return mybatisPlusInterceptor;
}
}
2、使用的时候我们需要先定义分页对象
controller层代码(示例):
//分页查询
@GetMapping
public Page<User> getByPage(){
Page<User> page = userService.getByPage();
return page;
}
实现类代码:
//分页查询
@Override
public Page<User> getByPage() {
//1.构建分页对象
Page<User> page = new Page<>(1,2);
//2.构建条件对象
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
//3、写条件
queryWrapper.ge(User::getAge, 18);
//4.调用selectPage()方法
Page<User> pageResult = userMapper.selectPage(page, queryWrapper);
return pageResult;
}
直接看控制台比较好
技术细节一
MybatisPlus不仅可以封装Mapper 层,也可以封装service层,这样我们有很多
简单的代码,就可以直接在service层就结束了,具体我就不演示了哈~
封装service:
封装实现类:
技术细节二
前文我们提到,MybatisPlus还可以帮我们生成代码对叭~现在也教给大家:
1、下载一个插件:MybatisPlus
2、在导航栏上找other
3、先点①建立数据库连接
4、再点②生成代码
小结
充电时刻
MybatisPlus是一个非常好用的持久层框架,其最大的优点就是,不用写SQL语句,这对程序员来说,极大的加快了我们的开发速度。
并且MybatisPlus使用起来也非常的简单。只要大家勤练,很快就能上手了。