码迷,mamicode.com
首页 > Web开发 > 详细

简单模拟Hibernate的主要功能实现

时间:2015-09-04 22:29:25      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作。
这里就简单模拟其底层的实现。

/*******代码部分,及其主要注解**********************/
1、实体类User:
public class User {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

2、主体测试代码:

public class TestHibernate {
    public static void main(String[] args) throws Exception{
        User user = new User();
        user.setId(123);
        user.setUsername("admin");
        user.setPassword("admin");

        //Configuration configuration = new Configuration();
        //SessionFactory sessionFactory = configuration.configure().buildSessionFactory();

        //Session session = sessionFactory.openSession();
        //session.beginTransaction();
        //其他的过程均省略,利用自定义的Seesion进行存储
        Session session = new Session();  
        session.save(user);
         //session.getTransaction().commit();
         //session.close();
         //sessionFactory.close();


    }

}

3、自定义的Seesion类:

public class Session {

    //假设通过配置文件读出实体类对应的表
    String tableName = "_user";
    //模拟表属性与类属性的一一对应关系
    Map<String,String> map = new HashMap<String, String>();

    
    //每个属性对应一个get方法,methodNames存放所有方法名
    String[] methodNames ;
    //初始化
    public Session(){
        map.put("_id","id");
        map.put("_username","username");
        map.put("_password","password");

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

    public void save(User user)throws Exception{
        String sql = createSQL();

        Class.forName("com.mysql.jdbc.Driver");
        Connection cnn = DriverManager.getConnection("jdbc:mysql://localhost/digtalheaven","root","7890");
        PreparedStatement preparedStatement = cnn.prepareStatement(sql);
        for(int i = 0; i < methodNames.length;i++){

           //利用java的反射机制获取实体类属性的get方法
            Method method = user.getClass().getMethod(methodNames[i]);
            //获取返回类型
            Class c = method.getReturnType();

            //由于调用get方法返回值可能是"java.lang.String" "int "等不同的属性,所以要进行判断,再调用不同的jdbc语句执行方法
            if(c.getName().equals("java.lang.String")){
                String returnValue = (String)method.invoke(user);//执行方法,获得返回值
                preparedStatement.setString(i+1,returnValue);
            }
            else if(c.getName().equals("int")){
                Integer returnValue = (Integer)method.invoke(user);
                preparedStatement.setInt(i+1,returnValue);
            }
           
        }

        preparedStatement.executeUpdate();
        preparedStatement.close();
        cnn.close();

    }

    //创建save方法对应的sql 语句: insert into _user(_id,_username,_password) values (?,?,?);
    public String createSQL(){
       
        String str2 = "";
        for(int i = 0; i < map.size(); i++){
            str2 += "?,";
        }
        str2 = str2.substring(0,str2.length()-1);  //截掉最后一个逗号

        String str1 = "";
        int index = 0;
        for(String i : map.keySet()){
            //获取表属性对应的类的属性,然后拼出该属性的get对应的方法名字
            //例如 getUsername();
            String str = map.get(i); //例如获得表属性名 _username 对应的实体类属性名 username ;
            str = "get" + Character.toUpperCase(str.charAt(0)) + str.substring(1,str.length());
            methodNames[index++] = str;
            str1 += i+",";
        }
        str1 = str1.substring(0,str1.length()-1);

        String sql = "insert into "+ tableName + "(" + str1 + ") values (" + str2 + ")";

        return sql;

    }
}

4、在navicat查询数据库结果:

技术分享

 

简单模拟Hibernate的主要功能实现

标签:

原文地址:http://www.cnblogs.com/chentao-cus/p/4782380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!