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>