# 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同时清现与之存在关系的缓存组数据