MyBatis-Plus之BaseMapper
MyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现,我们可以直接使用,接口如 下:
/*
* Copyright (c) 2011-2022, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/*
:`
.:,
:::,,.
:: `::::::
::` `,:,` .:`
`:: `::::::::.:` `:';,`
::::, .:::` `@++++++++:
`` :::` @+++++++++++#
:::, #++++++++++++++`
,: `::::::;'##++++++++++
.@#@;` ::::::::::::::::::::;
#@####@, :::::::::::::::+#;::.
@@######+@:::::::::::::. #@:;
, @@########':::::::::::: .#''':`
;##@@@+:##########@::::::::::: @#;.,:.
#@@@######++++#####'::::::::: .##+,:#`
@@@@@#####+++++'#####+::::::::` ,`::@#:`
`@@@@#####++++++'#####+#':::::::::::@.
@@@@######+++++''#######+##';::::;':,`
@@@@#####+++++'''#######++++++++++`
#@@#####++++++''########++++++++'
`#@######+++++''+########+++++++;
`@@#####+++++''##########++++++,
@@######+++++'##########+++++#`
@@@@#####+++++############++++;
;#@@@@@####++++##############+++,
@@@@@@@@@@@###@###############++'
@#@@@@@@@@@@@@###################+:
`@#@@@@@@@@@@@@@@###################'`
:@#@@@@@@@@@@@@@@@@@##################,
,@@@@@@@@@@@@@@@@@@@@################;
,#@@@@@@@@@@@@@@@@@@@##############+`
.#@@@@@@@@@@@@@@@@@@#############@,
@@@@@@@@@@@@@@@@@@@###########@,
:#@@@@@@@@@@@@@@@@##########@,
`##@@@@@@@@@@@@@@@########+,
`+@@@@@@@@@@@@@@@#####@:`
`:@@@@@@@@@@@@@@##@;.
`,'@@@@##@@@+;,`
``...``
_ _ /_ _ _/_. ____ / _
/ / //_//_//_|/ /_\ /_///_/_\ Talk is cheap. Show me the code.
_/ /
*/
/**
* Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
* <p>这个 Mapper 支持 id 泛型</p>
*
* @author hubin
* @since 2016-01-23
*/
public interface BaseMapper<T> extends Mapper<T> {
/**
* 插入一条记录
*
* @param entity 实体对象
*/
int insert(T entity);
/**
* 根据 ID 删除
*
* @param id 主键ID
*/
int deleteById(Serializable id);
/**
* 根据实体(ID)删除
*
* @param entity 实体对象
* @since 3.4.4
*/
int deleteById(T entity);
/**
* 根据 columnMap 条件,删除记录
*
* @param columnMap 表字段 map 对象
*/
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,删除记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 删除(根据ID或实体 批量删除)
*
* @param idList 主键ID列表或实体列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<?> idList);
/**
* 根据 ID 修改
*
* @param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) T entity);
/**
* 根据 whereEntity 条件,更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
/**
* 根据 ID 查询
*
* @param id 主键ID
*/
T selectById(Serializable id);
/**
* 查询(根据ID 批量查询)
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 查询(根据 columnMap 条件)
*
* @param columnMap 表字段 map 对象
*/
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,查询一条记录
* <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录, 注意:多条数据会报异常</p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {
List<T> ts = this.selectList(queryWrapper);
if (CollectionUtils.isNotEmpty(ts)) {
if (ts.size() != 1) {
throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");
}
return ts.get(0);
}
return null;
}
/**
* 根据 Wrapper 条件,判断是否存在记录
*
* @param queryWrapper 实体对象封装操作类
* @return
*/
default boolean exists(Wrapper<T> queryWrapper) {
Long count = this.selectCount(queryWrapper);
return null != count && count > 0;
}
/**
* 根据 Wrapper 条件,查询总记录数
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
* <p>注意: 只返回第一个字段的值</p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类
*/
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
一、插入一条记录
/*
* 插入一条记录
* */
@Test
public void insert(){
User user=new User(null, "王五", 18, "234@qq.com");
int result=userMapper.insert(user);
//INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
System.out.println("受影响行数:"+result);
//受影响行数:1
System.out.println("id自动获取:"+user.getId());
//id自动获取:1585451009
}
最终执行的结果,所获取的id为:1585451009
这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id(可以在application.yml配置文件里改)
二、删除
1.根据id删除(主键)
/*
* 根据id删除
* */
@Test
public void delete(){
//DELETE FROM user WHERE id=?
int result=userMapper.deleteById(1522577409);
System.out.println("受影响行数:"+result);
}
2.根据实体(id)删除
/*
* 根据实体(ID)删除
* */
@Test
public void delete2(){
User user=new User();
user.setId(2084577282);
//DELETE FROM user WHERE id=?
int result=userMapper.deleteById(user);
System.out.println("受影响行数:"+result);
}
先插一条再删,id是2084577282
3.根据 columnMap 条件,删除记录
/*
* 根据 columnMap 条件,删除记录
* */
@Test
public void testDeleteByMap(){
//根据map集合中所设置的条件删除记录
//DELETE FROM user WHERE name = ? AND age = ?
Map<String, Object> map = new HashMap<>();
map.put("age", 23);
map.put("name", "张三");
int result = userMapper.deleteByMap(map);
System.out.println("受影响行数:"+result);
}
4.根据 entity 条件,删除记录(QueryWrapper)
/*
* 根据 entity 条件,删除记录
* queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
* */
@Test
public void testDelete(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","李四"); //等于
int rows = userMapper.delete(queryWrapper);
System.out.println("影响的行数: "+rows);
}
5.删除(根据ID或实体 批量删除)
/*
* 删除(根据ID或实体 批量删除)
* */
@Test
public void testDeleteBatchIds(){
//根据id批量删除
//DELETE FROM user WHERE id IN ( ? , ? , ? )
List<Integer> ids = Arrays.asList(6, 7);
int result = userMapper.deleteBatchIds(ids);
System.out.println("受影响行数:"+result);
}
三、修改
1.根据id修改
/*
* 根据 ID 修改
* */
@Test
public void testUpdateById(){
User user=new User();
user.setId(6);
user.setName("李四");
//UPDATE user SET name=? WHERE id=?
int result=userMapper.updateById(user);
System.out.println("受影响行数:"+result);
}
2.根据 whereEntity 条件,更新记录(updateWrapper)
/*
* 根据 whereEntity 条件,更新记录
* updateWrapper
* */
@Test
public void testUpdate(){
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 6).set("age", 2);//用set的方式写,不用再创建实体类了,下面就是null
//UPDATE user SET age=? WHERE (id = ?)
int result=userMapper.update(null, updateWrapper);
System.out.println("受影响行数:"+result);
}
四、查询
1.根据id查询
/*
* 根据id查询
* */
@Test
public void testSelectById(){
User user=userMapper.selectById(6);
//SELECT id,name,age,email FROM user WHERE id=?
System.out.println(user);
//User(id=6, name=李四, age=2, email=123@qq.com)
}
2.根据id批量查询
/*
* 根据id批量查询
* */
@Test
public void testSelectBatchIds(){
List<Integer> ids = Arrays.asList(6, 7);
List<User> users = userMapper.selectBatchIds(ids);
//SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
users.forEach(System.out::println);
/* User(id=6, name=李四, age=2, email=123@qq.com)
User(id=7, name=张三, age=10, email=123@qq.com)*/
}
3.通过map条件查询
/*
* 查询(根据 columnMap 条件)
* map
* */
@Test
public void testSelectByMap(){
Map<String, Object> map = new HashMap<>();
map.put("age", 2);
map.put("name", "李四");
//SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
List<User> list = userMapper.selectByMap(map);
list.forEach(System.out::println);
//User(id=6, name=李四, age=2, email=123@qq.com)
}
4.根据 entity 条件,查询一条记录(queryWrapper)
/*
* 根据 entity 条件,查询一条记录
* queryWrapper
* */
@Test
public void testSelectOne(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","李四").lt("age", 5); //eq:等于 lt:<
//SELECT id,name,age,email FROM user WHERE (name = ? AND age < ?)
User user = userMapper.selectOne(queryWrapper);
//User(id=6, name=李四, age=2, email=123@qq.com)
System.out.println(user);
}
5.根据wrapper条件,判断是否存在记录
/*
* 根据 Wrapper 条件,判断是否存在记录
* */
@Test
public void testExist(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","李四").lt("age", 5); //eq:等于 lt:<
//SELECT COUNT( * ) FROM user WHERE (name = ? AND age < ?)
boolean result = userMapper.exists(queryWrapper);
System.out.println("是否存在:"+result);
//是否存在:true
}
6.根据wrapper条件,查询总记录数
/*
* 根据 Wrapper 条件,查询总记录数
* */
@Test
public void testCount(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.le("age", 20); //le:<=小于等于
//SELECT COUNT( * ) FROM user WHERE (age <= ?)
Long result = userMapper.selectCount(queryWrapper);
System.out.println("总记录数:"+result);
//总记录数:3
}
7.根据 entity 条件,查询全部记录
/*
* 根据 entity 条件,查询全部记录
* 第一个测试也是,只不过没有条件,所以写的null
* */
@Test
public void testSelectList1() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.le("age", 20);//le:<=小于等于
//SELECT id,name,age,email FROM user WHERE (age <= ?)
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
8.根据wrapper条件,查询全部记录(List<Map<>>)
/*
* 16.根据 Wrapper 条件,查询全部记录
* List<Map<>>
* */
@Test
public void testSelectList2() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.le("age", 20).like("name", "J");//le:<=小于等于
//SELECT id,name,age,email FROM user WHERE (age <= ? AND name LIKE ?)
List<Map<String, Object>> list = userMapper.selectMaps(queryWrapper);
//list.forEach(System.out::println);
System.out.println(list);
//[{name=Jone, id=1, age=18, email=test1@baomidou.com}, {name=Jack, id=2, age=20, email=test2@baomidou.com}]
}
9.根据wrapper条件,查询全部记录
只返回第一个字段的值
/*
* 根据 Wrapper 条件,查询全部记录
* 只返回第一个字段的值
* */
@Test
public void testSelectList3() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.le("age", 20).like("name", "J");//le:<=小于等于
//SELECT id,name,age,email FROM user WHERE (age <= ? AND name LIKE ?)
List<Object> list = userMapper.selectObjs(queryWrapper);
list.forEach(System.out::println);
//1
//2(1 2是id值,因为只返回第一个字段的值,第一个字段是id)
}