使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL。而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改。这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障。
M y b a t i s − p l u s 中通用 m a p p e r 就把普通的增删改查操作封装成了 B a s e M a p p e r 和 I S e r v i c e \color{red}{Mybatis-plus中通用mapper就把普通的增删改查操作封装成了BaseMapper和IService} Mybatis−plus中通用mapper就把普通的增删改查操作封装成了BaseMapper和IService。下面我将讲述BaseMapper具体有哪些属性以及相关操作。
使用Mybatis-plus 代码生成器 AutoGenerator 以及添加相关依赖,生成代码。这些步骤我上一篇博客已经谢过了,这里是链接:
Mybatis-plus 代码生成器 AutoGenerator 的简介和(最详细)使用
说明:
BaseMapper-CRUD官方文档:https://mybatis.plus/guide/crud-interface.html#mapper-crud-%E6%8E%A5%E5%8F%A3
// 官网API
// 插入一条记录
// int insert(T entity);
@Autowired
private UserMapper userMapper;
//添加 -- BaseMapper api不支持批量添加
public void insert() {
//当前数据库id设置为自增,id策略需设置id-type配置
User user = new User();
user.setName("wangsong");
user.setAge(23);
user.setEmail("[email protected]");
userMapper.insert(user);
System.out.println(user.getId());
}
// 官网api
// // 根据 entity 条件,删除记录
// int delete(@Param(Constants.WRAPPER) Wrapper wrapper);
// // 删除(根据ID 批量删除)
// int deleteBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList);
// // 根据 ID 删除
// int deleteById(Serializable id);
// // 根据 columnMap 条件,删除记录
// int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap);
@Autowired
private UserMapper userMapper;
// id删除
public void deleteById() {
userMapper.deleteById(8);
}
// ids 批量删除
public void deleteBatchIds() {
List<Long> ids = new ArrayList<>();
ids.add(7);
ids.add(6);
userMapper.deleteBatchIds(ids);
}
// columnMap 条件删除
public void deleteByMap() {
//kay是字段名 value是字段值
Map<String,Object> map = new HashMap<>();
map.put("id","6");
userMapper.deleteByMap(map);
}
// wrapper 条件删除
public void delete() {
// 拼接sql参考:DELETE FROM user WHERE (id = ? AND name = ?)
QueryWrapper<User> wrapper = new QueryWrapper<>();
// kay是字段名 value是字段值
wrapper.eq("id",6)
.eq("name","wangsong");
userMapper.delete(wrapper);
}
// 官网api
// //根据 whereEntity 条件,更新记录
// int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper);
// //根据 ID 修改
// int updateById(@Param(Constants.ENTITY) T entity);
@Autowired
private UserMapper userMapper;
// 根据id 更新修改
public void updateById() {
User user = new User();
//需要修改的数据 Id
user.setId(9);
//需要修改的数据
user.setName("erping");
user.setAge(23);
user.setEmail("[email protected]");
userMapper.updateById(user);
}
// 使用 updateWrapper 条件修改(2种方式任选其一)
public void update() {
//方式一
// 更新修改字段
User user = new User();
user.setEmail("[email protected]");
// 更新添加,未设置条件 sql: UPDATE user SET email=? ,设置后:UPDATE user SET email=? WHERE (id = ?)
UpdateWrapper<User> wrapper1 = new UpdateWrapper<User>();
wrapper1.eq("id",9);
userMapper.update(user,wrapper1);
//方式二
// UpdateWrapper wrapper2 = new UpdateWrapper();
// wrapper2.set("email","[email protected]") // 更新的内容,可往后 .set连接
// .eq("id",9); // 更新的条件,可往后 .eq 添加
// userMapper.update(null,wrapper2);
}
// 官网api
//
// // 根据 ID 查询
// T selectById(Serializable id);
// // 根据 entity 条件,查询一条记录
// T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);
//
// // 查询(根据ID 批量查询)
// List selectBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList);
// // 根据 entity 条件,查询全部记录
// List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);
// // 查询(根据 columnMap 条件)
// List selectByMap(@Param(Constants.COLUMN_MAP) Map columnMap);
// // 根据 Wrapper 条件,查询全部记录
// List
// // 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
// List
//
// // 根据 entity 条件,查询全部记录(并翻页)
// IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
// // 根据 Wrapper 条件,查询全部记录(并翻页)
// IPage
// // 根据 Wrapper 条件,查询总记录数
// Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);
@Autowired
private UserMapper userMapper;
// id查询
@Test
public void selectById(){
User user = userMapper.selectById(1L);
System.out.println(user.toString());
}
// ids 批量查询
public void selectBatchIds(){
List<Long> ids = new ArrayList<>();
ids.add(1);
ids.add(2);
List<User> users = userMapper.selectBatchIds(ids);
System.out.println(users.toString());
}
// 查询全部
public void selectList(){
List<User> users = userMapper.selectList(null);
System.out.println(users.toString());
}
// 条件查询 queryWrapper(无条件则查询全部)
public void selectListWrapper(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("id",1);
List<User> users = userMapper.selectList(wrapper);
System.out.println(users.toString());
}
// 分页查询 selectPage
// 需添加分页插件配置: 详见config/MybatisPlusConfig.java
public void selectPage(){
// 页数 /每页记录数
Page<User> page = new Page<>(1,2);
// 分页 / 参数二:wrapper查询条件
Page<User> userPage = userMapper.selectPage(page, null);
System.out.println("总页数"+userPage.getPages());
System.out.println("总记录数"+userPage.getTotal());
System.out.println(userPage.getRecords().toString());
}
//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("com.xxgg.blog.mapper")
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}
说明:
Service官网Api文档:https://mybatis.plus/guide/crud-interface.html#service-crud
注: B a s e M a p p e r 不支持批量操作, I B a s e S e r v i c e 支持批量操作 \color{red}{注:BaseMapper 不支持批量操作,IBaseService支持批量操作} 注:BaseMapper不支持批量操作,IBaseService支持批量操作
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereEntity 条件,更新记录
boolean update(T entity, Wrapper<T> updateWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
// 无条件分页查询
IPage<T> page(IPage<T> page);
// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
// 查询总记录数
int count();
// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper);
// 链式查询 普通
QueryChainWrapper<T> query();
// 链式查询 lambda 式。注意:不支持 Kotlin
LambdaQueryChainWrapper<T> lambdaQuery();
// 示例:
query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();
// 链式更改 普通
UpdateChainWrapper<T> update();
// 链式更改 lambda 式。注意:不支持 Kotlin
LambdaUpdateChainWrapper<T> lambdaUpdate();
// 示例:
update().eq("column", value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);
下面列举前面出现的参数说明:
参数名称 | 类型 | 描述 |
---|---|---|
id | Serializable | 主键ID |
entity | T | 实体对象 |
entityList | Collection | 实体对象集合 |
batchSize | int | 插入批次数量 |
page | IPage | 翻页对象 |
wrapper | Wrapper | 实体对象封装操作类 |
updateWrapper | Wrapper | 实体对象封装操作类 UpdateWrapper |
queryWrapper | Wrapper | 实体对象封装操作类 QueryWrapper |
mapper | Function super Object, V> | 转换函数 |
idList | Collection extends Serializable> | 主键ID列表 |
columnMap | Map |
表字段 map 对象 |
throwEx | boolean | 有多个 result 是否抛出异常 |
官方文档:https://mybatis.plus/guide/