反射封装工具类-----零SQL插入
V_1.0?需求:開發(fā)一個(gè)工具方法,輔助初級(jí)程序員在不需要掌握sql命令和JDBC的情況下,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的插入操作。
V_4.0??實(shí)現(xiàn)0sql插入操作需要解決的問題.
???????????1.?如何確認(rèn)當(dāng)前【陌生對(duì)象】關(guān)聯(lián)的【表名】
???????????2.?如何確認(rèn)當(dāng)前表中需要添加數(shù)據(jù)的字段
???????????3.?如何將對(duì)象中數(shù)據(jù)和表中字段做一個(gè)一一對(duì)應(yīng)
V_5.0?解決方案:
????????????????????【實(shí)體類映射文件】描述某一個(gè)實(shí)體類與表的對(duì)象關(guān)系。
????????????????????通過這個(gè)文件了解當(dāng)前類關(guān)聯(lián)的【表名稱】
????????????????????通過這個(gè)文件了解當(dāng)前【表】和當(dāng)前【對(duì)象】的字段和屬性對(duì)應(yīng)關(guān)系??
工具類實(shí)現(xiàn): public class ReflectUtil {/*** 步驟:* 1.將xml文件和實(shí)體類對(duì)象加載到內(nèi)存中* 2.將obj對(duì)象中數(shù)據(jù),生成插入sql命令* @param obj 實(shí)體對(duì)象* @param xmlPath 實(shí)體對(duì)象和數(shù)據(jù)庫(kù)表映射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文件和實(shí)體類對(duì)象加載到內(nèi)存中SAXReader reader = new SAXReader();Document doc =reader.read(xmlPath);Class clazz =obj.getClass();//2.將obj對(duì)象中數(shù)據(jù),生成插入sql命令//2.1 獲得要插入的表名xPath ="//@table";Attribute e_table =(Attribute) doc.selectSingleNode(xPath);String tableName =e_table.getValue();//2.2 jdbc連接數(shù)據(jù)庫(kù)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對(duì)應(yīng)的數(shù)據(jù)類型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;//預(yù)編譯ps=con.prepareStatement(sql);//預(yù)編譯對(duì)象賦值for(int i=0;i<fields.length;i++){Field fieldObj = fields[i];String fieldName =fieldObj.getName();//從xml中查找該field對(duì)應(yīng)的數(shù)據(jù)類型xPath = "//property[@name='"+fieldName+"']";Element ele_f =(Element) doc.selectSingleNode(xPath);//獲得列對(duì)應(yīng)的數(shù)據(jù)類型String colType =ele_f.attribute("colType").getValue();//獲取權(quán)限fieldObj.setAccessible(true);//從實(shí)體類對(duì)象中獲得值Object valueObj = fieldObj.get(obj);if("int".equals(colType)){ps.setInt(i+1, (Integer)valueObj);}else if("varchar".equals(colType)){//Stringps.setString(i+1, (java.lang.String)valueObj);}else if("double".equals(colType)){ps.setDouble(i+1, (Double)valueObj);}else if("date".equals(colType)){//mysql中支持將一個(gè)字符串賦值給日期類Date data = (Date)valueObj;SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");ps.setString(i+1, sdf.format(data));}}int count =ps.executeUpdate();} } 表和實(shí)體類映射文件: <?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>?
轉(zhuǎn)載于:https://www.cnblogs.com/he-shao/p/6068309.html
總結(jié)
以上是生活随笔為你收集整理的反射封装工具类-----零SQL插入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 1717 [Usaco2006
- 下一篇: SQLServer Agent执行[分发