前言:
后端连接数据库的ORM框架有很多,JPA、Mybatis都是很主流的ORM架框。但是JPA在国内使用的人越来越少了。Mybatis因为XML配置过于多,所以现在越来越流行使用mybatis-plus,号称是可以丢弃xml配置的一款ORM框架。
mybatis-plus(以下简称MP)有很多功能,本文介绍在springboot中集成以及提供CURD的示例,更多功能可以参考官网:简介 | MyBatis-Plus (baomidou.com)https://baomidou.com/pages/24112f/
一、引入依赖。
Mybatis-Plus 依赖
maven工具构建配置POM如下:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
gradle工具构建配置如下:
implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.3.1'
mysql依赖,maven配置:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
mysql依赖,gradle配置:
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.33'
二、springboot配置mysql连接信息
Spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://49.234.232.xxx:3306/test?serverTimezone=GMT%2B8
username: root
password: xxx
配置完成以后,重启项目,能看到控制台有MP的信息未报错误就可表示成功了:
三、编写实体类和mapper
1、实体类代码。entity下面新建一个User.java类。
package com.cn.laoluobase.entity;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigInteger;
import java.sql.Types;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private BigInteger id;
@JsonInclude(JsonInclude.Include.NON_NULL) // 当为空时不转换JSON输出。这样前端就不会返回null.
private String userName;
@JsonInclude(JsonInclude.Include.NON_NULL) // 当为空时不转换JSON输出。这样前端就不会返回null.
private String roleid;
@JsonInclude(JsonInclude.Include.NON_NULL) // 当为空时不转换JSON输出。这样前端就不会返回null.
private Integer status;
@JsonInclude(JsonInclude.Include.NON_NULL) // 当为空时不转换JSON输出。这样前端就不会返回null.
private Integer isDelete;
}
2、编写@Mapper,extends baseMapper
package com.cn.laoluobase.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cn.laoluobase.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
注意:@Mapper一定要写,不注入的话,后面无法@Resource
四、测试及调用示例
在Controller中调用userMapper.selectList()方法。
@GetMapping("/list")
public String list(){
System.out.println("************************demo/mp/list***********************");
List<User> userList = userMapper.selectList(null);
userList.forEach(System.out::println); // System.out::println =>System.out.println(user)
return "OK";
}
完整截图如下:
网页访问后,控制台会输出相关的记录:
五、MP主要内置方法介绍
上面的测试示例中,我们使用了userMapper.selectList()。它继承自BaseMapper。
1、内置了很多常用方法,列表。
// 根据 ID 查询
T selectById(Serializable id);
// 根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 entity 条件,查询全部记录
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
除了select方法以外,还有insert\update\delete等。
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
2、select 示例
package com.cn.laoluobase.controller.demo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cn.laoluobase.entity.User;
import com.cn.laoluobase.mapper.UserMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.sql.Wrapper;
import java.util.HashMap;
import java.util.List;
@RestController
@RequestMapping("/demo/mp")
public class MybatisPlusDemo {
@Resource
private UserMapper userMapper;
@GetMapping("/select")
public String list1(){
// 根据 ID 查询。查找id=54的记录
User user = userMapper.selectById(54);
System.out.println(user);
// User(id=54, userName=lily, roleid=null, status=5, isDelete=0)
// 根据 columnMap 条件。这是一种灵活的方式,但是容易写错字段名,写错字段类型
// 比如如下查找roleid=admin,status=2为条件的记录,则只需把条件都放到map对象中即可。
HashMap userMap =new HashMap();
userMap.put("roleid","admin");
userMap.put("status",2);
List<User> userList = userMapper.selectByMap(userMap);
userList.forEach(System.out::println); // System.out::println =>System.out.println(user)
// User(id=50, userName=test, roleid=admin, status=2, isDelete=0)
// 根据 Wrapper 条件,查询全部记录
QueryWrapper<User> userQueryWrapper = new QueryWrapper();
userQueryWrapper.like("user_name","bill");
List<User> userList1 = userMapper.selectList(userQueryWrapper);
System.out.println("************************userQueryWrapper***********************");
userList1.forEach(System.out::println); // System.out::println =>System.out.println(user)
//User(id=51, userName=bill, roleid=admin, status=1, isDelete=0)
return "OK";
}
}
3、insert示例
@GetMapping("/insert")
public String insert(){
User user =new User();
user.setUserName("laoluo");
user.setRoleid("admin");
Integer row = userMapper.insert(user);
System.out.println(row);
// 1 返回1表示影响的行数,不是ID。
System.out.println(user);
// User(id=1673213664939577346, userName=laoluo, roleid=admin, status=null, isDelete=null)
return "OK";
}
可以用接收insert的返回,表示影响的行数,不是0就表示成功。返回值会自动写到实体类中。
4、id字段自增长,需要在实体中设置@TableId
上面inset方法中,插入的id是java产生的,不是数据库自增长的,可以设置主键自增长实现跟随数据库自增长。
五、Wrapper支持很多函数,常用的除了like,还有eq,gt,lt,between,isnull,in 等。![](https://img-blog.csdnimg.cn/20210903204905231.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Lme5Yqb6ams5omO572X44Gu6buO5piO,size_20,color_FFFFFF,t_70,g_se,x_16)
六、点到为止,不扩展了。
mybatis-plus本身的官方文档是中文的,写得很好。如果需要了解更多的使用,请移步到官方吧。我这里就不扩展了,仅以示例的方式做基本使用的介绍。
结束语:
项目完整源码可以到gitee下载:laoluo: Springboot、SpringCloud项目