目录
一、简介
1、框架结构
二、入门案例
1、创建数据库及表
2、测试BaseMapper自带的方法
3、测试自定义功能
4、通用Service
官网:简介 | MyBatis-Plus
mybatis-plus在mybatis基础只做增强不做改变
创建表
CREATE TABLE USER(
id BIGINT(20) NOT NULL COMMENT '主键ID',
NAME VARCHAR(30) DEFAULT NULL COMMENT '姓名',
age INT(11) DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
添加数据
INSERT INTO USER(id,NAME,age,email) VALUES
(1,'Jone',18,'[email protected]'),
(2,'Jack',20,'[email protected]'),
(3,'Tom',28,'[email protected]'),
(4,'Sandy',21,'[email protected]'),
(5,'Billie',24,'[email protected]');
导入依赖
com.baomidou
mybatis-plus-boot-starter
3.5.1
org.projectlombok
lombok
true
mysql
mysql-connector-java
runtime
连接数据库
spring:
# 配置数据源信息
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库的各个信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&userSSL=false
username: root
password:
注意:
1、驱动类 driver-class-name
spring boot 2.0 (内置jdbc5驱动),驱动类使用:
driver-class-name:com.mysql.jdbc.Driver
spring boot 2.1及以上 (内置jdbc8驱动),驱动类使用:
driver-class-name:com.mysql.cj.jdbc.Driver
否则运行测试用例时会出现WARN信息
2、连接地址url
MySQL5.7版本的url:
jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&userSSL=false
MySQL8.0版本的url:
jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&characterEncoding=utf-8&userSSL=false
否则运行测试用例会抛出异常
可以在配置文件中添加下面代码,结果就会显示数据库语句
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
package com.springboot.mybatisplus;
import com.springboot.mybatisplus.mapper.UserMapper;
import com.springboot.mybatisplus.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.jws.soap.SOAPBinding;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootTest
public class MyBatisPlusTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectList(){
//通过条件构造器查询一个list集合,若没有条件,则可以设置null为参数
List list=userMapper.selectList(null);
list.forEach(System.out::println);
}
@Test
public void testInsert(){
//测试增加一条用户信息
//INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
User user=new User();
user.setName("张三");
user.setAge(18);
user.setEmail("[email protected]");
int result=userMapper.insert(user);
System.out.println("result:"+result);
System.out.println("id:"+user.getId());
}
@Test
public void testDelete(){
//DELETE FROM user WHERE id=?
// int result = userMapper.deleteById(0);
// System.out.println(result);
//DELETE FROM user WHERE name = ? AND age = ?
// Map map=new HashMap<>();
// map.put("name","张三");
// map.put("age",23);
// int result=userMapper.deleteByMap(map);
// System.out.println(result);
//通过多个id实现批量删除
//DELETE FROM user WHERE id IN ( ? , ? , ? )
List list=Arrays.asList(1L,2L,3L);
int result=userMapper.deleteBatchIds(list);
System.out.println(result);
}
@Test
public void testUpdate(){
//UPDATE user SET name=?, email=? WHERE id=?
User user=new User();
user.setId(4L);
user.setName("李四");
user.setEmail("[email protected]");
int result=userMapper.updateById(user);
System.out.println(result);
}
@Test
public void testSelect(){
//SELECT id,name,age,email FROM user WHERE id=?
// User user=userMapper.selectById(1L);
// System.out.println(user);
//SELECT id,name,age,email FROM user WHERE id IN ( ? , ? , ? )
// List list=Arrays.asList(1L,2L,3L);
// List users=userMapper.selectBatchIds(list);
// users.forEach(System.out::println);
//SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
// Map map=new HashMap<>();
// map.put("name","Jack");
// map.put("age",20);
// List users=userMapper.selectByMap(map);
// users.forEach(System.out::println);
//SELECT id,name,age,email FROM user
List users=userMapper.selectList(null);
users.forEach(System.out::println);
}
}
添加模板步骤
mybatis-mapper
mybatis-config
userMapper类
@Repository //持久层
public interface UserMapper extends BaseMapper {
/**
* 根据id查询用户信息为map集合
* @param id
* @return
*/
Map selectMapById(Long id);
}
UserMapper.xml
测试
@Test
public void testSelect(){
//select id,name,age,email from user where id=?
Map map=userMapper.selectMapById(1L);
System.out.println(map);
}
官方说明:
- 通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用
get 查询单行
remove 删除
list 查询集合
page 分页
前缀命名方式区分Mapper
层避免混淆,- 泛型
T
为任意实体对象- 建议如果存在自定义通用 Service 方法的可能,请创建自己的
IBaseService
继承Mybatis-Plus
提供的基类- 对象
Wrapper
为 条件构造器
说明:泛型为要操作的实体表所对应的Java实体类
核心方法:
1、Save 新增
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection entityList);
// 插入(批量)
boolean saveBatch(Collection entityList, int batchSize);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
T | entity | 实体对象 |
Collection |
entityList | 实体对象集合 |
int | batchSize | 插入批次数量 |
2、SaveOrUpdate 新增或修改
// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection entityList, int batchSize);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
T | entity | 实体对象 |
Wrapper |
updateWrapper | 实体对象封装操作类 UpdateWrapper |
Collection |
entityList | 实体对象集合 |
int | batchSize | 插入批次数量 |
3、Remove 删除
// 根据 entity 条件,删除记录
boolean remove(Wrapper queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection extends Serializable> idList);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
Wrapper |
queryWrapper | 实体包装类 QueryWrapper |
Serializable | id | 主键 ID |
Map |
columnMap | 表字段 map 对象 |
Collection extends Serializable> | idList | 主键 ID 列表 |
4、Update 修改
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection entityList, int batchSize);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
Wrapper |
updateWrapper | 实体对象封装操作类 UpdateWrapper |
T | entity | 实体对象 |
Collection |
entityList | 实体对象集合 |
int | batchSize | 更新批次数量 |
案例测试
UserService接口
public interface UserService extends IService {
}
UserServiceImpl
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
}
MybatisPlusServiceTest测试类
//查询操作
@Test
public void testGetCount(){
//查询总记录数
//SELECT COUNT( * ) FROM user
long count=userService.count();
System.out.println("总记录数:"+count);
}
//插入操作
@Test
public void testInsertMore(){
//批量添加
//INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )
List list=new ArrayList<>();
for (int i = 1; i <=10 ; i++) {
User user=new User();
user.setName("ybc"+i);
user.setAge(20+i);
list.add(user);
}
boolean b = userService.saveBatch(list);
System.out.println(b);
}
报错:java.sql.BatchUpdateException: Duplicate entry '0' for key 'user.PRIMARY'
解决:给主键设置自增