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滴)
分享到:
相关推荐
通过Spring框架实现了模块化的业务逻辑和依赖注入,Spring MVC负责处理用户请求和页面跳转,而Hibernate作为ORM框架则实现了数据持久化和访问。项目的亮点包括用户友好的界面设计、实时消息通知系统和安全可靠的数据...
Hibernate是开源的ORM对象关系映射框架,包括Session、SessionFactory、Transaction、Query、Criteria和Configuration六核心类和接口。
Hibernate ORM 5作为Java 9自动模块 一个简单的测试平台,用于将Hibernate ORM 5用作(自动)JPMS模块。 一些值得注意的事情: 除了java.transaction和java.persistence之外,几乎所有依赖项都用作自动模块。 JDK...
Hibernate源码,包含hibernate-core、hibernate-ehcache、hibernate-c3p0、hibernate-osgi、hibernate-spatial等模块
ORM - Hibernate mysql数据库。 笔记 SQL 文件保存在 sql 文件夹下。 战争在目标文件夹下。 未来的增强 为登录身份验证实现 Spring 安全的全部范围。 使用 Hibernate 的所有关系概念。 为员工模块编写单元测试...
Hibernate作为ORM框架,负责将关系型数据库中的表映射成对象,简化了数据访问层的编码工作。Spring作为IoC容器,负责管理对象的生命周期和依赖关系,降低了各个模块之间的耦合度。Oracle作为关系型数据库,存储了...
Struts框架负责处理用户请求和页面跳转,Hibernate框架实现了对象关系映射(ORM),简化了数据库操作,而Spring框架则提供了依赖注入和事务管理等核心功能,降低了系统耦合度,提高了可维护性。 系统主要实现了车辆...
MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...
Hibernate ORM:采用Hibernate框架实现对象关系映射,简化了数据持久化操作,提高了数据访问效率和可靠性。 RESTful API:设计符合RESTful风格的API接口,实现了前后端分离,提高了系统的可扩展性和灵活性。 JWT ...
MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...
2. 使用Hibernate作为ORM框架,实现了对数据库的抽象和封装,简化了数据库操作。 3. 采用MySQL作为数据库存储,具有较高的性能和可扩展性。 4. 使用CSS进行前端页面设计,实现了良好的用户界面和交互体验。 **二次...
如:该项目主要功能模块分为首页Portlet展示、协同审批、协同工作、日历、资源管理、知识中心、新闻中心、通讯录、系统管理。是一套很好的办公自动化系统,用户能够轻松自定义表单、工作流、公文等,有良好的协同...
Hibernate作为ORM框架,负责将Java对象映射到Oracle数据库中的表,使得开发者可以用面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。Spring作为IoC容器,负责管理对象的生命周期和依赖关系,使得系统的各个...
MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...
Hibernate框架:用于实现对象关系映射(ORM),简化数据操作和管理,提高开发效率。 MySQL数据库:作为数据存储的选择,提供了稳定可靠的数据存储和管理功能。 安全性和权限控制: 对于系统的敏感操作,如用户管理...
1. 项目背景介绍 这个项目是一个基于Spring+Spring MVC+Hibernate的在线招标系统,旨在解决传统招标过程中的繁琐和低效问题,提高招标效率和透明...Hibernate框架: 负责对象关系映射(ORM),简化了数据访问层的开发。
技术实现上,后端使用SpringBoot简化开发流程和配置工作,SpringMVC负责请求响应周期,MyBatis或Hibernate作为ORM工具与MySQL或其他数据库交互。前端可能采用Angular、React或Vue.js等现代JavaScript框架构建一个...
整个框架只有两个JAR包,模块和功能都较为轻量。依赖少 整个框架只有三个jar库。间接依赖仅有commons-lang, slf4j等7个通用库,作为一个ORM框架,对第三方依赖极小。简单直接的API 框架的API设计直接面向数据库...
题目/主题:确定项目的主题,例如预约挂号系统、图书管理系统等。 面板设计:根据需求设计系统的各个面板,包括登录界面、主界面、数据展示界面等。...测试和优化:完成功能实现后,进行测试,确保系统的稳定性和正确
MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...