不过后来学宇在我们上一期师哥的指点下使用类似Hibernate实现的原理实现了封装数据库的操作类,对外完全是面向对象,通过传递对象,内部得到对象名,对象属性,然后完成sql的拼接(使用sql参数拼接),最后组成一个sql语句。
现在突然想起那会儿的事是我觉得人不能固步自封,把自己封闭到自己已有的知识范围内,因为一个人所接触的东西毕竟有限,你的知识圈在大也是有边的。
对比一下以前的自己,发现当时确实是有点傲气。产生傲气的原因有两个:一个是你真的相当牛,在某一行业某一领域是专家;另一个是你真的比较肤浅,以为知道的不少,其实啥也不知道。这就是所谓的不知道自己不知道吧。
现在自己确实谦虚多了,能够感觉的到,因为发现自己不知道的越来越多了。以前觉得时间很充分,现在恨不得天天不睡觉。要时刻提醒自己,人只有不被自己的所学所羁绊才能不断成长。
好了,下面给出Hibernate原理简单实例,不过听老马讲,hibernate的原理并非如此,要真的是这样的话那效率就比较低了,本来操作数据库就不是件高效的事儿。
首先建立数据库,建立student表,id(int),name(varchar(20)), age(int)
然后建立对应的实体类。
建立一个Session类:
package com.hibernate.Mapping;
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 com.hibernate.model.Student;
public class Session {
String tableName = "Student";
Mapcfs = new HashMap ();
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("jdbc:mysql://192.168.1.100/hibernate" ,"root", "root");
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; iMethod m = s.getClass().getMethod(methodNames[i]);
Class r = m.getReturnType();
if (r.getName().equals("java.lang.String")) {
String returnValue = (String)m.invoke(s);
ps.setString(i+1, returnValue);
}
if (r.getName().equals("int")) {
Integer returnValue = (Integer)m.invoke(s);
ps.setInt(i+1, returnValue);
}
}
ps.executeUpdate();
ps.close();
conn.close();
}
private String createSQL() {
String str1 = "";
String str2 = "";
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 );
for (int i = 0; i < cfs.size(); i++) {
str2 += "?,";
}
str2 = str2.substring(0, str2.length() - 1);
String sql = "insert into " + tableName + "(" + str1 + ")" + " value (" + str2 + ")";
System.out.println(sql);
return sql;
}
}
最后在StudentTest类中调用:
package com.hibernate.client;
import com.hibernate.Mapping.Session;
import com.hibernate.model.Student;
public class StudentTest {
public static void main(String[] args) {
Student s = new Student();
s.setId(2);
s.setName("s2");
s.setAge(22);
Session session = new Session();
try {
session.save(s);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
里面主要用到了反射从类中得到数据库中的相关内容,然后拼接成sql语句。
- from the5fire.com
----EOF-----
微信公众号:Python程序员杂谈
微信公众号:Python程序员杂谈