反射封裝工具類-----零SQL插入

V_1.0 需求:開發一個工具方法,輔助初級程序員在不須要掌握sql命令和JDBC的狀況下,實現對數據庫的插入操做。java

V_4.0  實現0sql插入操做須要解決的問題.mysql

           1. 如何確認當前【陌生對象】關聯的【表名】程序員

           2. 如何確認當前表中須要添加數據的字段sql

           3. 如何將對象中數據和表中字段作一個一一對應數據庫

V_5.0 解決方案:工具

                    【實體類映射文件】描述某一個實體類與表的對象關係。spa

                    經過這個文件瞭解當前類關聯的【表名稱】orm

                    經過這個文件瞭解當前【表】和當前【對象】的字段和屬性對應關係  xml

工具類實現:
public class ReflectUtil {
	/**
	 * 步驟:
	 * 		1.將xml文件和實體類對象加載到內存中
	 * 		2.將obj對象中數據,生成插入sql命令
	 * @param obj 實體對象
	 * @param xmlPath 實體對象和數據庫表映射xml表
	 */
	public static  void save(Object obj,String xmlPath) throws Exception{
		//0.局部變量
		String xPath = "";	
		
		Connection con =null;
		PreparedStatement ps =null;
		String sql="";
		String sql_v="values (";
		
		//1.將xml文件和實體類對象加載到內存中
		SAXReader reader = new SAXReader();
		Document doc =reader.read(xmlPath);
		
		Class clazz =obj.getClass();
		//2.將obj對象中數據,生成插入sql命令
		//2.1 得到要插入的表名
		xPath ="//@table";
		Attribute e_table =(Attribute) doc.selectSingleNode(xPath);
		String tableName =e_table.getValue();
		//2.2 jdbc鏈接數據庫
		  Class.forName("com.mysql.jdbc.Driver");
		  con= DriverManager.getConnection("jdbc:mysql://localhost:3306/databases", "root", "root");
		  sql ="insert into "+tableName+"(";
		
		Field[] fields =clazz.getDeclaredFields();
		//拼接sql語句
		for(int i=0;i<fields.length;i++){
			Field fieldObj = fields[i];
			String fieldName =fieldObj.getName();
			//從xml中查找該field對應的數據類型
			xPath = "//property[@name='"+fieldName+"']";
			Element ele_f =(Element) doc.selectSingleNode(xPath);
			String colName =ele_f.attribute("colName").getValue();
			if(i==fields.length-1){
				sql+=colName+")";
				sql_v+="?)";
			}else{
				sql+=colName+",";
				sql_v+="?,";
			}
		}
		sql+=sql_v;
		//預編譯
		ps=con.prepareStatement(sql);
		//預編譯對象賦值
		for(int i=0;i<fields.length;i++){
			Field fieldObj = fields[i];
			String fieldName =fieldObj.getName();
			//從xml中查找該field對應的數據類型
			xPath = "//property[@name='"+fieldName+"']";
			Element ele_f =(Element) doc.selectSingleNode(xPath);
			//得到列對應的數據類型
			String colType =ele_f.attribute("colType").getValue();
			//獲取權限
			fieldObj.setAccessible(true);
			//從實體類對象中得到值
			Object valueObj = fieldObj.get(obj);
			if("int".equals(colType)){
				ps.setInt(i+1, (Integer)valueObj);
			}else if("varchar".equals(colType)){//String
				ps.setString(i+1, (java.lang.String)valueObj);
			}else if("double".equals(colType)){
				ps.setDouble(i+1, (Double)valueObj);
			}else if("date".equals(colType)){
				//mysql中支持將一個字符串賦值給日期類
				Date data = (Date)valueObj;
				SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
				ps.setString(i+1, sdf.format(data));
			}
		}
		int count =ps.executeUpdate();
	}
}
表和實體類映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean classPath="com.xiehe.entily.DeptVO" table="dept">
	 	<property name="deptNo" type="int" colName="DEPTNO" colType ="int"></property>
	 	<property name="dName" type="java.lang.String" colName="DNAME" colType="varchar"></property>
	 	<property name="loc" type="java.lang.String" colName="LOC" colType="varchar"></property>
	</bean>
</beans>
相關文章
相關標籤/搜索