Hibernate的ORM功能,简而言之就是用户传一个任意对象进去,然后系统自动生成相应的SQL语句并执行
因此,实现一个简易的ORM模块并不难,关键就在于对JAVA反射机制的使用和SQL语句的拼凑
基本思路是:
· 根据传入的Object来得到数据库的表名
· 得到属性名和对应的值
· 将所得信息进行整合,拼凑一条SQL语句
代码:
1. 定义两个测试用的POJO类(省略get和set方法)
public class UserInfo {
private int id;
private String userName;
private String userPwd;
private int userAge;
}
public class Article {
private int id;
private String title;
private String author;
private String content;
}
2. 然后写个数据库的连接静态类
import java.sql.Connection;
import java.sql.DriverManager;
public class DBConnector {
public static Connection conn;
public static boolean buildConn(){
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
conn = DriverManager.getConnection(url,"root","password");
return true;
}catch(Exception e){
e.printStackTrace();
}
return false;
}
}
3. 接下来是主体部分了
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import cn.netjava.dao.DBConnector;
import cn.netjava.pojo.Article;
import cn.netjava.pojo.UserInfo;
public class ORMmodel {
/**
* 插入数据
* @param obj 需要保存的对象
* @return 保存是否成功
*/
public boolean insert(Object obj){
String sql = "insert into ";
//得到表名
String tableName = obj.getClass().getName();
sql = sql + tableName.substring(tableName.lastIndexOf(".")+1) + "(";
//得到properties和values
Method[] methods = obj.getClass().getMethods();
ArrayList<String> properties = getProperties(methods);
ArrayList<Object> values = getValues(methods,obj);
//拼接sql语句
String sql1 = "";
String sql2 = ") value (";
for(int i=0;i<properties.size();i++){
String property = properties.get(i);
Object value = values.get(i);
if(property.equals("Id")){//插入时id属性不需要处理,跳过
continue;
}
sql1 += property + ",";
sql2 += "'" + value + "',";
}
sql += sql1.substring(0,sql1.length()-1) + sql2.substring(0,sql2.length()-1) + ")";
try{
Statement state = DBConnector.conn.createStatement();
state.executeUpdate(sql);
return true;
}catch(Exception e){
e.printStackTrace();
}
return false;
}
/**
* 删除对象
* @param obj
* @return
*/
public boolean delete(Object obj){
String sql = "delete from ";
//得到表名
String tableName = obj.getClass().getName();
sql = sql + tableName.substring(tableName.lastIndexOf(".")+1) + " where ";
//得到properties和values
Method[] methods = obj.getClass().getMethods();
ArrayList<String> properties = getProperties(methods);
ArrayList<Object> values = getValues(methods,obj);
//拼接sql语句
for(int i=0;i<properties.size();i++){
String property = properties.get(i);
Object value = values.get(i);
if(property!=null&&value!=null){
if(value instanceof Integer){ //如果属性类型为int而且
int a = ((Integer) value).intValue(); //没被赋值时,默认是0,所以
if(a==0){ //此处对值为值为0的属性不做
continue; //处理,跳过
} //(此处理只适用于不会出现值
} //为0的属性的对象,仅供测试)
sql += property + "='" + value.toString() + "' and ";
}
}
sql = sql.substring(0, sql.length()-5);
try{
Statement state = DBConnector.conn.createStatement();
state.executeUpdate(sql);
return true;
}catch(Exception e){
e.printStackTrace();
}
return false;
}
/**
* 修改对象
* @param obj
* @return
*/
public boolean update(Object obj){
String sql = "update ";
//得到表名
String tableName = obj.getClass().getName();
sql += tableName.substring(tableName.lastIndexOf(".")+1) + " set ";
//得到properties和values
Method[] methods = obj.getClass().getMethods();
ArrayList<String> properties = getProperties(methods);
ArrayList<Object> values = getValues(methods,obj);
//拼接sql语句
String id = null;
for(int i=0;i<properties.size();i++){
String property = properties.get(i);
Object value = values.get(i);
if(property.equals("Id")){
id = value.toString();
continue;
}
if(value instanceof Integer){
int a = ((Integer) value).intValue();
if(a==0){
continue;
}
}
sql += property + "='" + value.toString() + "',";
}
sql = sql.substring(0,sql.length()-1) + " where id='" + id + "'";
try{
Statement state = DBConnector.conn.createStatement();
state.executeUpdate(sql);
return true;
}catch(Exception e){
e.printStackTrace();
}
return false;
}
/**
* 查找所有包含指定属性的Object
* @param obj
* @return
*/
public ArrayList<Object> search(Object obj){
ArrayList<Object> list = new ArrayList<Object>();
String sql = "select * from ";
//得到表名
String tableName = obj.getClass().getName();
sql += tableName.substring(tableName.lastIndexOf(".")+1) + " where ";
//得到properties和values
Method[] methods = obj.getClass().getMethods();
ArrayList<String> properties = getProperties(methods);
ArrayList<Object> values = getValues(methods,obj);
//拼接sql语句
for(int i=0;i<properties.size();i++){
String property = properties.get(i);
Object value = values.get(i);
if(property!=null&&value!=null){
if(value instanceof Integer){
int a = ((Integer) value).intValue();
if(a==0){
continue;
}
}
sql += property + "='" + value.toString() + "' and ";
}
}
sql = sql.substring(0,sql.length()-5);
try{
Statement state = DBConnector.conn.createStatement();
ResultSet set = state.executeQuery(sql);
while(set.next()){
if(tableName.substring(tableName.lastIndexOf(".")+1).equals("UserInfo")){
UserInfo user = new UserInfo();
user.setUserAge(set.getInt("userage"));
user.setId(set.getInt("id"));
user.setUserName(set.getString("username"));
user.setUserPwd(set.getString("userpwd"));
list.add(user);
}
if(tableName.substring(tableName.lastIndexOf(".")+1).equals("Article")){
Article article = new Article();
article.setAuthor(set.getString("author"));
article.setId(set.getInt("id"));
article.setContent(set.getString("content"));
article.setTitle(set.getString("title"));
list.add(article);
}
}
return list;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 根据方法名得到属性名的List
* @param methods
* @return
*/
private ArrayList<String> getProperties(Method[] methods){
ArrayList<String> properties = new ArrayList<String>();
for(Method m : methods){
String methodName = m.getName();
if(methodName.startsWith("get")&&!methodName.equals("getClass")){
String property = methodName.substring(3);
properties.add(property);
}
}
return properties;
}
/**
* 得到属性对应的value
* @param methods
* @param obj
* @return
*/
private ArrayList<Object> getValues(Method[] methods,Object obj){
ArrayList<Object> values = new ArrayList<Object>();
for(Method m : methods){
String methodName = m.getName();
if(methodName.startsWith("get")&&!methodName.equals("getClass")){
try{
Object value = m.invoke(obj, null);
values.add(value);
}catch(Exception e){
e.printStackTrace();
}
}
}
return values;
}
}
4. 最后再自己写个main函数测试下
特别说明:
·以上代码测试前需要准备好一个数据库并预先定义好userinfo和article表
·修改数据时id属性不能为0(未定义的话id也会默认为0滴)
分享到:
相关推荐
Hibernate ORM 5.0中的实体管理是其核心功能之一。通过注解或XML配置,开发者可以定义实体类,实现对象与数据库表之间的映射。源码中,`SessionFactory`负责创建`Session`实例,而`Session`是操作实体的主要接口,...
通过这种方式,Hibernate ORM引入了更灵活和模块化的架构,使得扩展和定制更加方便。内置的Services涵盖了各种功能,如配置解析、JDBC连接管理、JNDI查找等。这些Services的详细信息可以通过查阅官方文档或相关资料...
总而言之,Hibernate ORM 5.4.30 入门指南是一份宝贵的学习资源,尤其对于那些希望在Java应用程序中实现高效、优雅数据库操作的开发者来说更是如此。通过逐步的教程和实例代码,用户能够快速掌握Hibernate的基本使用...
本文档中所设计的在线通讯录系统是使用 JSP 和 Hibernate 实现的,该系统主要包括用户管理、抄表管理和电费管理等几个功能模块。使用 JSP 实现用户界面,使用 Hibernate 实现与数据库的交互,实现了数据的持久化和...
这包括Spring ORM模块以及Hibernate核心库等。 2. **版本不兼容**:如果项目的依赖管理不善,可能会出现不同库之间版本冲突的问题,导致某些类找不到或不可用。 3. **配置错误**:Spring的配置文件可能存在错误,...
Spring的ORM模块提供了与Hibernate的无缝集成,使得开发者可以在不脱离Spring的上下文环境中使用Hibernate的强大功能。 在Spring与Hibernate4的集成中,主要涉及以下几个核心概念: 1. **SessionFactory**: ...
【标题】"cxf+spring+hibernate整合添加功能实现修改版"涉及的是一个集成开发环境中的核心技术栈,即Apache CXF、Spring框架和Hibernate ORM的整合应用,旨在实现服务添加功能的优化。Apache CXF是一个开源的WS-*...
Spring和Hibernate是两个非常流行的Java开发框架,Spring提供了全面的企业级应用开发解决方案,而Hibernate则是Java领域中最著名的ORM框架之一。本文将详细介绍如何在Spring项目中集成Hibernate,实现高效的数据库...
1. Hibernate:Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以用面向对象的方式处理数据,而无需编写大量的SQL语句。Hibernate提供了一种映射机制,将...
1. **Hibernate Core**: 这是Hibernate的基础模块,提供了ORM的主要功能,包括实体管理、会话管理和查询语言(HQL)。它包含了Entity Manager接口以及其实现,使得对象与数据库表之间的映射变得简单。 2. **Hibernate...
标题 "Spring+SpringMVC+Hibernate+mysql+maven多模块" 涉及的是一个常见的Java Web开发技术栈,这个组合常用于构建大型、复杂的Web应用程序。以下是对这些技术及其结合方式的详细解释: 1. **Spring框架**:Spring...
1. Hibernate概述:Hibernate是Java领域最流行的ORM框架之一,它不仅提供了JPA规范的实现,还具有自己的扩展特性。 2. Spring整合Hibernate:Spring通过SessionFactory和TransactionManager的配置,实现了与...
其次,Hibernate作为ORM(Object-Relational Mapping)框架,实现了Java对象与数据库表之间的映射,简化了数据库操作。在订单管理系统中,Hibernate通过实体类和配置文件,自动处理SQL语句,减少了开发者对数据库...
开发者在项目中引入这些jar,就可以利用SpringMVC的MVC功能和Hibernate的ORM能力,构建出高性能、易维护的Java Web应用。 总的来说,这个压缩包提供了构建基于Java SpringMVC 4.0和Hibernate 4.1应用的基础,帮助...
【标题】"Hibernate源码"涉及的是Java领域中著名的对象关系映射(ORM)框架Hibernate的核心源代码。ORM框架允许开发者使用面向对象的方式来操作数据库,而无需直接编写SQL语句,极大地提高了开发效率和代码可读性。...
Spring的ORM模块是其核心组件之一,用于整合各种Object-Relational Mapping(ORM)框架,如Hibernate、JDO、TopLink、iBatis等。这个模块使得开发者可以在Spring的管理下方便地使用这些ORM框架,简化了数据访问层...
标题中的"org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException"是一个具体的异常类型,源自Spring框架的Hibernate4模块。这个异常通常在乐观锁(Optimistic Locking)机制失败时抛出,...
Spring MVC和Hibernate是JavaEE开发中非常流行的框架,分别用于实现MVC设计模式和提供ORM(对象关系映射)功能。整合这两种技术可以提高开发效率,增强系统的可维护性和扩展性。 首先,Spring MVC是一个强大的MVC...
通过阅读这些源码,你可以深入理解Hibernate的工作原理,学习如何实现ORM框架,以及优化数据库访问性能。同时,这也是提升Java开发技能和数据库设计能力的好途径。如果你希望深入学习Hibernate,可以从这些模块入手...