公司的框架都是用原生的JDBC框架,其中操作数据很大一部分都是在拼凑SQL语句和GET/SET上,这种方式不仅麻烦而且很容易出错,端午节放假几天,突然间想起来把SQL配置XML中去,然后再用JAVA反射机制动态赋值,直接生成可执行的SQL给JDBC,这样可以省下一大堆的时间,而且错误率很少,当然我现在只是实现简单的应用,先上传到博客上,防止丢失说不定格式化了就没了...
下面是我的实现方法:
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 动态SQL赋值,生成可执行SQL语句
* 使用方法:
* SQLFactory sql = new SQLFactory(pojo, xmlpath);
* 两个参数第一个是POJO对象,第二个是配置sql xml位置
* 获取生成SQL方法:
* String sql = sql.getSQL(xmlKey);
* xmlKey:sql xml配置文件中每一个sql的id对应值,在xml中id唯一,不可重复
*
* 引入jar:
* 本工厂生成sql类,依赖两个jar包,
* 1:dom4j-1.6.1.jar
* 2: jaxen-1.1.1.jar
* 环境:
* JDK 1.5以上
*
* @author lizhenbin
*
*/
public class SQLFactory {
/**
* get方法
*/
private static final String BOOLEANHEAD = "is";
private static final String STRHEAN = "get";
/**
* 过滤XML配置文件特殊标志
*/
private static final char SPLIT_XMLCHAR = '#';
private static final char SPLIT_LIKE_XMLCHAR = '%';
private static final String SPLIT_XMLSTR = "#";
private static final String SPLIT_LIKE_XMLSTR = "%";
private static final String SPLIT_SQLSTR = "'";
/**
* XML路径
*/
private String xmlPath;
/**
* sql语句集合体
*/
private List<Map<String, String>> sqlMapList = null;
/**
* 初始化,获取SQL
* @param xmlPath
*/
public SQLFactory(String xmlPath) {
this.xmlPath = xmlPath;
XMLLoader load = new XMLLoader(this.xmlPath);
this.sqlMapList = load.loadSQL();
}
/**
* 直接获取SQL语句,用于不需要传入参数
*
* @param sqlId
* XML配置的SQL主键ID
* @return
*/
public String getBasicSQL(String sqlId) {
return this.getXMLSql(sqlId);
}
/**
* 初始化时候是JAVA的基本类型或者其实现类,调用此方法获取SQL语句
* 适用于通过单个属性信息查询
* eg : java.lang.String, java.lang.Integer...
*
* @param sqlId
* XML配置的SQL主键ID
* @param obj
* POJO对象
* @return
* JDBC SQL语句
*/
public String getBasicSQL(String sqlId, Object obj) {
if(obj == null)
return this.getXMLSql(sqlId);
StringBuilder sql = new StringBuilder();
sql.append(this.getXMLSql(sqlId));
List<String> fieldlist = new ArrayList<String>();
List<Integer> splitlist = new ArrayList<Integer>();
for(int i = 0; i < sql.length(); i++) {
char symbol = sql.charAt(i);
if(symbol == this.SPLIT_XMLCHAR) {
splitlist.add(i);
}
}
/**
* 获取POJO的值,放在MAP中
*/
List<Map<Object, Object>> valuesList = new ArrayList<Map<Object, Object>>();
Class clazz = obj.get