论坛首页 Java企业应用论坛

简单的OR-Mapping 工具-有代码讲解

浏览 7573 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-04-16   最后修改:2009-04-16
我相信有很多人像我一样不喜欢用hibernate,或者感觉用的不是很明白,所以我有了这个想法做一个简单OR/Mapping
我先说明 我不是在重复制造轮子,我只是想把事情做得更加简单些,先说说我为什么要作这个MYmapping因为
我们公司是做erp的 用的是jdk1.3 还有ejb 框架特老 开发起来特麻烦 每次写jdbc的get set的时候 都要写很多
也许有的朋友会问 为什么不用hibernate ,因为hibernate支持jdk1.3不太好 而且 里面有很多东西感觉都是多余的,出了异常也不知到从何入手,而且配置还不是很熟悉,而且我们大头坚持他的框架可以做任何事情。。。
所以我萌发了这样的念头这个版本的MYMapping已经是2.0版本的了 要比以前配置更加简单 ,更加灵活,我已经用它做到项目里去了,运行非常稳定,所以想把它发上来 让大家看看,我只是一个技术很一般很一般的程序员,只是我比较有想法,有耐心,希望大家不要说我写的东西很烂。。。因为我知道写的的确很烂,所以才发上来 让大家帮忙看看有什么可以改进的地方,我想把它做得更有扩展性,更有可读性,更有效率。
希望大家积极给我发信息。。。

我的这个MYmpping是配合spring一起做得 所以有些你们需要配置下,我想干过一年的程序员都会很快的跑起来。
说明文文件在 doc目录下。
==============================我也有分割线==============================
先说下结构
config这个包包 是专门用来配置的

core 这个包是mapping的核心
里面的db是反射数据库的,mapping是用来缓存影射关系的

//这个方法就是核心中的核心 作查询反射数据库字段用的,我只写了项目里用的大多数字段,如果还有缺的话自己加上
private  void selectObj(Property p,Object obj)throws Exception
	{
		try
		{
//获取方法名称setXxxx()。。。然后获取类型,然后根据类型塞入模型中
			String fangfa = "set" + p.getName().substring(0, 1).toUpperCase() + p.getName().substring(1); 
			String type = p.getType();
			Method setMonth = null;
			if (type.equals("int")) 
			{ 
				
				setMonth = obj.getClass().getMethod(fangfa,new Class[]{Integer.TYPE});
				Integer ret = new Integer(rs.getInt(p.getColumn()));
				setMonth.invoke(obj, new Integer[]{ret}); 
				
			}
			else if (type.equals("double")) 
			{
				setMonth = obj.getClass().getMethod(fangfa,new Class[]{Double.TYPE});
				Double ret = new Double(rs.getDouble(p.getColumn()));
				setMonth.invoke(obj, new Double[]{ret}); 
				
			}
			else if (type.equals("float")) 
			{
				setMonth = obj.getClass().getMethod(fangfa,new Class[]{Float.TYPE});
				Float ret = new Float(rs.getFloat(p.getColumn()));
				setMonth.invoke(obj, new Float[] {ret}); 
				
			} 
			else if(type.equals("java.sql.Timestamp"))
			{
				setMonth = obj.getClass().getMethod(fangfa,new Class[]{Class.forName(type)});
				Timestamp ret = rs.getTimestamp(p.getColumn());
				
				Timestamp[] t = {ret};
				setMonth.invoke(obj, t);
				
			}
			else if(type.equals("java.sql.Date"))
			{
				setMonth = obj.getClass().getMethod(fangfa,new Class[]{Class.forName(type)});
				Date ret = rs.getDate(p.getColumn());
				Date[] t = {ret};
				setMonth.invoke(obj, t); 
				
			}
			else if(type.equals("blob"))
			{
				setMonth = obj.getClass().getMethod(fangfa,new Class[]{String.class});
				String ret = getBlob(rs,p.getColumn());
				String[] t = {ret};
				setMonth.invoke(obj, t); 
				
			}
			else if(type.equals("java.lang.Object"))
			{
				String objClass = p.getRelation().getClasses();
				setMonth = obj.getClass().getMethod(fangfa,new Class[]{Class.forName(objClass)});
				Object ret = this.onetoone(p.getRelation(),p);
				Object[] t = {ret};
				setMonth.invoke(obj, t); 
				
			}
			else if(type.equals("java.util.ArrayList"))
			{
				
				String related = Util.replace(p.getRelated(),"-","");
				Object[] rs = {p.getRelation(),p};
				Method setMethod = this.getClass().getMethod(related,new Class[]{Relation.class,Property.class});
				Object ret = setMethod.invoke(this, rs);
				
				
			}
			else
			{
				setMonth = obj.getClass().getMethod(fangfa,new Class[]{Class.forName(type)});
				Object ret = rs.getObject(p.getColumn());
				
				Object[] t = {ret};
				setMonth.invoke(obj, t); 
				
			}
		}
		catch(Exception e)
		{
			int f= 4;
			log.error("selectObj failed", e);
			throw new Exception("数据库反射错�"+e);
		}
	}
   发表时间:2009-04-16  

很好很强大,2.0版中竟然还会出现 MingyaTemplaet这样的类名。

 

看到这里终于明白为什么 yuan 同学要批判“山寨”框架的三宗罪了,LZ写这个框架之前真的理解了Hibernate的精髓了吗,突然想起很多面试官喜欢问的一个问题:Hibernate和iBatis最大的区别是什么?

0 请登录后投票
   发表时间:2009-04-16   最后修改:2009-04-16
这个东西前几天不是刚被拖到海版曝光过么? 又来?? 果然有性格...
0 请登录后投票
   发表时间:2009-04-16  
随处可见这样的异常处理:
		try
		{
			
                   //do something
		
		} catch (Exception e) {
			throw new Exception();
		}


倒是可以做个反面教材~~
10 请登录后投票
   发表时间:2009-04-16  
我不知道hibernate和ibatas有啥区别 知道区别有啥用阿 我问你 你做项目 能用到区别阿
0 请登录后投票
   发表时间:2009-04-16  
不是说封号了
怎么又放出来了
0 请登录后投票
   发表时间:2009-04-16  
fcoffee 写道
这个东西前几天不是刚被拖到海版曝光过么? 又来?? 果然有性格...

大哥,那个是管理员的问题,我同事也用了我的mapping他顶我,所以被管理员封了,他并不是托,你可以用下不好就给我意见,反正我坚持到底。。。
0 请登录后投票
   发表时间:2009-04-16  
erbin 写道
我不知道hibernate和ibatas有啥区别 知道区别有啥用阿 我问你 你做项目 能用到区别阿

我不知道有啥区别,直到有啥用阿,项目里能用上阿,想知道 上google阿
hibernate 与 ibatis 的区别,
hibernate 与 ibatis 都是目前最流行的 O/R mapping 框架

hibernate 它出身于 sf.net 现在已经是 JBoss 的一部分了

ibatis 它属于 apache 下的一个子项目

hibernate 它是全封闭式的,对数据库的操作提供了完整封装,所有的SQL都是自动生成和执行,开发人员不需要再关注底层的建设,甚至不需要开发人员对SQL的熟练掌握,所有操作都是java对象,而更注重业务逻辑,开发人员只需定义好POJO与数据库的映射(*.hbm.xml),在对数据操作时只需调用hibernate 提供的方法完成数据层的操作,hibernate/OJB 会根据制定的存储逻辑,自动生成相应的SQL并调用JDBC接口完成执行

ibatis 它是半封闭式的,何为半封闭式,这相对hibernate 对比,ibatis的着力点则在于POJO与SQL之间的映射关系,所有的SQL都需要开发人员在映射文件编写,通过这个映射文件的配置,将SQL所需要的参数传入进去和返回的结果字段映射到指定的POJO,而且ibatis最好的一个亮点在于可以操作存储过程。

二者的对比:
1.  iBATIS非常简单易学,Hibernate相对较复杂,门槛较高。
2.  二者都是比较优秀的开源产品
3.  当系统属于二次开发,无法对数据库结构做到控制和修改,那iBATIS的灵活性将比Hibernate更适合
4.  系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。在这种情况下iBATIS会有更好的可控性和表现。
5.  iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比Hibernate要大很多。类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。
6.  以数据库字段一一对应映射得到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化的,不像Hibernate映射的PO是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。
7.  Hibernate现在已经是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于iBATIS
8.  最关键的一句话是iBATIS的作者说的:
If you are starting a new project and you're in full control of your object model and database design, Hibernate is a good choice of O/R tool.
If you are accessing any 3rd party databases (e.g. vendor supplied), or you're working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That's were an SQL Mapper comes in handy.
0 请登录后投票
   发表时间:2009-04-16  
insiku 写道
不是说封号了
怎么又放出来了

他封我了,我又注册一个号,我又没有什么恶意,无所谓了封就封把 我坚持到底 身正不怕影子斜,
我就做了这个工具,你们要是真是高手的话就告诉我 我写的那里还有改进的地方,帮助我一下。
9 请登录后投票
   发表时间:2009-04-16  
大哥们,高手们,你们别天天老是吹。。。。
有能耐就给点有实际意义的建议,我不行,我不才,至少我做了,javaeye封我号怎么了,我继续,我坚持,做人就要做事就要尽心尽力才对
9 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics