Hibernate 模拟

刚刚了解Hibernate的框架,这边慢慢的学习,并且模拟其运行方式~我的写程序只在simulation的类中实现,其中包括:

成员变量:String tableName,Map<String,String>cfs,String[] methodName()

方法:simulation()构造方法,save(Student s)核心方法,createSQL():sql语句拼凑方法;外加个main的测试程序;

把具体代码贴过来:

成员变量的定义:

private String tableName;
private Map<String, String> cfs = new HashMap<String, String>();//存放hibernate中的hibernate.cfg.xml中内容
 private String[] methodName;//此处主要为存放  java反射回来的内容:方法的名称。

构造方法:

 public simulation() {
tableName = "_student";
cfs.put("_id", "id");
cfs.put("_age", "age");
cfs.put("_name", "name");
methodName = new String[cfs.size()];//初始化
}


save()方法://实现hibernate中核心的save的功能,将一个对象,保存到DB中,转换成关系。其中包括,sql的拼凑,执行sql语句两部分,其实还挺简单的。。主要是用了反射机制,相对不好想,并且要对反射应用的比较好才能用好。

public void save(Student s) throws Exception {
String sql = createSQL();
Class.forName("com.mysql.jdbc.Driver");//开始连接DB
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost/hibernate", "root", "gao");
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < methodName.length; i++) {//开始反射,取METHODNAME中内容,
// System.out.println(methodName[i]);//getName,getAge,getId
Method m = s.getClass().getMethod(methodName[i]);//由方法名称,获得方法本身
String returnType = m.getReturnType().getName();//获得方法的返回类型,用来拼凑ps,setXX语句
  System.out.print("return type:"+returnType + "\t");//int,java.lang.String这种
if (returnType.equals("java.lang.String")) {//对返回类型进行判断,然后写Ps语句
  String value = (String) m.invoke(s);//调用方法,获得返回值
System.out.println(value);
ps.setString(i + 1, value);//构建ps语句
}
  if (returnType.equals("int")) {//同上
Integer value = (Integer) m.invoke(s);
System.out.println(value);
ps.setInt(i + 1, value);
}
}
ps.executeUpdate();//执行语句
ps.close();//关闭
conn.close();
}

createSQL()方法:

public String createSQL() {
String str1 = "";
String str2 = "";
String value = "";
int index = 0;
for (String s : cfs.keySet()) {//构建(_id,_name,_age)这种内容的东西,再顺便吧methodName数组赋值,内容为getName,getAge,getId,
str1 += s + ",";
value = cfs.get(s);
value = Character.toUpperCase(value.charAt(0)) + value.substring(1);
  methodName[index] = "get" + value;//拼凑方法名称
index++;
}
str1 = str1.substring(0, str1.length() - 1);//构建(?,?,?)的内容
for (int i = 0; i < cfs.size(); i++) {
str2 += "?,";
}
str2 = str2.substring(0, str2.length() - 1);
  String sql = "insert into " + tableName + "(" + str1 + ") values ("+ str2 + " )";//拼凑insert into _student (_id,_name,_age)values(?,?,?)的字符串
System.out.println(sql);
return sql;
}

public static void main(String[] args) throws Exception {//测试方法,可见整个流程,直接save就行!
Student s = new Student();
s.setId(2);
s.setName("gao");
s.setAge(30);
simulation si = new simulation();
si.save(s);
}

此处只是一个简单的模拟程序,主要目的是了解Hibernate的内部原理,没有更多含义,所以,有关此段程序根本就是面向过程还是对象的方面,不予考虑。

其实是严重的面向过程哈,但是主要是因为这边这个内容比较简单,在分个类什么的没有必要,但是面向对象的思想一定不能忘~~











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值