通用Mapper
(一)基本配置和要求使用
配置有三部曲,需要按照要求配置,实体类还需要遵守约定
ü 导入依赖
还需要JPA注解
ü 配置拦截器
在Mybatis-config.xml中配置通用Mapper在mybatis中的拦截器
ü dao接口继承Mapper
泛型里面写需要查询的实体类
ü 实体类约定:
通用mapper的要求:
1.默认表名就是类名,如果不符合,使用@Table注解声明
2.默认表字段名称就是类属性名称(如果开启驼峰匹配,在驼峰匹配规则内),如果不符合,使用@Column注解声明
3.主键使用@Id注解声明 因为主键是唯一的
4.如果某属性只是javaBean中存在,表中不需要,需要使用 *@Transient 注解声明 进行忽略
(二)API(通用mapper)
1.查询
T selectOne(T record);
查询单个对象 条件至多只有一个匹配,有多个结果是抛出异常
List
根据实体类不为null的字段查询总数,条件全部使用=号and条件
List
查询全部结果,select(null)方法能达到同样的效果
int selectCount(T record);
按条件查询总条数
T selectByPrimaryKey(Object key);(有效果)
根据主键进行查询
User user = ##Mapper.selectByPrimaryKey(100);
相当于select from user where id = 100
int selectCountByExample(Object example);
按综合条件查询总条数
List
综合条件查询(in 查询 < = !=null 的查询就使用这个)
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(“joe”);
criteria.andUsernameIsNull();
example.setOrderByClause(“username asc,email desc”);
List<?>list = ##Mapper.selectByExample(example);
相当于:select
by username asc,email desc
2.新增
int insertSelective(T record);
用这个新增 ,传入的属性会修改,不传入的属性不会修改
int insert(T record);!!!不要使用
新增,不传入属性的都会变为null
3.删除
int delete(T record);
根据条件删除,注意传入的数值不要是通用的,比如传入state=1 那么符合条件的都会删除
int deleteByPrimaryKey(Object key);
通过主键进行删除,这里最多只会删除一条数据
单个字段做主键时,可以直接写主键的值
联合主键时,key可以是实体类,也可以是Map
##Mapper.deleteByPrimaryKey(101);
相当于:delete from user where id=101
int deleteByExample(Object example);
综合条件删除
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(“joe”);
##Mapper.deleteByExample(example);
相当于:delete from user where username=’joe’
4.修改
int updateByPrimaryKeySelective(T record);
根据主键更新 参数是实体类 ,设置的会更新,没设置的不会改动
User user = new User();
user.setId(101);
user.setPassword(“joe”);
##Mapper.updateByPrimaryKeySelective(user);
相当于:update user set password=’joe’ where id=101
int updateByExampleSelective(@Param(“record”) T record, @Param(“example”) Object example);
第一个参数 是要修改的部分值组成的对象,其中有些属性为null则表示该项不修改。
第二个参数 是一个对应的查询条件的类, 通过这个类可以实现 order by 和一部分的where 条件。
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(“joe”);
User user = new User();
user.setPassword(“123”);
##Mapper.updateByPrimaryKeySelective(user,example);
相当于:update user set password=’123’ where username=’joe’
int updateByExample(@Param(“record”) T record, @Param(“example”) Object example);
通过综合条件更新
5.统计
countByExample()
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(“joe”);
int count = ##Mapper.countByExample(example);
相当于:select count(*) from user where username=’joe’
int updateByPrimaryKey(T record);!!!不要使用
会覆盖原先的没设置的属性,没设置的属性都会变为null
(三)逆向工程生成好的通用mapper
1.排序查询
@Override
public List
//从缓存中查询数据,基于广告分类查询广告数据
List
if(contentList==null) {//没有从缓存中获取数据
System.out.println(“从数据库中获取广告数据”);
TbContentExample example = new TbContentExample();
Criteria criteria = example.createCriteria();
//基于分类id查询广告
criteria.andCategoryIdEqualTo(categoryId);
criteria.andStatusEqualTo(“1”);//有效状态
example.setOrderByClause(“sortorder”); //排序查询
contentList = contentMapper.selectByExample(example);
//将结果放入缓存
redisTemplate.boundHashOps(“content”).put(categoryId, contentList);
}else {
System.**_out.println(“从缓存中获取广告数据”);
}
return** contentList;
}
(四)其它
1.全局主键策略
通用 Mapper 4.0.2 版本增加了新的控制主键生成的策略,但是只是对调用通用mapper方法有效,如果是手写insert就无效了
使用方法
package com.lanmili.utils;
import tk.mybatis.mapper.genid.GenId;
import java.util.UUID;
/**
uuid去横杠的主键策略
*/
public class UUIdGenId implements GenId
@Override
public String genId(String table, String column) {
**return **UUID._randomUUID_().toString().replaceAll(**"-"**, **""**);
}
}
ü 实体类
添加@KeySql注解
public class SysUser implements Serializable {
@Id
@KeySql(genId = UUIdGenId.class)
private String id;
SpringBoot整合通用Mapper
https://www.yuque.com/docs/share/0991c8b5-4e29-49cf-b3aa-e23b2244f561?#