在学习期间接触到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的主要功能实现的更多相关文章

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

    之前写了Spring的实现原理,今天我们接着聊聊Hibernate的实现原理,这篇文章只是简单的模拟一下Hibernate的原理,主要是模拟了一下Hibernate的Session类.好了,废话不多说 ...

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

    接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...

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

    1. 用Reader模拟BufferedReader的readLine()功能:   readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 2. 代码实现和思路分析: ...

  4. python--selenium简单模拟百度搜索点击器

    python--selenium简单模拟百度搜索点击器 发布时间:2018-02-28 来源:网络 上传者:用户 关键字: selenium 模拟 简单 点击 搜索 百度 发表文章摘要:用途:简单模拟 ...

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

    在之前的一篇博客中已经简单的实现了spring的IOC和DI功能,本文将在之前的基础上实现mvc功能. 一 什么是MVC MVC简单的说就是一种软件实现的设计模式,将整个系统进行分层,M(model ...

  6. springmvc+spring3+hibernate4框架简单整合,简单实现增删改查功能

    转自:https://blog.csdn.net/thinkingcao/article/details/52472252 C 所用到的jar包     数据库表 数据库表就不用教大家了,一张表,很简 ...

  7. 通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)

    Hibernate的主要功能及用法: Ⅰ.Hibernate封装了JDBC,使Java程序员能够以面向对象的思想对数据库进行操作 Ⅱ.Hibernate可以应用于EJB的J2EE架构,完成数据的持久化 ...

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

    前言: 我们在浏览移动端web页面的时候,经常会用到下拉刷新. 现在我们用原生的js实现这个非常简单的下拉刷新功能. (温馨提示:本文比较基础,功能也很简单.写的不好的地方,希望大神提点一二.) 一. ...

  9. java web学习总结(二十二) -------------------简单模拟SpringMVC

    在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...

随机推荐

  1. action 带参数跳转

    都容易忘记 <result name="goOpPolicy" type="redirect">queryPolicy.action?aaaa=${ ...

  2. Yii中CDbCriteria常用方法

    最近在使用Yii 下面是常用到的方法,这里保存一下方便查看 $criteria =newCDbCriteria; $criteria->addCondition("id=1" ...

  3. [Sciter系列] MFC下的Sciter–1.创建工程框架

      Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大 ...

  4. [React Native] Build a Github Repositories component

    Nav to Repos component from Dashboard.js: goToRepos(){ api.getRepos(this.props.userInfo.login) .then ...

  5. iOS完美的网络状态判断工具

    大多数App都严重依赖于网络,一款用户体验良好的的app是必须要考虑网络状态变化的.iOSSinger下一般使用Reachability这个类来检测网络的变化. Reachability 这个是苹果开 ...

  6. C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承

    用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...

  7. C 栈顺序存储

    // seqstack.h #ifndef _MY_SEQSTACK_H_ #define _MY_SEQSTACK_H_ typedef void SeqStack; SeqStack* SeqSt ...

  8. 文件I/O(不带缓冲)之close函数

    可调用close函数关闭一个打开的文件: #include <unistd.h> int close( int filedes ); 返回值:若成功则返回0,若出错则返回-1. 关闭一个文 ...

  9. java_包含抽象方法的枚举类

    package ming; enum Operation { PLUS { public double eval(double x, double y) { return x + y; } }, MI ...

  10. JS与OC交互--简单使用

    直接上代码 .m文件 #import "ViewController.h" @interface ViewController () <UIWebViewDelegate&g ...