queryWrapper);
/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类
*/
>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
}
```
### 二、插入
> 向User表中插入一条用户数据
>
> SQL:INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
+ User实体类中加入`@AllArgsConstructor`注解,生成包含类中所有字段的构造方法
```java
@Test
public void testInsert() {
User user = new User(null, "张三", 23, "zhangsan@163.com");
int result = userMapper.insert(user);
System.out.println("受影响行数:" + result);
//1601527304443998210
System.out.println("id自动获取:" + user.getId());
}
```
**运行结果**
```
==> Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
==> Parameters: 1601527304443998210(Long), 张三(String), 23(Integer), zhangsan@163.com(String)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@33a3c44a]
受影响行数:1
id自动获取:1601527304443998210
```
> 最终执行的结果,所获取的id为1601527304443998210
>
> 这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id
### 三、删除
#### 3.1 通过id删除记录
> 删除id为1601527304443998210的用户数据
>
> SQL:DELETE FROM user WHERE id=?
```java
@Test
public void testDeleteById() {
//通过id删除用户信息
int result = userMapper.deleteById(1601527304443998210L); //ID为long类型,后面需要跟L进行标识
System.out.println("受影响行数:" + result);
}
```
**运行结果**
```
==> Preparing: DELETE FROM user WHERE id=?
==> Parameters: 1601527304443998210(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@33a3c44a]
受影响行数:1
```
#### 3.2 通过id批量删除记录
> 批量删除id为1,2,3的用户数据
>
> SQL:DELETE FROM user WHERE id IN ( ? , ? , ? )
```java
@Test
public void testDeleteBatchIds() {
//通过多个id批量删除
List idList = Arrays.asList(1L, 2L, 3L);
int result = userMapper.deleteBatchIds(idList);
System.out.println("受影响行数:" + result);
}
```
**运行结果**
```
==> Preparing: DELETE FROM user WHERE id IN ( ? , ? , ? )
==> Parameters: 1(Long), 2(Long), 3(Long)
<== Updates: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5fcfca62]
受影响行数:3
```
#### 3.3 通过map条件删除记录
> 通过姓名和年龄来删除用户
>
> SQL:DELETE FROM user WHERE name = ? AND age = ?
```java
@Test
public void testDeleteByMap(){
//根据map集合中所设置的条件删除记录
Map map = new HashMap<>();
map.put("name", "张三");
map.put("age", 23);
int result = userMapper.deleteByMap(map);
System.out.println("受影响行数:"+result);
}
```
**运行结果**
```
==> Preparing: DELETE FROM user WHERE name = ? AND age = ?
==> Parameters: 张三(String), 23(Integer)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28501a4b]
受影响行数:1
```
### 四、修改
> 通过id修改用户的姓名和年龄
>
> SQL:UPDATE user SET name=?, age=? WHERE id=?
```java
@Test
public void testUpdateById(){
User user = new User(4L, "admin", 22, null);
int result = userMapper.updateById(user);
System.out.println("受影响行数:"+result);
}
```
**运行结果**
```
==> Preparing: UPDATE user SET name=?, age=? WHERE id=?
==> Parameters: admin(String), 22(Integer), 4(Long)
<== Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@cf67838]
受影响行数:1
```
### 五、查询
#### 5.1 根据id查询用户信息
> 查询id为4的用户信息
>
> SQL:SELECT id,name,age,email FROM user WHERE id=?
```java
@Test
public void testSelectById(){
//根据id查询用户信息
User user = userMapper.selectById(4L);
System.out.println(user);
}
```
**运行结果**
```
==> Preparing: SELECT id,name,age,email FROM user WHERE id=?
==> Parameters: 4(Long)
<== Columns: id, name, age, email
<== Row: 4, admin, 22, test4@baomidou.com
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@33a3c44a]
User(id=4, name=admin, age=22, email=test4@baomidou.com)
```
#### 5.2 根据多个id查询多个用户信息
> 查询id为4、5的用户信息
>
> SQL:SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
```java
@Test
public void testSelectBatchIds(){
//根据多个id查询多个用户信息
List idList = Arrays.asList(4L, 5L);
List list = userMapper.selectBatchIds(idList);
list.forEach(System.out::println);
}
```
**运行结果**
```
==> Preparing: SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
==> Parameters: 4(Long), 5(Long)
<== Columns: id, name, age, email
<== Row: 4, admin, 22, test4@baomidou.com
<== Row: 5, Billie, 24, test5@baomidou.com
<== Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@24934262]
User(id=4, name=admin, age=22, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
```
#### 5.3 通过map条件查询用户信息
> 查询用户名称为admin并且年龄为22的员工信息
>
> SQL:SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
```java
@Test
public void testSelectByMap(){
//通过map条件查询用户信息
Map map = new HashMap<>();
map.put("age", 22);
map.put("name", "admin");
List list = userMapper.selectByMap(map);
list.forEach(System.out::println);
}
```
**运行结果**
```
==> Preparing: SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
==> Parameters: admin(String), 22(Integer)
<== Columns: id, name, age, email
<== Row: 4, admin, 22, test4@baomidou.com
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@24934262]
User(id=4, name=admin, age=22, email=test4@baomidou.com)
```
#### 5.4 查询所有数据
> 查询所有用户信息
>
> SQL:SELECT id,name,age,email FROM user
```java
@Test
public void testSelectList(){
//查询所有用户信息
List list = userMapper.selectList(null);
list.forEach(System.out::println);
}
```
**运行结果**
```
==> Preparing: SELECT id,name,age,email FROM user
==> Parameters:
<== Columns: id, name, age, email
<== Row: 4, admin, 22, test4@baomidou.com
<== Row: 5, Billie, 24, test5@baomidou.com
<== Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@24934262]
User(id=4, name=admin, age=22, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
```
通过观察BaseMapper中的方法,大多方法中都有Wrapper类型的形参,此为条件构造器,可针对于SQL语句设置不同的条件,若没有条件,则可以为该形参赋值null,即查询(删除/修改)所有数据。
### 六、自定义功能
MyBatis-Plus 中默认读取的 `XxxMapper.xml` 的位置是在 `src/main/resources/mapper` 下的所有 xml 文件(可以包含任意层目录),所以可以不用自己设定 `XxxMapper.xml` 的位置。
#### 6.1 查询用户信息
> 根据id查询用户信息
>
> SQL:select id,name,age,email from user where id = ?
+ **UserMapper.java**
```java
@Repository
public interface UserMapper extends BaseMapper {
/**
* 根据id用户信息为map集合
* @param id
* @return
*/
Map selectMapById(long id);
}
```
+ **UserMapper.xml**
```xml
```
+ **测试**
```java
@Test
public void selectMapById(){
Map map = userMapper.selectMapById(4L);
System.out.println(map);
}
```
**运行结果**
```
==> Preparing: select id,name,age,email from user where id = ?
==> Parameters: 4(Long)
<== Columns: id, name, age, email
<== Row: 4, admin, 22, test4@baomidou.com
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4554de02]
{name=admin, id=4, age=22, email=test4@baomidou.com}
```
### 七、通用Service
- 通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 `get 查询单行`、 `remove 删除` 、`list 查询集合`、 `page 分页` 前缀命名方式区分 `Mapper` 层避免混淆
- 泛型 `T` 为任意实体对象
- 建议如果存在自定义通用 Service 方法的可能,请创建自己的 `IBaseService` 继承 `Mybatis-Plus` 提供的基类
- 对象 `Wrapper` 为条件构造器
+ 官网地址:https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%A3
*注:BaseMapper不支持批量操作,IBaseService支持批量操作*
#### 7.1 IService
MyBatis-Plus中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑
详情查看源码IService和ServiceImpl
##### IService方法
**(1)save(增)**
```java
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection entityList);
// 插入(批量)
boolean saveBatch(Collection entityList, int batchSize);
```
**(2)SaveOrUpdate(增或改)**
```java
// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection entityList, int batchSize);
```
**(3)Remove(删)**
```java
// 根据 entity 条件,删除记录
boolean remove(Wrapper queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection extends Serializable> idList);
```
**(4)Update(改)**
```java
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper updateWrapper);
// 根据 whereEntity 条件,更新记录
boolean update(T entity, Wrapper updateWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection entityList, int batchSize);
```
**(5)Get(按条件查)**
```java
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map getMap(Wrapper queryWrapper);
// 根据 Wrapper,查询一条记录
V getObj(Wrapper queryWrapper, Function super Object, V> mapper);
```
**(6)List(查)**
```java
// 查询所有
List list();
// 查询列表
List list(Wrapper queryWrapper);
// 查询(根据ID 批量查询)
Collection listByIds(Collection extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection listByMap(Map columnMap);
// 查询所有列表
List
评论已关闭