文档章节

反正讨厌配置各种xml,于是我自己添加了mybatis的sql生成

小七酱
 小七酱
发布于 2015/07/10 18:01
字数 636
阅读 40
收藏 0
package com.xqi.webs.data.sql;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.xqi.common.util.HString;
import com.xqi.webs.bean.XWhere;

/**
 * 通用sql语句生成实现类
 * 
 * @author mike <br>
 *         2015年6月10日
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
public class BaseSqlProvider implements IBaseSqlProvider {

    private static Logger log = Logger.getLogger(BaseSqlProvider.class);

    @Override
    public String getPageXDataSql(Map<String, Object> params) {
        StringBuffer sb = new StringBuffer(params.get(PARAM_SQL).toString());

        String orderBy = (String) params.get(PARAM_ORDER_BY);
        String order = (String) params.get(PARAM_ORDER);
        Long start = (Long) params.get(PARAM_START);
        Long len = (Long) params.get(PARAM_LEN);

        XWhere xwhere = (XWhere) params.get(PARAM_WHERE_KEY);
        if (!HString.isEmpty(xwhere)) {
            sb.append(getWhere(xwhere));
        }

        if (HString.isEmpty(orderBy))
            orderBy = SQL_COLUMN_PK;
        sb.append(SQL_ORDER_BY + orderBy);
        if (HString.isEmpty(order))
            order = SQL_ORDER_DESC;
        sb.append(order);
        if (HString.isEmpty(start))
            start = 0l;
        sb.append(SQL_LIMIT + start);
        if (HString.isEmpty(len) || len == 0l)
            len = 20l;
        sb.append("," + len);
        log.debug("getPageXData:" + sb);
        return sb.toString();
    }

    @Override
    public String getPageCountSql(Map<String, Object> params) {
        StringBuffer sb = new StringBuffer(SQL_SELECT_COUNT + "(" + params.get(PARAM_SQL).toString());
        XWhere xwhere = (XWhere) params.get(PARAM_WHERE_KEY);
        if (!HString.isEmpty(xwhere)) {
            sb.append(getWhere(xwhere));
        }
        sb.append(") pagetable ");
        log.debug("getPageCountSql:" + sb);
        return sb.toString();
    }

    /**
     * 拼装where条件的方法
     * 
     * @param xwhere
     * @return
     */
    static StringBuffer getWhere(XWhere xwhere) {
        StringBuffer sb = new StringBuffer(SQL_WHERE);
        for (Iterator<String> iterator = xwhere.keySet().iterator(); iterator.hasNext();) {
            String key = iterator.next();
            if (WHERE_LIKE.equals(xwhere.getWby(key)))
                sb.append(key + WHERE_LIKE + "CONCAT('%',#{where." + key + "},'%') ");
            else if (WHERE_IN.equals(xwhere.getWby(key))) 
                sb.append(key + WHERE_IN + "(" + getInOrNotIn(xwhere.get(key)) + ") ");
            else if (WHERE_NOT_IN.equals(xwhere.getWby(key))) 
                sb.append(key + WHERE_NOT_IN + "(" + getInOrNotIn(xwhere.get(key)) + ") ");
            else if (WHERE_IS_NULL.equals(xwhere.getWby(key)))
                sb.append(key + WHERE_IS_NULL);
            else if (WHERE_IS_NOT_NULL.equals(xwhere.getWby(key)))
                sb.append(key + WHERE_IS_NOT_NULL);
            else if (WHERE_NOT_EQ_1.equals(xwhere.getWby(key)) || WHERE_NOT_EQ_2.equals(xwhere.getWby(key)))
                sb.append(key + WHERE_NOT_EQ_2 + "#{where." + key + "} ");
            else
                sb.append(key + WHERE_EQ + "#{where." + key + "} ");
            sb.append(xwhere.getWlk(key));
        }
        sb.delete(sb.length() - 4, sb.length());
        return sb;
    }

    /**
     * in 跟 not in 返回的
     * 
     * @param objArr
     * @return
     */
    static String getInOrNotIn(Object objArr) {
        String str = "";
        if (objArr instanceof List) {
            List list = (List) objArr;
            if (list.get(0) instanceof String) {
                for (int i = 0; i < list.size(); i++) {
                    str += "'" + list.get(i) + "',";
                }
                str = str.substring(0, str.length() - 1);
            } else {
                str = list.toString().replace("[", "").replace("]", "");
            }
        } else if (objArr.getClass().isArray()) {
            List list = null;
            if(objArr.getClass().toString().contains("String")){
                String [] strArr = (String[]) objArr;
                list = Arrays.asList(strArr);
                
                for (int i = 0; i < list.size(); i++) {
                    str += "'" + list.get(i) + "',";
                }
                str = str.substring(0, str.length() - 1);
            } else {
                Number [] strArr = (Number[]) objArr;
                list = Arrays.asList(strArr);
                str = list.toString().replace("[", "").replace("]", "");
            }
        }
        return str;
    }

}


IObjectMapper 中的写法

@SelectProvider(type = BaseSqlProvider.class, method = "getPageXDataSql")
    @Options(useCache = true, flushCache = false, timeout = 10000)
    public List<XData> getPageData(Map<String, Object> params);


Service中的写法

public Long getCount(Map<String, Object> params) {
    return objectMapper.getCount(params);
}

public XPage getPage(XPage page, XWhere where, String orderBy, String order) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put(IBaseSqlProvider.PARAM_WHERE_KEY, where);
        params.put(IBaseSqlProvider.PARAM_ORDER_BY, orderBy);
        params.put(IBaseSqlProvider.PARAM_ORDER, order);
        String sql = "select * from t_sys_user";
        params.put(IBaseSqlProvider.PARAM_SQL, sql);
        if (HString.isEmpty(page.getTotalResult()) || page.getTotalResult() <= 0) {
            page.setTotalResult(objectMapper.getCount(params));
            page.setCurrentResult(0l);
            page.setCurrentPage(1l);
        }
        params.put(IBaseSqlProvider.PARAM_START, page.getCurrentResult());
        params.put(IBaseSqlProvider.PARAM_LEN, page.getShowCount());
        List<XData> list = objectMapper.getPageData(params);
        page.setRows(list);
        return page;
    }


测试类中的写法
            XWhere xwhere = new XWhere();
//            List<String> names = new ArrayList<String>();
//            names.add("admin8");
//            names.add("admin2");
//            names.add("admin5");
//            List<Object> ids = new ArrayList<Object>();
//            ids.add(11);
//            ids.add(12);
//            ids.add(14);
            String [] names = new String[]{"admin8","admin2","admin5"};
            Integer [] ids = new Integer[]{11,12,14};
            xwhere.put("login_name", names, WHERE_IN);
            xwhere.put("id", ids, WHERE_IN, SQL_WLK_OR);
            ObjectService objService = applicationContext.getBean(ObjectService.class);
            XPage page = new XPage();
            page = objService.getPage(page, xwhere, "login_name", SQL_ORDER_DESC);
            List<XData> list = page.getRows();
            for (XData map : list) {
                System.out.println(map);
            }


© 著作权归作者所有

小七酱
粉丝 1
博文 30
码字总数 17079
作品 0
武汉
程序员
私信 提问
MybatisExt

MybatisExt 项目扩展自 Mybatis,具有以下特点: 一、运行环境支持 通过指定虚拟机参数,自动加载properties文件中的指定代码块(velocity实现)各种耗性能的操作在生产环境下不会执行 二、内...

歇蹩虎子
2015/12/02
2.1K
2
回顾一下MyBatis逆向工程——自动生成代码

⭐⭐⭐⭐⭐最最最最最重要的事情: 我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java-Guide 我...

snailclimb
2018/07/12
0
0
bobo/mybatisext

技术讨论 QQ 群 492238239 http://www.oschina.net/p/mybatisext MybatisExt项目扩展自Mybatis,具有以下特点: 一、运行环境支持 通过指定虚拟机参数,自动加载properties文件中的指定代码块...

bobo
2015/09/07
0
0
mybatis版的spring-data-jpa

当时看到spring-data-jpa用方法名来定义sql查询感觉非常好,后来用了一段时间,因为spring-data-jpa是基于hibernate,而我的hibernate又是非常不好,于是在网上查询了相关资料,主要借鉴了m...

大道至简氵
2016/11/18
1K
7
mybatis 版的 spring-data-jpa --mybatis-jpa

mybatis-jpa 当时看到spring-data-jpa用方法名来定义sql查询感觉非常好,后来用了一段时间,因为spring-data-jpa是基于hibernate,而我的hibernate又是非常不好,于是在网上查询了相关资料,...

大道至简氵
2016/11/18
11.9K
4

没有更多内容

加载失败,请刷新页面

加载更多

nginx访问日志/日志切割/静态文件过期时间/防盗链

Nginx访问日志主要记录部署在nginx上的网站访问数据,日志格式定义在nginx主配置文件中。 nginx主配置文件:/etc/nginx/nginx.conf 查看nginx主配置文件: ```markup [root@linux ~]# cat /e...

asnfuy
14分钟前
5
0
JS_高程4.变量,作用域和内存问题(2)执行环境及作用域

本文转载于:专业的前端网站➨JS_高程4.变量,作用域和内存问题(2)执行环境及作用域 1.执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,       每个执...

前端老手
18分钟前
3
0
手机迅雷下载的文件,电脑上找不到问题

不知道手机迅雷怎么做到的,手机迅雷下载的文件,手机上可以看的到 但连电脑后, 电脑上看不到文件 . 尝试了打开查看隐藏文件, 但没有效果 . 手机上查询文件权限 也是对的 . 可读,可写, 不隐藏 ...

ol_O_O_lo
19分钟前
3
0
python学习11:Python tuple元组详解

元组是 Python 中另一个重要的序列结构,和列表类似,也是由一系列按特定顺序排序的元素组成。和列表不同的是,列表可以任意操作元素,是可变序列;而元组是不可变序列,即元组中的元素不可以...

太空堡垒185
32分钟前
4
0
Java实现数据结构之线性结构

一、顺序表 顺序表本质是使用数组储存数组的一种数据结构,在计算机的储存中是连续的分配内存的。 下面是我自己使用java实现的简单顺序表结构 package list; public class MyArrayList<E> { ...

daxiongdi
34分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部