简单模拟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查询数据库结果:
简单模拟Hibernate的主要功能实现的更多相关文章
- 菜鸟学SSH(十五)——简单模拟Hibernate实现原理
之前写了Spring的实现原理,今天我们接着聊聊Hibernate的实现原理,这篇文章只是简单的模拟一下Hibernate的原理,主要是模拟了一下Hibernate的Session类.好了,废话不多说 ...
- Linux 内核 链表 的简单模拟(2)
接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...
- Java基础知识强化之IO流笔记53:IO流练习之 自定义类模拟BufferedReader的readLine()功能案例
1. 用Reader模拟BufferedReader的readLine()功能: readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 2. 代码实现和思路分析: ...
- python--selenium简单模拟百度搜索点击器
python--selenium简单模拟百度搜索点击器 发布时间:2018-02-28 来源:网络 上传者:用户 关键字: selenium 模拟 简单 点击 搜索 百度 发表文章摘要:用途:简单模拟 ...
- spring之mvc原理分析及简单模拟实现
在之前的一篇博客中已经简单的实现了spring的IOC和DI功能,本文将在之前的基础上实现mvc功能. 一 什么是MVC MVC简单的说就是一种软件实现的设计模式,将整个系统进行分层,M(model ...
- springmvc+spring3+hibernate4框架简单整合,简单实现增删改查功能
转自:https://blog.csdn.net/thinkingcao/article/details/52472252 C 所用到的jar包 数据库表 数据库表就不用教大家了,一张表,很简 ...
- 通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)
Hibernate的主要功能及用法: Ⅰ.Hibernate封装了JDBC,使Java程序员能够以面向对象的思想对数据库进行操作 Ⅱ.Hibernate可以应用于EJB的J2EE架构,完成数据的持久化 ...
- 原生js实现简单的下拉刷新功能
前言: 我们在浏览移动端web页面的时候,经常会用到下拉刷新. 现在我们用原生的js实现这个非常简单的下拉刷新功能. (温馨提示:本文比较基础,功能也很简单.写的不好的地方,希望大神提点一二.) 一. ...
- java web学习总结(二十二) -------------------简单模拟SpringMVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
随机推荐
- Hooks——钩子概览
(资料源于MSDN,本文仅对其进行翻译.批注.其链接为:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959%28v=vs. ...
- SQLServer2005日志传送常见的几个问题
1.STANDBY 只读方式还原数据库:[备份数据库服务器]将完全备份文件复制到备份数据库服务器上,并以STANDBY的方式进行恢复 . SQL语句: RESTORE DATABASE [CNBlog ...
- SQL 查询横表变竖表
SQL 查询横表变竖表 /*普通行列转换 假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 ...
- HDU 5433 Xiao Ming climbing dp
Xiao Ming climbing Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/ ...
- node.js在windows下的学习笔记(6)---安装Express
Express是什么呢? express.js是nodejs的一个MVC开发框架,并且支持jade等多种模板.对于WEB应用程序而言,会有许多诸如模板和路由这样的公共模式在的,虽然也可以自己编写代码解 ...
- Floating-Info---Android
https://github.com/alt236/Floating-Info---Android
- Mac Pro更换SSD后,在Win7下启用ACHI的方法AHCI
在Mac Pro下更换SSD后,如果安装Win7,要将SSD改为AHCI模式是非常麻烦的.本文介绍如何将Mac的Win7下的SSD改为AHCI方式驱动,及几种常见问题的处理. 一.当Lion与Win7 ...
- mysql 高可用方案漫谈(一) 转阿里云
https://yq.aliyun.com/articles/2237?spm=5176.blog2238.yqblogcon1.7.e5fyEy#index_section
- java_包含抽象方法的枚举类
package ming; enum Operation { PLUS { public double eval(double x, double y) { return x + y; } }, MI ...
- MySQL(1):启动MySQL服务,客户端连接服务
1.安装完毕mysql之后,在windows中找到服务,启动MySQL服务(服务端)(mysqld.exe) 2.接下来启动客户端(mysql.exe) 这里参数中: -hlocalhost 表示主机 ...