- /*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);
- }
- }