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

在学习期间接触到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查询数据库结果:

时间: 2024-10-13 01:35:22

简单模拟Hibernate的主要功能实现的相关文章

菜鸟学SSH(十五)——简单模拟Hibernate实现原理

之前写了Spring的实现原理,今天我们接着聊聊Hibernate的实现原理,这篇文章仅仅是简单的模拟一下Hibernate的原理,主要是模拟了一下Hibernate的Session类.好了,废话不多说,先看看我们的代码: package com.tgb.hibernate; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pre

Spring 架构的简单模拟实现

Spring 架构主要有两大特点: IOC /DI: 控制反转/依赖注入 AOP  切面编程 . 今天主要是实现IOC这一特点. 主要的逻辑如下: User 用户类. UserDAO  User类的访问接口. UserDAOImpl  实现UserDAO 接口以实现拓展. UserService  包含一系列的用户功能 ,如addUser 关于以上类的代码: package com.bjsxt.model; public class User { private String username;

Linux 内核 链表 的简单模拟(2)

接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. */ #define list_for_each(pos, head) for (pos = (head)->next; pos != (head);

创建函数利用可变参数列表的形式模拟实现printf的功能

★创建函数利用可变参数列表的形式模拟实现printf的功能. 模拟简单的输入单个字符和字符串时的输出形式 如:输入:%c %c %c %c %c\t%s,'h','e','l','l','o',"welcome to here!" 输出:h e l l o   welcome to here! #include<stdio.h> #include<stdlib.h> #include<stdarg.h>    //需引入stdarg的头文件以便建立可

Java基础知识强化之IO流笔记53:IO流练习之 自定义类模拟BufferedReader的readLine()功能案例

1. 用Reader模拟BufferedReader的readLine()功能:   readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 2. 代码实现和思路分析: 1 package cn.itcast_08; 2 3 import java.io.IOException; 4 import java.io.Reader; 5 6 /* 7 * 用Reader模拟BufferedReader的readLine()功能 8 * 9 * readLine():一次

hibernate之模拟Hibernate持久化操作

[Hibernate]之模拟Hibernate持久化操作 使用过Hibernate,大家都知道,由于其面向对象的设计,用起来非常方便,且具有很好的跨数据库性,那么Hibernate的底层是怎么实现的呢?其实也就是将对象模型转化为关系模型,最终还是得sql语句来执行. 看过Hibernate源码的同学应该发现, Hibernate底层的核心是代理和反射,那么由此这样我们就可以理解为什么使用Hibernate在效率上始终是致命的. Ok,下面是一个简单的模拟Hibernate-ORM的save()方

使用回调函数,简单模拟dbutils中Queryrunner的工作原理,并重写Queryrunner,使其使用起来更加简单方便

所谓回调,就是在执行某个程序时,具体的封装处理由第三方类来实现,简单一点说就是记录内部,再出来(由第三方类可以对数据进行处理),再返回去继续执行,这个过程就是回调.想要程序具有记录内部的功能就必须定义一个规范,也就是接口,即你的程序出来被其他类处理了,但你规定了还要返回原程序. 下面看一个简单的例子: /** * @描述:回调函数--记录内部,再出来返回去的过程就叫回调 * @author cxie */ public class CopyOfCallBackDemo { public stat

spring之mvc原理分析及简单模拟实现

在之前的一篇博客中已经简单的实现了spring的IOC和DI功能,本文将在之前的基础上实现mvc功能. 一 什么是MVC MVC简单的说就是一种软件实现的设计模式,将整个系统进行分层,M(model 数据模型,业务逻辑层) .V(view 视图层).C(controller 控制器调度),实现应用程序的分层开发.实现原理如下图: 主要执行步骤: 1 用户在发起request请求给前端控制器: 2 控制器接收到请求后,经过一系统的过滤器,找到对应的请求处理映射: 3 根据请求映射获得请求处理适配器

原生js实现简单的下拉刷新功能

前言: 我们在浏览移动端web页面的时候,经常会用到下拉刷新. 现在我们用原生的js实现这个非常简单的下拉刷新功能. (温馨提示:本文比较基础,功能也很简单.写的不好的地方,希望大神提点一二.) 一.创建简单的html页面: 假设代码里的float-box是一个主页面. 二.封装下拉刷新的功能模块: (1)首先创建一个Slide构造函数,用来初始化属性与函数. function Slide(dom){ this.start_y=null;//手指滑动屏幕的初始位置 this.end_y=null