文章目录
- 前言
-
- mybatis-plus 简介
- mybatis-plus 优点
- 相关链接
- mybatis-plus实例
-
- 1、示例项目结构
- 2、数据库准备
- 3、pom.xml:
- 4、application.yml
- 5、User.java
- 6、UserMapper.java
- 7、UserServiceImpl.java
- 8、测试类
- mybatis-plus的crud:
-
- 这些方法都写在UserServiceImpl.java中
-
- 1、insert操作:
- 2、select操作:
- 3、update操作:
- 4、delete操作:
- 最后直接放上我的测试类供参考
- 总结:
前言
mybatis-plus 简介
mybatis-plus 是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。
mybatis-plus 优点
- 无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
- 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
- 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作
- 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
- 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
- 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于写基本List查询
- 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作
相关链接
- 文档
- 代码生成
- 功能示例
- 展示
- 企业版 Mybatis-Mate 高级特性
下面就先用一个springboot项目演示mybatis-plus 的基础操作
实例的完整代码将会放在文章最后
mybatis-plus实例
正如官方所说,mybatis-plus在mybatis的基础上只做增强不做改变,因此其与spring的整合亦非常简单。只需把mybatis的依赖换成mybatis-plus的依赖,再把sqlSessionFactory换成mybatis-plus的即可。接下来看具体操作:
1、示例项目结构
2、数据库准备
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`sex` char(6) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`pwd` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`email` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 28 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'test0', '男', 'aaaa', '1230@qq.com');
INSERT INTO `user` VALUES (2, 'test1', '女', 'aaaa', '1231@qq.com');
INSERT INTO `user` VALUES (3, 'test2', '男', 'aaaa', '1232@qq.com');
INSERT INTO `user` VALUES (4, 'test3', '女', 'aaaa', '1233@qq.com');
INSERT INTO `user` VALUES (5, 'test4', '男', 'aaaa', '1234@qq.com');
INSERT INTO `user` VALUES (6, 'test5', '女', 'aaaa', '1235@qq.com');
INSERT INTO `user` VALUES (7, 'test6', '男', 'aaaa', '1236@qq.com');
INSERT INTO `user` VALUES (8, 'test7', '女', 'aaaa', '1237@qq.com');
INSERT INTO `user` VALUES (9, 'test8', '男', 'aaaa', '1238@qq.com');
INSERT INTO `user` VALUES (10, 'test9', '女', 'aaaa', '1239@qq.com');
INSERT INTO `user` VALUES (11, 'test10', '男', 'aaaa', '12310@qq.com');
INSERT INTO `user` VALUES (12, 'test11', '女', 'aaaa', '12311@qq.com');
INSERT INTO `user` VALUES (13, 'test12', '男', 'aaaa', '12312@qq.com');
INSERT INTO `user` VALUES (14, 'test13', '女', 'aaaa', '12313@qq.com');
INSERT INTO `user` VALUES (15, 'test14', '男', 'aaaa', '12314@qq.com');
3、pom.xml:
核心依赖如下:
<!--mybatis-plus的springboot支持-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--简化代码的工具包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
注意:这些是核心依赖,本项目还用到了mysql驱动、lombok。集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突;lombok是一个工具,添加了这个依赖,开发工具再安装Lombok插件,就可以使用它了,最常用的用法就是在实体类中使用它的@Data注解,这样实体类就不用写set、get、toString等方法了。
4、application.yml
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
map-underscore-to-camel-case: true
# 该配置就是将带有下划线的表字段映射为驼峰格式的实体类属性
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybits?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
username: root
password: aaaa
5、User.java
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
@TableName(value = "User")//指定表名
public class User implements Serializable {
private static final long serialVersionUID = -5644799954031156649L;
//value与数据库主键列名一致,若实体类属性名与表主键列名一致可省略value
@TableId(value = "id", type = IdType.AUTO)//指定自增策略
private Integer id;
private String name;
private String sex;
private String pwd;
private String email;
}
6、UserMapper.java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.king.mybatis_plus.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
//表明这是一个Mapper,也可以在启动类上加上包扫描
//Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
public interface UserMapper extends BaseMapper<User> {
}
这样就完成了mybatis-plus与springboot的整合。首先是把mybatis和mybatis-spring依赖换成mybatis-plus的依赖,然后把sqlsessionfactory换成mybatis-plus的,然后实体类中添加@TableName、@TableId等注解,最后mapper继承BaseMapper即可。
7、UserServiceImpl.java
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.king.mybatis_plus.bean.User;
import com.king.mybatis_plus.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class UserServiceImpl {
@Autowired
UserMapper userMapper;
//查询全部
public List<User> queryAll() {
return userMapper.selectList(null);
}
}
8、测试类
import com.king.mybatis_plus.bean.User;
import com.king.mybatis_plus.service.UserServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.*;
@SpringBootTest
public class UserServiceImplTest {
@Autowired
UserServiceImpl userService;
@Test
public void queryAll() {
userService.queryAll().forEach(System.out::println);
}
}
本文所有代码本人均亲自测试过,本文涉及代码又较多,为了不影响篇幅,故非必要处不再截图。接下来的所有操作都是基于此整合好的项目。
mybatis-plus的crud:
这些方法都写在UserServiceImpl.java中
1、insert操作:
//添加一条数据
public int add(User user) {
return userMapper.insert(user);
}
//添加多条数据
public void add(List<User> users) {
for (User user : users) {
add(user);
}
}
执行添加操作,直接调用insert方法传入实体即可。
2、select操作:
- 查询全部
public List<User> queryAll() {
return userMapper.selectList(null);
}
- 通过id查询
public User queryById(User user) {
return userMapper.selectById(user.getId());
}
- 通过姓名模糊查询
public List<User> queryByName(String name) {
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.like("name", name); //参数为表中的列名,要查询的条件 相当于 WHERE name LIKE %name%
return userMapper.selectList(userQueryWrapper);
}
- 通过姓名精确查询
public List<User> queryByName2(String name) {
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("name", name);//参数为表中的列名,要查询的条件 相当于 WHERE name = name
return userMapper.selectList(userQueryWrapper);
}
注
:还可以使用map来实现相同的效果
public List<User> queryByNameMap(String name) {
Map<String, Object> map = new HashMap<>();
map.put("name", name);
return userMapper.selectByMap(map);
}
- 通过Id查询批量查询
public List<User> queryByIds() {
List<Integer> idList = new ArrayList<>();
idList.add(10);
idList.add(11);
return userMapper.selectBatchIds(idList);
}
- 计数
public int count() {
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
return userMapper.selectCount(userQueryWrapper);
}
注
:也可以和上面的一样加入各种条件
3、update操作:
// 根据条件更新
public void changeBy(User user, String column, Object val) {
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq(column, val);
int num = userMapper.update(user, userQueryWrapper);
System.out.println("影响行数:" + num);
}
// 通过ID修改信息
public void changeUserById(User user) {
int num = userMapper.updateById(user);
System.out.println("影响行数:" + num);
}
4、delete操作:
- 通过ID删除
public int deleteById(User user) {
return userMapper.deleteById(user.getId());
}
- 通过条件删除
public void deleteBy(String column, Object val) {
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq(column, val);
int num = userMapper.delete(userQueryWrapper);
System.out.println("影响行数:" + num);
}
public void delete(Map<String, Object> map) {
userMapper.deleteByMap(map);
}
注:该方法与selectByMap类似,将条件封装在columnMap中,然后调用deleteByMap方法,传入columnMap即可,返回值是Integer类型,表示影响的行数。
- 通过id批量删除
public void deleteByIds() {
List<Integer> idList = new ArrayList<>();
idList.add(10);
idList.add(11);
int num = userMapper.deleteBatchIds(idList);
System.out.println("影响行数:" + num);
}
注:该方法和selectBatchIds类似,把需要删除的记录的id装进idList,然后调用deleteBatchIds,传入idList即可。
最后直接放上我的测试类供参考
@SpringBootTest
public class UserServiceImplTest {
@Autowired
UserServiceImpl userService;
@Test
public void queryAll() {
userService.queryAll().forEach(System.out::println);
}
@Test
public void add() {
List<User> users = new ArrayList<>();
for (int i = 0; i < 15; ++i) {
User user = User.builder().id(i + 1).name("test" + i).sex(i % 2 == 0 ? "男" : "女").pwd("aaaa").email("123" + i + "@qq.com").build();
users.add(user);
}
users.forEach(System.out::println);
userService.add(users);
}
@Test
public void query() {
userService.queryAll().forEach(System.out::println);
userService.queryByName1("test1").forEach(System.out::println);
userService.queryByName2("test1").forEach(System.out::println);
User user = userService.queryById(User.builder().id(2).build());
System.out.println(user);
userService.queryByNameMap("test1").forEach(System.out::println);
System.out.println(userService.count());
}
@Test
public void delete() {
User user = User.builder().id(2).build();
userService.deleteById(user);
userService.deleteBy("name", "test15");
userService.deleteByIds();
}
@Test
public void change() {
User user1 = User.builder().name("蔡徐坤").build();
userService.changeBy(user1, "sex", "男");
user1.setName("蔡徐坤2");
userService.changeUserById(user1);
}
}
总结:
以上便是mybatis-plus的入门教程,介绍了其如何与springboot整合、通用crud的使用,但是这并不是mybatis-plus的所有内容,其强大不限于此。
最后附上我的演示例源码
Github https://github.com/KingJin-web/springboot/tree/master/mybatis_plus
Gitee https://gitee.com/KingJin-web/springboot/tree/master/mybatis_plus
以上内容属于个人笔记整理,如有错误,欢迎批评指正!