一、什么是ORM 为什么要用ORM
1.jdbc操作数据库很繁琐
2.sql语句编写并不是面向对象的
3.可以在对象和关系表之间建立关联来简化编程
4.ORM简化编程
5.ORM跨数据平台
二、模拟原理
Session类
public class Session
{
String tableName = "_Student";
Map<String,String> cfs = new HashMap<String,String>;
String[] methodNames;
public Session(){
cfs.put("_id","id");
cfs.put("_name","name");
cfs.put("_age","age");
methodNames = new String[cfs.size()];
}
public void save(Student s) throws Exception{
String sql = createSQL();
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("","","");
PreparedStatement ps = conn.prepareStatement(sql);
for(int i=0;i<methodNames.length();i++){//反射机制
Method m = s.getClass().getMethod(methodNames[i]);
Class r = m.getReturnType();
if(r.getName().equals("java.lang.String")){
String returnValue = (String)m.invoke(s);//简单理解:对对象s调用方法m并拿到返回值
ps.setString(i+1,returnValue);
}
if(r.getName().equals("int")){
int returnValue = (Integer)m.invoke(s);
ps.setInt(i+1,returnValue);
}
}
ps.executeUpdate();
ps.close();
conn.close();
}
private String createSQL(){
String str1 = "";
int index = 0;
for(String s:cfs.KeySet()){//获取方法名
String v = cfs.get(s);
v = Character.toUpperCase(v.charAt(0))+v.substring(1);
methodNames[index] = "get"+v;
str1 += s + ",";
index++;
}
str1 = str1.substring(0,str1.length()-1);
String str2 = "";
for(int i=0;i<cfs.size();i++){
str2 += "?,";
}
str2 = str2.substring(0,str2.length()-1);
String sql = "insert into "+tableName+"("+str1+")"+" values ("+str2+")";
return sql;
}
}
概括:
1.根据操作内容拼写sql语句
2.根据配置找到要执行的方法名
3.用反射调用方法,拿到返回值,并根据返回值的类型选择调用ps的方法
三、常见的ORM框架
1.hibernate
2.toplink
3.jdo
4.ibatis//并不是严格意义上的ORM,只是把Object翻译成了具体的sql语句,sql语句自己写
5.jpa//一套标准,类似于最高接口,子框架就是很多实现类