看咱们一个大佬自定义的 Mybatis 实现,简化了 Dao 接口,直呼新奇,通过容许后发出来分享下。sql
咱们在业务代码中这样操做数据库的数据库
queryDao.executeForObject("selItemStaByIdSQL", itemId, Integer.class);
updateDao.execute("insBasItemSQL", basicItemDO);
ide
查询类的接口用 queryDao
,新增修改删除用 updateDao
。this
具体有如下几个接口: spa
具体实现很简单,继承 SqlSessionDaoSupport
获取 SqlSession
,把 SqlSession
的方法重写下就行了。debug
@Override
public <E> E executeForObject(String sqlId, Object params, Class<E> clazz) {
if (log.isDebugEnabled()) {
log.debug("executeForObject Start.");
}
if (ObjectUtils.isEmpty(sqlId)) {
throw new IllegalClassTypeException("sqlId can not be empty.");
}
log.info(MessageFormat.format("sqlId[{0}],输入参数:[{1}]", sqlId, params));
StopWatch stopWatch = new StopWatch(sqlId);
stopWatch.start();
SqlSession sqlSession = this.getSqlSession();
Object obj = sqlSession.selectOne(sqlId, params);
if (log.isDebugEnabled() && ObjectUtils.isNotEmpty(obj)) {
log.debug("Return type:" + obj.getClass().getName());
}
E entity = null;
try {
if (ObjectUtils.isNotEmpty(clazz) && ObjectUtils.isNotEmpty(obj)) {
entity = clazz.cast(obj);
}
} catch (ClassCastException e) {
log.error("The illegal Class Type of the argument.");
throw new IllegalClassTypeException(e);
}
if (log.isDebugEnabled()) {
log.debug("executeForObject End.");
}
stopWatch.stop();
log.info("----------sqlId:" + sqlId + "执行完毕,耗时" + stopWatch.getTotalTimeMillis() + "毫秒----------");
log.debug(MessageFormat.format("sqlId[{0}],返回值:[{1}]", sqlId, entity));
return entity;
}
@Override
public <E> List<E> executeForObjectListByPage(String sqlId, Object params, PageInfo pageInfo) throws Exception {
if (log.isDebugEnabled()) {
log.debug("executeForObjectListByPage Start.");
}
if (ObjectUtils.isEmpty(sqlId)) {
throw new IllegalClassTypeException("sqlId can not be empty.");
}
log.info(MessageFormat.format("sqlId[{0}],输入参数:[{1}]", sqlId, params));
if (ObjectUtils.isEmpty(pageInfo)) {
throw new BLogicException("sqlId:" + sqlId + "的参数pageInfo对象不能为空!");
}
Integer pageNum = pageInfo.getPageNum();
if (ObjectUtils.isEmpty(pageNum) || pageNum <= 0) {
throw new BLogicException("sqlId:" + sqlId + "的参数的pageNum属性不能为空,而且必须大于0!");
}
Integer pageSize = pageInfo.getPageSize();
if (ObjectUtils.isEmpty(pageSize) || pageSize <= 0) {
throw new BLogicException("sqlId:" + sqlId + "的参数的pageSize属性不能为空,而且必须大于0!");
}
StopWatch stopWatch = new StopWatch(sqlId);
stopWatch.start();
SqlSession sqlSession = this.getSqlSession();
PageHelper.startPage(pageNum, pageSize);
String orderBy = pageInfo.getOrderBy();
if (ObjectUtils.isNotEmpty(orderBy)) {
PageHelper.orderBy(orderBy);
}
List<E> list = sqlSession.selectList(sqlId, params);
if (log.isDebugEnabled()) {
log.debug("executeForObjectListByOrderPage End.");
}
stopWatch.stop();
log.info("----------sqlId:" + sqlId + "执行完毕,耗时" + stopWatch.getTotalTimeMillis() + "毫秒----------");
log.info(MessageFormat.format("sqlId[{0}],返回值:[{1}]", sqlId, list));
return list;
}
复制代码
@Override
public int execute(String sqlId, Object params) {
if (log.isDebugEnabled()) {
log.debug("execute Start.");
}
if (ObjectUtils.isEmpty(sqlId)) {
throw new IllegalClassTypeException("sqlId can not be empty.");
}
log.info(MessageFormat.format("sqlId[{0}],输入参数:[{1}]", sqlId, params));
StopWatch stopWatch = new StopWatch(sqlId);
stopWatch.start();
SqlSession sqlSession = this.getSqlSession();
int row = sqlSession.update(sqlId, params);
if (log.isDebugEnabled()) {
log.debug("execute End. success count:" + row);
}
stopWatch.stop();
log.info("----------sqlId:" + sqlId + "执行完毕,耗时" + stopWatch.getTotalTimeMillis() + "毫秒----------");
return row;
}
复制代码
emmm,这篇文章没啥技术含量,就提供一种新的思路,有喜欢的朋友欢迎借鉴,我以为少了 Dao 层的封装用起来就挺方便的,sqlId 惟一就行了。若是用那种见名知意的方式,也不会重复。code
通常 sqlId 的命名我习惯简写 Insert 为 Ins,Update 为 Upd,Delete 为 Del,Select 为 Sel,列表查询是 List 开头,尽可能不要让一个 sqlId 过长反而看不懂,结尾加上 SQL 代表是 sqlId。orm
对这种方式有不一样看法的朋友欢迎评论交流~~~期待你的回复。cdn
每一次成长,都想与你分享。(小声BB,公众号里有抽奖送书活动。)对象