这里模拟一下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对应的方法,获取对应属性值。