用反射模拟Hibernate保存JavaBean

  1 用反射模拟Hibernate保存JavaBean
  2     首先要说一下思想。就是要接收一个JavaBean实例对象,然后根据字段信息、类名信息,自己组组织成sql语句最后保存到数据库中。
  3 组件说明:
  4     需要一个@Table注解,自己声明,以便于用户声明的表名与数据库的表名不致的情况。
  5         此注解应该包含一个属性,以便于指定表名。
  6     需要声明一个@Column注解,自己声明以便于用户声明的字段名与JavaBean的列名不一致的情况。
  7         此注解也应该包含一个属性,以便于指定字段名。如果需要还可以指定数据类型。
  8 上代码:
  9 1:@Table注解
 10 package cn.project.anno;
 11 import java.lang.annotation.ElementType;
 12 import java.lang.annotation.Retention;
 13 import java.lang.annotation.RetentionPolicy;
 14 import java.lang.annotation.Target;
 15 @Retention(RetentionPolicy.RUNTIME)
 16 @Target(value=ElementType.TYPE)
 17 public @interface Table {
 18     public String value();//声明一个属性
 19 }
 20 2:@Column注解
 21 package cn..project.anno;
 22 import java.lang.annotation.ElementType;
 23 import java.lang.annotation.Retention;
 24 import java.lang.annotation.RetentionPolicy;
 25 import java.lang.annotation.Target;
 26 @Retention(RetentionPolicy.RUNTIME)
 27 @Target(value=ElementType.FIELD)
 28 public @interface Column {
 29     public String value() default "";//默认值
 30 }
 31 3:工具类代码:接收对象,直接保存:
 32 package cn.project.anno;
 33 import java.lang.reflect.Field;
 34 import java.sql.ParameterMetaData;
 35 import java.sql.PreparedStatement;
 36 import java.util.ArrayList;
 37 import java.util.List;
 38 /**
 39  * 这只是保存的示例
 40  * 应该同时提供删除,修改
 41  * 查询的可以直接使用DbUtils
 42  * @author <a href="mailto:[email protected]">王健</a>
 43  */
 44 public class SaveUtils {
 45     public static void save(Object o) throws Exception{
 46         String sql = "insert into";//声明insert的头
 47         String values = " values (";//声明values的头
 48         Class c = o.getClass();
 49         boolean boo = c.isAnnotationPresent(Table.class);
 50         if(boo){                //分析是否带有Table注解,此外分析的还少一句不存在时的处理
 51             Table t = (Table) c.getAnnotation(Table.class);
 52             String vv = t.value();
 53             System.err.println(vv);
 54             sql+=" "+vv;
 55         }
 56         sql+="(";
 57         Field[] f = c.getDeclaredFields();//获取所有字段,来判断是否存在@Column注解
 58         List<Object> oo = new ArrayList<Object>();//声明参数对象
 59         for(Field ff:f){
 60             if(ff.isAnnotationPresent(Column.class)){
 61                 Column col = ff.getAnnotation(Column.class);
 62                 String vv = col.value();
 63                 if(vv.equals("")){
 64                     if(sql.endsWith("(")){
 65                         sql+=ff.getName();
 66                         values+="?";
 67                     }else{
 68                         sql+=","+ff.getName();
 69                         values+=",?";
 70                     }
 71                 }else{
 72                     if(sql.endsWith("(")){
 73                         sql+=vv;
 74                         values+="?";
 75                     }else{
 76                         sql+=","+vv;
 77                         values+=",?";
 78                     }
 79                 }
 80                 ff.setAccessible(true);
 81                 oo.add(ff.get(o));
 82             }
 83         }
 84         sql+=")";
 85         values+=")";
 86         System.err.println(sql+" "+values);//组成有效的sql语句
 87         System.err.println("处理数据....");
 88         PreparedStatement pst = //在正式的应用场合下,所有的Connection应该由用户传递过来,以保证事务
 89                 Conn.getConn().prepareStatement(sql+values);
 90         ParameterMetaData param = pst.getParameterMetaData();
 91         int count = param.getParameterCount();//判断有多少参数
 92         System.err.println("count:"+count);
 93         for(int i=0;i<count;i++){
 94             pst.setObject(i+1,oo.get(i));//设置参数
 95         }
 96         pst.execute();//执行代码
 97         Conn.getConn().close();
 98     }
 99 }
100 1、测试代码:
101 @Test
102     public void testSave() throws Exception{
103         Stud stud = new Stud();
104         stud.setName("Marray");
105         stud.setAge(89);
106         stud.setAddr("中国上海");
107         SaveUtils.save(stud);
108     }
109 2、测试结果:
110 student
111 insert into student(name,ages,addr)  values (?,?,?)
112 处理数据....
113 count:3
114 保存成功
时间: 2024-08-02 15:58:19

用反射模拟Hibernate保存JavaBean的相关文章

hibernate之模拟Hibernate持久化操作

[Hibernate]之模拟Hibernate持久化操作 使用过Hibernate,大家都知道,由于其面向对象的设计,用起来非常方便,且具有很好的跨数据库性,那么Hibernate的底层是怎么实现的呢?其实也就是将对象模型转化为关系模型,最终还是得sql语句来执行. 看过Hibernate源码的同学应该发现, Hibernate底层的核心是代理和反射,那么由此这样我们就可以理解为什么使用Hibernate在效率上始终是致命的. Ok,下面是一个简单的模拟Hibernate-ORM的save()方

利用反射模拟一个spring的内部工作原理

这个简单的案例是实行了登录和注册的功能,没有链接数据库. 在bean中id 是唯一的,id和name的区别在于id不能用特殊字符而name可以用特殊字符,比如:/-\.... 1 package com.obtk.reflect; 2 3 public class Logon { 4 /** 5 * 帐号密码长度大于六位字符就成功,否则失败! 6 * */ 7 public String select(String name, String pass) { 8 if (name.length()

解决hibernate保存数据到mysql中出现乱码问题

今天使用hibernate保存数据到mysql中,发现出现乱码问题,经过检查,发现接收到的是正确中文,说明客户端浏览器将中文编码发送到服务器过程中无乱码问题,后来查找资料: 首先要告诉数据库要插入的字符串的字符集,mysql 默认使用的字符集是 latin1.我要保存的字符串是 UTF-8 编码的(字符集是 Unicode),所以包含这个字段的表应该使用 UTF-8 编码. 这里有几种解决办法. 1.在建立数据库的时候指定数据库的字符集编码,这样,这个数据库的所有表都会默认使用数据库的字符集编码

使用反射模拟实现hibernate

一个对象要存进数据库中,一般需要通过JDBC连接数据库,创建SQL语句,执行execute或executeUpdate方法, 步骤很多,过程很繁琐,并且SQL语句不是面向对象的语言. hibernate这种方式是面向对象的 .hibernate两端连接着对象和数据库, 是一种ORM对象关系映射, 通过操作对象与关系数据库建立关联,进行数据库的增删改查, 简化了编程,并且跨数据库平台,只要说明使用的方言,就会自动转换为各种数据库的操作. 模拟思路------------- 1.首先建立一个实体类.

简单模拟Hibernate的主要功能实现

在学习期间接触到Hibernate框架,这是一款非常优秀的O/R映射框架,大大简化了在开发web项目过程中对数据库的操作.这里就简单模拟其底层的实现. /*******代码部分,及其主要注解**********************/1.实体类User:public class User {    private int id;    private String username;    private String password; public int getId() {       

采用dom4j和反射模拟Spring框架的依赖注入功能

Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面是具体的步骤: 第一步,编写配置文件.配置文件的书写,采用了和Spring的配置文件applicationContext.xml一样的书写规则: <?xml version="1.0" encoding="UTF-8"?> <!-- applicati

Java反射—模拟Spring的Aop

1.    大概流程 上篇文章已经结合Java反射解释了SpringAop的原理,这里我们简单模拟以下Spring的Aop实现.大体流程如下: ?  创建一个properties配置文件模拟Spring配置文件. ?  创建一个增强接口与一个实现类模拟Spring的Advice. ?  创建一个生成代理的工厂类,并在InvocationHandler类的invoke方法中织入增强方法(即aop). ?  创建一个生成Bean的工厂类(类似IOC工厂,只创建bean,没有依赖注入的功能),生成Be

模拟Hibernate动态生成SQL语句

这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-

菜鸟学SSH(十五)——简单模拟Hibernate实现原理

之前写了Spring的实现原理,今天我们接着聊聊Hibernate的实现原理,这篇文章仅仅是简单的模拟一下Hibernate的原理,主要是模拟了一下Hibernate的Session类.好了,废话不多说,先看看我们的代码: package com.tgb.hibernate; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pre