使用前说明 (暂时只在MYSQL数据下测试使用,插件装入有执行顺序,分页及缓存插件搁最后)
1. mybatis-generic-dao 实现功能列表
1) CriterionInterceptor - 普通语句条件支持插件
2) ParameterInterceptor - 参数增强辅助功能插件
3) GenericInterceptor - 单表增删改查通用插件
4) FiledsInterceptor - 查询字段智能转换插件
5) PaginationInterceptor - 数据分页查询功能插件
6) CacheInterceptor - 对象级联缓存清理插件
2. mybatis-generic-dao 插件使用示例
[1] 通用操作插件
//示例DAO配置
public interface UserDao extends GenericDao<User, Integer> {}
//示例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
}
1) 插入
示例1: userDao.insertEntity(entity) 单条插入
示例2: userDao.insertEntitys(entitys) 批量插入
示例3: userDao.insertEntitySelective(entity) 非空插入
2) 修改
示例1: userDao.updateEntity(entity) 根据主键全字段更新
示例2: userDao.updateEntityByCriterion(entity, criterion) 根据条件全字段批量更新
示例3: userDao.updateEntitySelective(entity) 根据主键非空字段更新
示例4: userDao.updateEntitySelectiveByCriterion(entity, criterion) 根据条件非空字段批量更新
3) 删除
示例1: userDao.deleteEntityById(id) 根据主键删除
示例2: userDao.deleteEntityByIds(ids) 根据主键列表批量删除
示例3: userDao.deleteEntitysByCriterion(criterion) 根据条件组合批量删除
4) 查询
示例1: userDao.selectAllCount() 默认查询全部
示例2: userDao.selectAllEntitys() 默认查询全部,返回LIST
示例3: userDao.selectEntityById(id) 根据主键查询
示例4: userDao.selectEntitysByIds(ids) 根据主键列表批量查询
示例5: userDao.selectEntityByCriterion(criterion) 按条件查询,返回LIST对象
示例6: userDao.selectEntitysByCriterionBounds(criterion, bounds) 物理分页,返回LIST对象
示例7: userDao.selectEntitysByCriterionRowBounds(criterion, rowBounds) 逻辑分页,LIST对象
示例8: userDao.selectEntitysByPaging(condition, paging) 物理分页,Pagination对象
示例9: userDao.selectEntitysCountByCriterion(criterion) 数据数量,返回items
5) 自定义
示例1:userDao.executeCustomDeleteSQLBy(sql, params)
示例2:userDao.executeCustomInsertSQLBy(sql, params)
示例3:userDao.executeCustomUpdateSQLBy(sql, params)
示例4: userDao.executeCustomSelectObjSQLBy("select Count(1) from t_user where id=?", Lists.newArrayList(2), Long.class);
示例5: userDao.executeCustomSelectListSQLBy("select #[com.jeebey.xxxx.User] from t_user where id=? or id=?", Lists.newArrayList(22,11), Map.class);
[2] 参数增强插件 (支持Java写法,支持XML写法,通用自定义SQL)
--方法中包含分页对象(Paging)即可,返回List接口实现,可强转为Pagination对象:
示例1: select * from t_user where in $[users] params: List<String>users ===> select * from t_user where in ('?','?','?')
[3] 数据分页插件 (支持Java写法,支持XML写法,通用自定义SQL)
示例1: 通用 :Pagination<User> pagination = (Pagination<User>) userDao.selectEntitysByPaging(null, new Paging<User>(1, 2));
示例2: 自定义:Pagination<User> pagination = (Pagination<User>) userDao.selectUsersByPaging(null, new Paging<User>(1, 2));
[4] 智能字段插件 (支持Java写法,支持XML写法,通用自定义SQL)
--自定义SQL,Field智能返回
示例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 按需返回字段
[5] 条件语句插件 (支持Java写法与XML写法)
--自定义SQL,条件动态拼装
示例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
[6] 缓存清理插件 (支持Java写法,不支持XML)
--清理依赖关系的缓存
示例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<Group> selectAllGroups();
问题: 如果开启缓存会同时缓存数据 通过com.jeebey.xxx.dao.UserDao.selectUsersByGroupId2 查询得到的children 存放在 当前dao分组下,
此时更新com.jeebey.xxx.dao.UserDao下的清理缓存操作,并不能清理children数据,造成数据不一致
解决: 清理com.jeebey.xxx.dao.UserDao同时清现与之存在关系的缓存组数据