`

Hibernate的模拟实现

阅读更多

本例子是不使用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模拟实现,包括配置文件的设置、实体类的定义、映射文件的编写以及基本的CRUD操作。例如,可能有一个名为`User`的实体类,对应数据库的`users`表。通过`hibernate.cfg.xml...

    Hibernate实现原理模拟

    **Hibernate实现原理...通过模拟实现,我们可以更直观地理解其工作流程,加深对ORM框架的理解。这不仅有助于日常开发,也有利于提升解决问题的能力。在学习和实践中,不断探索和优化,将使你成为更优秀的Java开发者。

    java模拟hibernate实现

    4. **自动建表删表**: 模拟Hibernate的一个关键点是实现数据库表的动态创建和删除。这通常通过分析实体类及其属性来生成相应的CREATE TABLE和DROP TABLE SQL语句,然后使用JDBC执行这些语句。 5. **实体关系映射(E-...

    hibernate资料3

    首先,"006_尚学堂马士兵_Java视频教程_Hibernate3.3.2_Hibernate模拟实现.avi"这个视频,马士兵老师将带你走进Hibernate的世界,讲解如何模拟实现Hibernate的基本功能。这个阶段的学习旨在理解Hibernate的核心概念...

    基于struts+hibernate的模拟银行转账

    在这个模拟项目中,虽然可能并未涵盖所有这些高级特性,但通过Struts1和Hibernate的整合,可以学习到如何在实际的Web环境中实现用户交互、数据库操作以及错误处理,为构建更复杂的网上银行系统打下基础。 在EBank...

    struts2整合hibernate的网上银行模拟项目

    这个“struts2整合hibernate的网上银行模拟项目”结合了这两个框架,创建了一个模拟的网上银行系统,旨在展示如何在实际项目中使用它们。 首先,让我们深入了解一下Struts2。Struts2 是 Struts 的下一代,它继承了...

    看我山寨版 hibernate 简单实现 一

    读者可以通过查看这些源代码,了解作者如何模拟 Hibernate 的核心功能,如 Session 接口、实体管理、SQL 查询的自动化生成等。 综上所述,这篇文章的内容可能包括以下几个方面: 1. **数据库连接管理**:介绍如何...

    控制反转应用,模拟Hibernate

    在标题"控制反转应用,模拟Hibernate"中,我们讨论的是如何使用Java编程来模拟Hibernate中的IoC概念。Hibernate是一个流行的对象关系映射(ORM)框架,它在处理数据库操作时,利用IoC来管理对象的生命周期和依赖关系...

    模拟hibernate的session.save()功能

    在这个"模拟hibernate的session.save()功能"的资源中,我们将深入理解Hibernate的核心操作之一:持久化对象。此程序源码的目的是帮助我们理解如何在没有Hibernate库的情况下实现类似的功能,这有助于我们更好地掌握...

    hibernate注解功能模拟

    模拟实现Hibernate的注解功能原理,需要深入了解Java的反射API,如Class类、Field类、Method类等,以及如何通过它们来读取和使用注解。首先,你需要定义自己的自定义注解,这些注解将模仿Hibernate的标准注解,如@...

    hibernate模拟hibernatetemplate

    我们也可以在模拟类中实现这一功能,将Hibernate的异常捕获并抛出更易于理解和处理的自定义异常。 6. **查询支持**:除了基本的CRUD操作,还可以添加支持HQL(Hibernate查询语言)和SQL查询的方法,如`...

    基于Struts2+Hibernate5的教务管理系统项目实训

    本项目只是简单模拟教务管理系统的基本功能,通过熟悉的教务管理系统开发来综合训练Struts2和 Hibernate5框架技术的整合应用,并进一步提高项目实践能力。 项目实现的功能包括学生管理部分,教师管理部分和管理员管理...

    Hibernate悲观锁和乐观锁的实现

    在进行Hibernate的测试时,可以创建一个名为`hibernate_test`的项目,编写对应的实体类、映射文件以及测试用例,模拟并发场景,来深入理解并对比悲观锁和乐观锁的差异和效果。 总之,理解并合理运用悲观锁和乐观锁...

    hibernate example

    3. **测试代码**:编写JUnit测试用例,模拟用户增删改查的完整流程,检查Hibernate功能是否正常工作。 压缩包中的“.files”文件夹可能包含了相关的图片、配置文件或日志,它们是教程中的辅助材料,帮助理解每个...

    Hibernate连接数据库模拟

    在这个“Hibernate连接数据库模拟”项目中,我们将会深入探讨如何使用Java DOM解析XML配置文件来实现Hibernate的数据访问。 首先,Hibernate的核心在于它的配置文件——`hibernate.cfg.xml`,这个文件包含了数据库...

    SpringAOP整合Hibernate并使用事务(模拟买书的过程)

    在本示例中,我们将探讨如何整合Spring AOP(面向切面编程)与Hibernate ORM框架,并利用它们来实现事务管理,模拟一个简单的买书过程。这个过程将涉及到数据库操作,事务的开始、提交和回滚,以及AOP在处理事务中的...

    模拟hibernate注解功能

    在这个名为“模拟hibernate注解功能”的项目中,我们将探讨如何利用自定义注解和反射技术来模仿Hibernate的注解功能。 首先,让我们理解一下Hibernate的注解。Hibernate支持JPA(Java Persistence API)标准,其中...

    自定义 Hibernate Tools 的模板

    通过自定义模板,我们可以控制生成的代码结构、命名规范,甚至引入额外的功能,以实现与现有项目代码风格的一致性。 【标签】:“源码”、“工具” 自定义模板涉及到对模板引擎的理解,通常使用的是Velocity或...

    模拟hibernate中一级缓存

    在提供的"模拟hibernate中一级缓存"的案例中,我们可以创建一个简单的实体类,例如`User`,并使用Hibernate的Session接口进行操作。首先,通过`Session.get()`方法加载一个User对象,然后关闭Session。接着,再次...

Global site tag (gtag.js) - Google Analytics