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();
}
}