这里模拟一下Hibernate的save,初试OR Mapping。
首先建立JavaBean student类。
student.java
package hibernate.source; public class student { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
编写测试方法,要求直接将student存入数据库。
TestStudent.java
import hibernate.source.student; public class TestStudent { public static void main(String args[]) throws Exception { student cat=new student(); cat.setAge(22); cat.setName("Jing"); cat.setId(26); Session session=new Session(); session.save(cat); } }
我们模拟了Hibernate中的Session,这里我们需要自己编写Session类来实现将student存入数据库。
Session.java
import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.HashMap; import java.util.Map; import hibernate.source.student; public class Session { String TableName="student"; Map<String,String> cfs=new HashMap<String,String>(); String[] MethodName; Session() { cfs.put("id", "id"); cfs.put("name", "name"); cfs.put("age", "age"); MethodName=new String[cfs.size()]; } public void save(student cat) throws Exception{ String sql=createSql(); Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test"); PreparedStatement pst=conn.prepareStatement(sql); for(int i=0;i<cfs.size();i++) { Method m=cat.getClass().getMethod(MethodName[i]); Class<?> r=m.getReturnType(); System.out.println(m.getName()); System.out.println(r.getName()); if(r.getName().equals("java.lang.String")) { String tem=(String)m.invoke(cat); pst.setString(i+1, tem); } if(r.getName().equals("int")) { Integer tem=(Integer)m.invoke(cat); pst.setInt(i+1,tem); } } pst.execute(); pst.close(); conn.close(); } public String createSql() { String sql1=""; for(int i=0;i<cfs.size();i++){ sql1+=cfs.keySet().toArray()[i]+","; String property=(String)cfs.values().toArray()[i]; String s=property.substring(0, 1).toUpperCase(); MethodName[i]="get"+s+property.substring(1, property.length()); System.out.println(MethodName[i]); } String sql2=""; for(int i=0;i<cfs.size();i++) { sql2+="?"+","; } sql2=sql2.substring(0, sql2.length()-1); sql1=sql1.substring(0, sql1.length()-1); String sql="insert into "+TableName+" ("+sql1+")"+" values"+" ("+sql2+")"; System.out.println(sql); return sql; } }
思路:
1.拼接SQL语句,将用在Preparedstatement中。
2.需要将student的属性设到Preparedstatement中,问题是怎么实现呢?
3.利用Java反射机制。
1)新建MethodName数组,目的将student中的方法名获得并存入MethodName中。
2)Method类登场,让student类通过MethodName取得对应的方法,返回给Mehod对象。
3)Method类invoke(Class), 将反射执行student对应的方法,获取对应属性值。