在学习期间接触到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. Android 上拉加载更多功能

    前几天看了github上面的例子,参照它的实现,自己又稍微改了一点,往项目里面增加了一个上拉加载更多功能.具体的实现如下: 首先要重写ListView: import android.content. ...

  2. 关于python文件操作 (转载)

    总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...

  3. iOS中添加UITapGestureRecognizer手势识别后,UITableView的didSelectRowAtIndexPath失效

    ViewDidLoad中注册手势的部分代码如下: [cpp] view plaincopy UITapGestureRecognizer *oneTap = [[[UITapGestureRecogn ...

  4. lightoj1104(数学概率与期望)

    题意: 增加一年有n天; 那么至少有几个人,能够保证至少两个人同一天生日的概率大于等于0.5; 思路: 转化一下题意; 就是求全部人生日都不同的概率小于等于0.5(那么至少两个人同一天就是大于等于0, ...

  5. Oracle Hints具体解释

    在向大家具体介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家实用.基于代价的优化器是非常聪明的,在绝大多数情况下它会选 ...

  6. iOS开发——面试指导

    iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...

  7. petshop4.0 具体解释之中的一个(系统架构设计)

    前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...

  8. 使用pypi镜像源加速第三方库在线安装

    用easy_install和pip来安装第三方库很方便 它们的原理其实就是从Python的官方源pypi.python.org/pypi 下载到本地,然后解包安装. 不过因为某些原因,访问官方的pyp ...

  9. IIS 之 HTTP错误信息提示

    一.HTTP返回码 [1]1xx - 信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应. a. 100 - 继续. b. 101 - 切换协议. [2 ...

  10. focus on these tools

    http://www.oschina.net/p/dubbo http://www.blogjava.net/hispark/archive/2008/12/01/243310.html http:/ ...