通用Mapper

(一)基本配置和要求使用

配置有三部曲,需要按照要求配置,实体类还需要遵守约定
ü 导入依赖
还需要JPA注解


javax.persistence
persistence-api
1.0




com.github.abel533
mapper
2.3.4

ü 配置拦截器
在Mybatis-config.xml中配置通用Mapper在mybatis中的拦截器









ü dao接口继承Mapper
泛型里面写需要查询的实体类
通用Mapper[笔记] - 图1
ü 实体类约定:
通用mapper的要求:
1.默认表名就是类名,如果不符合,使用@Table注解声明
2.默认表字段名称就是类属性名称(如果开启驼峰匹配,在驼峰匹配规则内),如果不符合,使用@Column注解声明
3.主键使用@Id注解声明 因为主键是唯一的
4.如果某属性只是javaBean中存在,表中不需要,需要使用 *@Transient 注解声明 进行忽略
通用Mapper[笔记] - 图2

(二)API(通用mapper)

1.查询

T selectOne(T record);
查询单个对象 条件至多只有一个匹配,有多个结果是抛出异常
List select(T record);
根据实体类不为null的字段查询总数,条件全部使用=号and条件
List selectAll();
查询全部结果,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 selectByExample(Object example);
综合条件查询(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
from user where username = ‘joe’ and username is null order
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 findByCategoryId(Long categoryId) {
//从缓存中查询数据,基于广告分类查询广告数据
List contentList = (List) redisTemplate.boundHashOps(“content”).get(categoryId);

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) {

  1. **return **UUID._randomUUID_().toString().replaceAll(**"-"**, **""**);

}
}
ü 实体类
添加@KeySql注解
public class SysUser implements Serializable {

@Id

@KeySql(genId = UUIdGenId.class)

private String id;

private String login_name;

SpringBoot整合通用Mapper


https://www.yuque.com/docs/share/0991c8b5-4e29-49cf-b3aa-e23b2244f561?#