Mybatis通用DAO mybatis-generic-dao 使用文档

使用前说明 (暂时只在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同时清现与之存在关系的缓存组数据

 

转载于:https://my.oschina.net/jeebey/blog/917821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值