1 定义映射文件的XML格式。
//Students.xml <?xml version="1.0"?> <mapping> <class name="User" table="user"> <property name="id" column="id"> <property name="name" column="name"> </class> </mapping>
2. 获取XML中的值
把XML中class节点下的table赋值给tableName,把XML中property节点下的name和column放入Map类型的集合中。
//属性--字段<属性,字段> private Map<String,String> maps=new HashMap<String,String>(); private String tableName; private String[] methodName; public Session() throws Exception { SAXReader reader=new SAXReader(); File f=new File("Students.xml"); Document doc=reader.read(f); Element root=doc.getRootElement(); List list1=root.elements(); for(int i=0;i<list1.size();i++) { Element node1=list1.get(i); tableName=node1.attributeValue("table"); List list2=node1.elements(); for(int j=0;j<list2.size();j++) { Element node2=(Element)list2.get(j); map.put(node2.attributeValue("name"),node2.attributeValue("column")); } methodNames=new String[map.size()]; }
3. 生成prepareStatement需要的sql脚本,insert into 表名(字段1,字段2……)values(?,?……);
由insert语句模板,生成具体的sql脚本,如【insert into students(id,name)values(?,?);】,同时根据name构造getter方法。
实现方法:1,从xml文件
private String createSQL() { String s1=""; String s2=""; for(String key:maps.keySet()) { String value=maps.get(key); s1+=value+","; methodName[index++]="get"+Character.toUpperCase(key.charAt(0))+key.substring(1); } s1=s1.substring(0,s1.length()-1); for(int i=0;i<maps.size();i++){ s2+="?,"; } s2=s2.substring(0,s1.length()-1); String sql="insert into "+tableName+"("+s1+")value("+s2+");" } }
4. 利用反射,构造save方法。
1,创建insert的sql模板;2,建立数据库连接,获取prepareStatement对象;3,用反射调用传入对象的getter方法,获取对象的值;4,把获取的值利用setType传给prepareStatement;5,执行prepareStatement,关闭资源。
public void save(Students stu) throws Exception { String sql=creatSQL();//创建插入SQL语句模板 System.out.println(sql);//打印sql语句 //创建数据库连接,执行sql语句 Connection conn=null; PreparedStatement stmt=null Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test"); stmt=conn.prepareStatement(sql); for(int i=0;i<methodNames.length;i++){ //根据方法名获取方法 Method m=stu.getClass().getMethod(methodNames[i]); Class c=m.getReturnType();//获取对象类型 if(c.getName().equals("java.lang.Integer")||c.getName().equals()){ int value=(Integer)m.invoke(s); stmt.setInt(i+1,value) } if(c.getName().equals("java.lang.String")){ String value=(String)m.invoke(s); stmt.setString(i+1,value) } stmt.executeUpdate(); stmt.close(); conn.close(); } }