本例子是不使用Hibernate的jar包,单纯地使用java反射机制、JDBC模拟Hibernate的Session实现对象保存的功能。该程序体现了hibernate在于数据库交互过程中生成SQL语句,识别Getter,Setter方法向数据库插入数据的原理。
Student.java
package com.zenoh.bean;
public class Student {
private int id ;
private int age ;
private String title ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
DBUtil.java
package com.zenoh.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
private static Connection conn = null ;
private static PreparedStatement ps = null ;
private ResultSet rs = null ;
public static Connection getConnection()
{
try {
Class.forName("com.mysql.jdbc.Driver") ;
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hibernate","root","root") ;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn ;
}
public static PreparedStatement createStatement(String sql)
{
try {
conn = getConnection() ;
ps = conn.prepareStatement(sql) ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ps ;
}
public static void close()
{
try {
ps.close() ;
conn.close() ;
} catch (Exception e) {
e.printStackTrace() ;
}
}
}
Session.java
package com.zenoh.session;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;
import com.zenoh.bean.Student;
import com.zenoh.db.DBUtil;
public class Session {
//先假定数据表名称
String tableName = "_student" ;
//保存数据库列名和类的属性名
Map<String , String> map = new HashMap<String,String>() ;
//类的属性方法名保存为字符串
String[] methodNames ;
public void save(Student s) {
PreparedStatement ps = null ;
map.put("_id", "id") ;
map.put("_age" , "age") ;
map.put("_title", "title") ;
methodNames = new String[map.size()] ;//根据map的大小创建属性方法的字符串的个数
String sql = createSQL() ;//创建SQl语句
try {
ps = DBUtil.createStatement(sql) ;
for(int i=0; i<methodNames.length; i++){
//利用Method的反射机制获取类的方法
Method m = s.getClass().getMethod(methodNames[i]) ;
//获得方法的返回值类型
Class type = m.getReturnType() ;
System.out.println(m.getClass() + " || " + m.getReturnType() );
//根据返回值类型匹配,设置PreparedStatement的值
if(type.getName().equals("java.lang.String")){
String returnValue = (String)m.invoke(s) ;
ps.setString(i+1,returnValue) ;
}
if(type.getName().equals("int")){
Integer returnValue = (Integer)m.invoke(s) ;
ps.setInt(i+1,returnValue) ;
}
}
ps.executeUpdate() ;
} catch (Exception e) {
e.printStackTrace() ;
}
}
private String createSQL() {
String str1 = "" ;
String str2 = "" ;
int index = 0 ;
for(String s : map.keySet()){
String v = map.get(s) ;
//构造方法名称
methodNames[index] = "get" + Character.toUpperCase(v.charAt(0)) + v.substring(1) ;
str1 += s + "," ;
index++ ;
}
str1 = str1.substring(0,str1.length()-1) ;
for(int i=0; i<map.size() ; i++){
str2 += "?," ;
}
str2 = str2.substring(0, str2.length()-1) ;
String sql = "insert into " + tableName + " (" + str1 + " ) values (" + str2 +")" ;
return sql;
}
}
测试类
package com.zenoh.test;
import com.zenoh.bean.Student;
import com.zenoh.session.Session;
public class SessionTest {
public static void main(String args[])
{
Student s = new Student() ;
s.setAge(20) ;
s.setTitle("hello") ;
Session session = new Session() ;
session.save(s) ;
}
}
SQl语句
create table _student(_id int primary key , _age int , _title varchar(20))
分享到:
相关推荐
Hibernate 实现原理 模拟,通过模拟hibernate的实现原理来加深对hibernate实现原理的理解和使用。
Hibernate模拟实现。主要用于学习Hibernate的原理
利用java反射和java注解实现JDBC封装,模拟hibernatez自动建表删表,实体关系映射,get,getAll,delete,update,add,事务处理等等。。
主要是整合struts1+hibernate 的模拟银行系统。
自定义注解,反射拼装查询,模拟实现hibernate的注解功能原理
本项目只是简单模拟教务管理系统的基本功能,通过熟悉的教务管理系统开发来综合训练Struts2和 Hibernate5框架技术的整合应用,并进一步提高项目实践能力。 项目实现的功能包括学生管理部分,教师管理部分和管理员管理...
自己编写仿hibernate的java框架,模拟hibernate实现的原理
通过自定义注解,反射等技术实现hibernate注解功能。单元测试可以直接跑,代码里的注释写的很清楚,欢迎下载参阅!
该服务器是本人模拟Tomcat做的,同时实现了主流的两大框架:struts 和 hibernate的一些功能,做这个东西本是自娱自乐,所以有很多地方尚未完善,构造方法一大堆的参数也让人头疼。希望有兴趣的朋友可以提一些建议,...
使用java的纯jdbc的代码通过反射模拟hibernate和mybatis
基于hibernate和struts2开发的当当模拟实现
为简单起见,只建了一张数据表,模拟对一张表的 增 删 改 查 等Web开发常用的技术 适合刚接触hibernate+spring的java开发者
基于Struts2+Spring+Hibernate+MySql的注册登录系统 SSH实例 入门实例 Java EE简单实现例子
这是达内培训的javaweb项目.模拟当当网的完整项目,附加了所用的jar包,代码有注解,使用struts2 + spring +Hibernate技术实现的。 包涵数据库sql文件
只实现了部分功能,尽供学习struts1+hibernate+spring使用。
2.2.2 Hibernate框架技术 4 2.3 开发工具介绍 5 2.3.1 MyEclipse介绍 5 2.3.2 MySQL5.0介绍 5 3 需求分析 6 3.1 可行性分析 6 3.2 功能需求 6 3.3 性能需求 7 3.4 数据需求 7 3.5 数据字典 7 4 总体设计 9 4.1 总体...
Hibernate Annotation几种关联映射 一对一(One-To-One) 使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键...
11.4.3 持久层hibernate 3实现 728 11.4.4 spring 2接管业务逻辑层 730 11.5 小结 733 第12章 站务必备—系统用户管理与流量统计 735 12.1 系统用户管理与流量统计需求分析 735 12.2 系统用户管理与流量统计...
本项目模拟并实现当前正在运营的“当当网”的大部分功能。提供用户注册、商品浏览、商品购买、商品分类、购物车、购物车管理等功能。 项目基于MVC架构模式的基础之上新增了逻辑服务控制。显示层采用jsp的相关的内置...
2.2.2 Hibernate框架技术 4 2.3 开发工具介绍 5 2.3.1 MyEclipse介绍 5 2.3.2 MySQL5.0介绍 5 3 需求分析 6 3.1 可行性分析 6 3.2 功能需求 6 3.3 性能需求 7 3.4 数据需求 7 3.5 数据字典 7 4 总体设计 9 4.1 总体...