Java实现读取xml文件sql配置转换为JDBC SQL

本文介绍了一种将XML中的SQL配置转换为Java动态生成的JDBC SQL的方法,以减少手动拼凑SQL的复杂性和错误率。通过反射机制,实现了简单应用,简化了数据操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      公司的框架都是用原生的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值