Mybatis 的一种奇特封装

446 阅读2分钟

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

我们在业务代码中这样操作数据库的

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

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

具体有以下几个接口:

具体实现很简单,继承 SqlSessionDaoSupport 获取 SqlSession,把 SqlSession 的方法重写下就好了。

    @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 唯一就好了。如果用那种见名知意的方式,也不会重复。

一般 sqlId 的命名我习惯简写 Insert 为 Ins,Update 为 Upd,Delete 为 Del,Select 为 Sel,列表查询是 List 开头,尽量不要让一个 sqlId 过长反而看不懂,结尾加上 SQL 表明是 sqlId。

对这种方式有不同见解的朋友欢迎评论交流~~~期待你的回复。


每一次成长,都想与你分享。(小声BB,公众号里有抽奖送书活动。)