Mybatis 的一种奇特封装

看咱们一个大佬自定义的 Mybatis 实现,简化了 Dao 接口,直呼新奇,通过容许后发出来分享下。sql

咱们在业务代码中这样操做数据库的数据库

queryDao.executeForObject("selItemStaByIdSQL", itemId, Integer.class); updateDao.execute("insBasItemSQL", basicItemDO);ide

查询类的接口用 queryDao,新增修改删除用 updateDaothis

具体有如下几个接口: 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,公众号里有抽奖送书活动。)对象

相关文章
相关标签/搜索