# mybatis-generic-dao
**Repository Path**: armyant/mybatis-generic-dao
## Basic Information
- **Project Name**: mybatis-generic-dao
- **Description**: mybatis-generic-dao
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2018-03-03
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#mybatis-generic-dao
使用前说明 (暂时只在MYSQL数据下测试使用,插件装入有执行顺序,分页及缓存插件搁最后)
#0. 私人仓库配置
```Xml
nexus-repos
Team Nexus Repository
http://nexus.jeebey.com/content/groups/public/
```
#1. 实现功能列表
1. CriterionInterceptor - 普通语句条件支持插件
2. ParameterInterceptor - 参数增强辅助功能插件
3. GenericInterceptor - 单表增删改查通用插件
4. FiledsInterceptor - 查询字段智能转换插件
5. PaginationInterceptor - 数据分页查询功能插件
6. CacheInterceptor - 对象级联缓存清理插件
#2. 通用插件示例
1. 配置
```Java
//示例DAO配置
public interface UserDao extends GenericDao {}
```
```Java
//示例BEAN配置示例
@Table(name = "t_group") //表名映射
public class Group implements Serializable {
@Id //指定主键
@GeneratedValue(strategy = GeneratedStrategy.UUID,referType=String.class) //32位UUID
//@GeneratedValue(strategy = GeneratedStrategy.JDBC,referType=String.class) //数据自增
//@GeneratedValue(strategy = GeneratedStrategy.SHORTUUID,referType=String.class) //19位UUID
//@GeneratedValue(strategy = GeneratedStrategy.GENERATOR,generator="select SUBSTR(RAND(),3)",position=GeneratedPosition.BEFORE,referType=String.class)
//@GeneratedValue(strategy = GeneratedStrategy.GENERATOR,generator="select '1211'",position=GeneratedPosition.BEFORE,referType=String.class)
private String id;
@Column(name="cname",escape=false) //数据字段别名映射,及关键字转义
private String name;
@Transient //非持久化字段
private Object object;
//get set
}
```
2. 插入
```Java
userDao.insertEntity(entity) //单条插入
userDao.insertEntitys(entitys) //批量插入
userDao.insertEntitySelective(entity) //非空插入
```
3. 修改
```Java
userDao.updateEntity(entity) //根据主键全字段更新
userDao.updateEntityByCriterion(entity, criterion) //根据条件全字段批量更新
userDao.updateEntitySelective(entity) //根据主键非空字段更新
userDao.updateEntitySelectiveByCriterion(entity, criterion) //根据条件非空字段批量更新
```
4. 删除
```Java
userDao.deleteEntityById(id) //根据主键删除
userDao.deleteEntityByIds(ids) //根据主键列表批量删除
userDao.deleteEntitysByCriterion(criterion) //根据条件组合批量删除
```
5. 查询
```Java
userDao.selectAllCount() //默认查询全部
userDao.selectAllEntitys() //默认查询全部,返回LIST
userDao.selectEntityById(id) //根据主键查询
userDao.selectEntitysByIds(ids) //根据主键列表批量查询
userDao.selectEntityByCriterion(criterion) //按条件查询,返回LIST对象
userDao.selectEntitysByCriterionBounds(criterion, bounds) //物理分页,返回LIST对象
userDao.selectEntitysByCriterionRowBounds(criterion, rowBounds //逻辑分页,LIST对象
userDao.selectEntitysByPaging(condition, paging) //物理分页,Pagination对象
userDao.selectEntitysCountByCriterion(criterion) //数据数量,返回items
```
6. 自定义
```Java
userDao.executeCustomDeleteSQLBy(sql, params)
userDao.executeCustomInsertSQLBy(sql, params)
userDao.executeCustomUpdateSQLBy(sql, params)
userDao.executeCustomSelectObjSQLBy("select Count(1) from t_user where id=?", Lists.newArrayList(2), Long.class);
userDao.executeCustomSelectListSQLBy("select #[com.jeebey.xxxx.User] from t_user where id=? or id=?", Lists.newArrayList(22,11), Map.class);
```
#3. 参数插件示例
示例1:
sql : select * from t_user where in $[users]
params: Listusers ===> select * from t_user where in ('?','?','?')
#4. 分页插件示例
示例1: 通用 :Pagination pagination = (Pagination) userDao.selectEntitysByPaging(null, new Paging(1, 2));
示例2: 自定义:Pagination pagination = (Pagination) userDao.selectUsersByPaging(null, new Paging(1, 2));
#5. 字段插件示例
示例1: @Select("select #[com.jeebey.mybatis.bean.User] from t_user limit 1")
public User selectUsersAllField();
执行1: select #[com.jeebey.xxxx.User] from t_user ===> select id,cname name,ctime from t_user 默认返回所有
示例2: @Select("select #[com.jeebey.mybatis.bean.User(name,ctime)] from t_user limit 1")
public User selectUsersIdxField();
执行2: select #[com.jeebey.xxxx.User(name,ctime)] from t_user ===> select cname name,ctime from t_user 按需返回字段
#6. 条件查询示例
示例1: @Select("select count(1) from t_user")
public Long selectUsersCountByCriterion(@Param("criterion") Criterion criterion);
执行1: select id,cname name,ctime from t_user WHERE (id = ? OR id IS NULL) AND id IS NULL
#7. 缓存清理示例
```Java
//示例1:
@Select("select * from t_group")
@CascadeCache(clazz={UserDao.class})
@Results(value = {
@Result(property="id",column = "id"),
@Result(property="name",column = "name"),
@Result(property = "children", column = "{gid=id,name=name}", javaType = List.class, id = false, many = @Many(select = "com.jeebey.xxx.dao.UserDao.selectUsersByGroupId2")) })
public List selectAllGroups();
```
问题: 如果开启缓存会同时缓存数据 通过com.jeebey.xxx.dao.UserDao.selectUsersByGroupId2 查询得到的children 存放在 当前dao分组下,
此时更新com.jeebey.xxx.dao.UserDao下的清理缓存操作,并不能清理children数据,造成数据不一致
解决: 清理com.jeebey.xxx.dao.UserDao同时清现与之存在关系的缓存组数据