hibernate模拟实现

本文介绍了如何使用Java面向对象编程创建学生类,并通过模拟Hibernate Session类的功能将学生对象持久化到数据库。具体步骤包括定义类属性、设置属性值、创建Session对象以及执行数据插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建Student类
//Student.java

public class Student {  
    private int id;  
    private String name;  
    private int age;  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  


}  


 创建Test类

public class Test {  
    public static void main(String[] args) throws Exception{  
        Student stu = new Student();    //定义一个Student类对象  
        //设置属性值  
        stu.setId(3);                     
        stu.setName("lishi");  
        stu.setAge(22);  

        //生成自定义的Session对象  
        Session session = new Session();  
        //执行Session类中的save方法  
        session.save(stu);  
    }  
}  



创建Session类

//模拟Hibernate中的Session实现的功能 

public class Session {  

    String tableName = "_student";   //表名  
    Map<String,String> cfs = new HashMap<String, String>(); //字段名与属性一一对应的关系  

    String[] methodNames;       //声明一个字符串数组,用来存储方法名  


    /** 
     * Session的构造方法 
     */  
    public Session(){  
        cfs.put("id", "id");  
        cfs.put("name", "name");  
        cfs.put("age", "age");  

        methodNames = new String[cfs.size()];     
    }  

    /** 
     * 实现数据插入功能 
     * @param stu 
     * @throws Exception 
     */  
    public void save(Student stu) throws Exception{  
        String sql = createSql();       //获取拼接完成的sql语句  

        Class.forName("com.mysql.jdbc.Driver");         //加载MySQL数据库驱动  
        //获取数据库连接  
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/hibernate","root", "wwj");  
        //创建PreparedStement对象  
        PreparedStatement ps = conn.prepareStatement(sql);  

        for(int i = 0; i < methodNames.length; i++) {  
            //利用Java的反射机制,获取对象的方法  
            Method m = stu.getClass().getMethod(methodNames[i]);      
            Class r = m.getReturnType();    //获取方法返回值类型  
            if(r.getName() == "java.lang.String"){  //如果返回值类型等于”java.lang.String"的话  
                String v = (String)m.invoke(stu);   //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。  
                ps.setString(i + 1, v);             //将指定参数设置为给定 Java String 值。  
            }  
            if(r.getName() == "int"){         
                Integer v = (Integer)m.invoke(stu);  
                ps.setInt(i + 1, v);  
            }  
            System.out.println(m.getName() + "|" + r.getName());  
        }  
        ps.executeUpdate();         //执行sql语句更新数据库  
        ps.close();                 //释放此PrepareStatement对象的数据库和JDBC资源  
        conn.close();               //关闭数据连接  
    }  

    /** 
     * 创建SQL语句 
     * @return 
     */  
    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;  
            index++;  
            str1 += s + ",";   
        }  
        str1 = str1.substring(0, str1.length() - 1);        //去掉最后面的逗号","  
        System.out.println(str1);  

        //拼接(?,?,?,?),问号的个数取决于map的长度  
        String str2 = "";  
        for(int i = 0; i < cfs.size(); i++){  
            str2 += "?,";  
        }  
        str2 = str2.substring(0, str2.length() - 1);  
        System.out.println(str2);  

        //拼接sql字符串  
        String sql = "Insert into " + tableName + "(" + str1 + ")" + "values" + "(" + str2 + ")";  
        System.out.println(sql);  

        return sql;  
    }  

}  


测试结果:
id,age,name
?,?,?
Insert into _student(id,age,name)values(?,?,?)
getId|int
getAge|int
getName|java.lang.String
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值