hibernate的运行原理
2013-06-19 16:21
162 查看
/*hibernate实际是对数据的封装将其封装成持久化对象适当我们不在关心数据库的具体结构用面向对象思想去编写程序hibernate将为我们自动生成sql语句*/
//下面是一个模拟hibernate具体实现
//session类的save方法实现其核心是用来Java里面的反射机制
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class session {
// 本来是从配置文件中读出
String tableName = "_tableName";
Map<String, String> cfs = new HashMap<String, String>();
String[] methedName;
public session() {
cfs.put("_id", "id");
cfs.put("_name", "name");
cfs.put("_age", "age");
methedName=new String[cfs.size()];
}
public void save(student s) throws Exception {
String sql = createSQL();
Class.forName("com.jdbc.mysql.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost/hibernate","lingkai","818927");
PreparedStatement ps=con.prepareStatement(sql);
//
for(int i=0;i<methedName.length;i++){
Method m=s.getClass().getMethod(methedName[i]);//得到是s的一个对象调用getMethod()返回一个方法方法名为数组methedName[i]存的类容
Class r=m.getReturnType();//得到该方法的返回的值类型
//r.getName()的到该方法的名字
if(r.getName().equals("int")){
Integer returnv=(Integer)m.invoke(s);//取出该方法返回的值
ps.setInt(i+1, returnv);
}
if(r.getName().equals("java.lang.String")){
String returnv=(String)m.invoke(s);
ps.setString(i+1, returnv);
}
System.out.println(m.getName()+"|"+m.getReturnType());
}
//ps.executeUpdate();
ps.close();
con.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);//将第一个字符串转换成大写的字母
methedName[index]="get"+v;
index++;
str1 += s + ",";
}
str1 = str1.substring(0, str1.length() - 1);
System.out.println(str1);
String str2 = "";
for (int i = 0; i < cfs.size(); i++) {
str2 += "?,";
}
str2 = str2.substring(0, str2.length() - 1);// 截取字符串丢掉最后一个问号
System.out.println(str2);
String sql = "insert into" + tableName + "(" + str1 + ")" + "values"
+ "(" + str2 + ")";
System.out.println(sql);
return null;
}
}
//测试类的代码只需直接调用session的save方法
import java.sql.SQLException;
public class test {
public static void main(String[] args) throws Exception {
student stu=new student();
stu.setId(1);
stu.setName("lingkai");
stu.setAge(21);
session s=new session();
s.save(stu);
}
}
//下面是一个模拟hibernate具体实现
//session类的save方法实现其核心是用来Java里面的反射机制
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class session {
// 本来是从配置文件中读出
String tableName = "_tableName";
Map<String, String> cfs = new HashMap<String, String>();
String[] methedName;
public session() {
cfs.put("_id", "id");
cfs.put("_name", "name");
cfs.put("_age", "age");
methedName=new String[cfs.size()];
}
public void save(student s) throws Exception {
String sql = createSQL();
Class.forName("com.jdbc.mysql.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost/hibernate","lingkai","818927");
PreparedStatement ps=con.prepareStatement(sql);
//
for(int i=0;i<methedName.length;i++){
Method m=s.getClass().getMethod(methedName[i]);//得到是s的一个对象调用getMethod()返回一个方法方法名为数组methedName[i]存的类容
Class r=m.getReturnType();//得到该方法的返回的值类型
//r.getName()的到该方法的名字
if(r.getName().equals("int")){
Integer returnv=(Integer)m.invoke(s);//取出该方法返回的值
ps.setInt(i+1, returnv);
}
if(r.getName().equals("java.lang.String")){
String returnv=(String)m.invoke(s);
ps.setString(i+1, returnv);
}
System.out.println(m.getName()+"|"+m.getReturnType());
}
//ps.executeUpdate();
ps.close();
con.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);//将第一个字符串转换成大写的字母
methedName[index]="get"+v;
index++;
str1 += s + ",";
}
str1 = str1.substring(0, str1.length() - 1);
System.out.println(str1);
String str2 = "";
for (int i = 0; i < cfs.size(); i++) {
str2 += "?,";
}
str2 = str2.substring(0, str2.length() - 1);// 截取字符串丢掉最后一个问号
System.out.println(str2);
String sql = "insert into" + tableName + "(" + str1 + ")" + "values"
+ "(" + str2 + ")";
System.out.println(sql);
return null;
}
}
//测试类的代码只需直接调用session的save方法
import java.sql.SQLException;
public class test {
public static void main(String[] args) throws Exception {
student stu=new student();
stu.setId(1);
stu.setName("lingkai");
stu.setAge(21);
session s=new session();
s.save(stu);
}
}
相关文章推荐
- 对hibernate运行原理的总结
- (第2讲)hibernate的开发流程及运行原理
- Hibernate运行原理
- Hibernate 运行原理
- java框架技术之hibernate运行原理
- Hibernate 运行原理
- hibernate运行原理笔记
- 根据错误原理解决Hibernate运行出现No CurrentSessionContext configured!错误
- hibernate的运行原理
- Hibernate核心接口和运行原理
- Web应用运行原理
- jvm运行原理
- hibernate分页实现原理
- DRP项目(五)----servlet运行原理
- Hibernate4实战 之第六部分:基本实现原理
- Android编译和运行原理(1)
- maven内部运行原理解析(一)
- Windows程序内部运行原理 - 孙鑫 - VC++6.0 - Code by SunXin/Remark by HackerJLY
- 孙鑫VC视频学习笔记之windows程序内部运行原理
- 场景9 深入RAC运行原理