本例子是不使用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模拟实现,包括配置文件的设置、实体类的定义、映射文件的编写以及基本的CRUD操作。例如,可能有一个名为`User`的实体类,对应数据库的`users`表。通过`hibernate.cfg.xml...
**Hibernate实现原理...通过模拟实现,我们可以更直观地理解其工作流程,加深对ORM框架的理解。这不仅有助于日常开发,也有利于提升解决问题的能力。在学习和实践中,不断探索和优化,将使你成为更优秀的Java开发者。
4. **自动建表删表**: 模拟Hibernate的一个关键点是实现数据库表的动态创建和删除。这通常通过分析实体类及其属性来生成相应的CREATE TABLE和DROP TABLE SQL语句,然后使用JDBC执行这些语句。 5. **实体关系映射(E-...
首先,"006_尚学堂马士兵_Java视频教程_Hibernate3.3.2_Hibernate模拟实现.avi"这个视频,马士兵老师将带你走进Hibernate的世界,讲解如何模拟实现Hibernate的基本功能。这个阶段的学习旨在理解Hibernate的核心概念...
在这个模拟项目中,虽然可能并未涵盖所有这些高级特性,但通过Struts1和Hibernate的整合,可以学习到如何在实际的Web环境中实现用户交互、数据库操作以及错误处理,为构建更复杂的网上银行系统打下基础。 在EBank...
这个“struts2整合hibernate的网上银行模拟项目”结合了这两个框架,创建了一个模拟的网上银行系统,旨在展示如何在实际项目中使用它们。 首先,让我们深入了解一下Struts2。Struts2 是 Struts 的下一代,它继承了...
读者可以通过查看这些源代码,了解作者如何模拟 Hibernate 的核心功能,如 Session 接口、实体管理、SQL 查询的自动化生成等。 综上所述,这篇文章的内容可能包括以下几个方面: 1. **数据库连接管理**:介绍如何...
在标题"控制反转应用,模拟Hibernate"中,我们讨论的是如何使用Java编程来模拟Hibernate中的IoC概念。Hibernate是一个流行的对象关系映射(ORM)框架,它在处理数据库操作时,利用IoC来管理对象的生命周期和依赖关系...
在这个"模拟hibernate的session.save()功能"的资源中,我们将深入理解Hibernate的核心操作之一:持久化对象。此程序源码的目的是帮助我们理解如何在没有Hibernate库的情况下实现类似的功能,这有助于我们更好地掌握...
模拟实现Hibernate的注解功能原理,需要深入了解Java的反射API,如Class类、Field类、Method类等,以及如何通过它们来读取和使用注解。首先,你需要定义自己的自定义注解,这些注解将模仿Hibernate的标准注解,如@...
我们也可以在模拟类中实现这一功能,将Hibernate的异常捕获并抛出更易于理解和处理的自定义异常。 6. **查询支持**:除了基本的CRUD操作,还可以添加支持HQL(Hibernate查询语言)和SQL查询的方法,如`...
本项目只是简单模拟教务管理系统的基本功能,通过熟悉的教务管理系统开发来综合训练Struts2和 Hibernate5框架技术的整合应用,并进一步提高项目实践能力。 项目实现的功能包括学生管理部分,教师管理部分和管理员管理...
在进行Hibernate的测试时,可以创建一个名为`hibernate_test`的项目,编写对应的实体类、映射文件以及测试用例,模拟并发场景,来深入理解并对比悲观锁和乐观锁的差异和效果。 总之,理解并合理运用悲观锁和乐观锁...
3. **测试代码**:编写JUnit测试用例,模拟用户增删改查的完整流程,检查Hibernate功能是否正常工作。 压缩包中的“.files”文件夹可能包含了相关的图片、配置文件或日志,它们是教程中的辅助材料,帮助理解每个...
在这个“Hibernate连接数据库模拟”项目中,我们将会深入探讨如何使用Java DOM解析XML配置文件来实现Hibernate的数据访问。 首先,Hibernate的核心在于它的配置文件——`hibernate.cfg.xml`,这个文件包含了数据库...
在本示例中,我们将探讨如何整合Spring AOP(面向切面编程)与Hibernate ORM框架,并利用它们来实现事务管理,模拟一个简单的买书过程。这个过程将涉及到数据库操作,事务的开始、提交和回滚,以及AOP在处理事务中的...
在这个名为“模拟hibernate注解功能”的项目中,我们将探讨如何利用自定义注解和反射技术来模仿Hibernate的注解功能。 首先,让我们理解一下Hibernate的注解。Hibernate支持JPA(Java Persistence API)标准,其中...
通过自定义模板,我们可以控制生成的代码结构、命名规范,甚至引入额外的功能,以实现与现有项目代码风格的一致性。 【标签】:“源码”、“工具” 自定义模板涉及到对模板引擎的理解,通常使用的是Velocity或...
在提供的"模拟hibernate中一级缓存"的案例中,我们可以创建一个简单的实体类,例如`User`,并使用Hibernate的Session接口进行操作。首先,通过`Session.get()`方法加载一个User对象,然后关闭Session。接着,再次...