`
erbin
  • 浏览: 4398 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多
我相信有很多人像我一样不喜欢用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);
		}
	}
分享到:
评论
29 楼 leexhwhy 2009-04-16  
只看你的变量命名方式,就知道代码质量好不了
28 楼 sun2009 2009-04-16  
楼主有个性很好,你的代码我在看呢,但我建议你去看看hibernate和ibatis源码,相信你可以学到不少,也可以很好的改善你这个MYmapping
27 楼 mlxy 2009-04-16  
楼主精神可嘉,我相信在写这个工具的同时也学到了不少东西,楼主的脾气虽然有点浮躁,情绪有点激动,我想这个和有些孤芳自赏或者自以为是的或者总是拿着一心挑别人毛病的人的回复有关,别一看到有一点低级的代码就感到厌恶,给成长中的兄弟一条活路,谢谢。
26 楼 Ashela 2009-04-16  
erbin 写道
我一会就把我的核心思想讲出来 我现在在单位上班呢 不能分心 工作要尽心,请大家见谅我没有把东西讲明白。。

呵呵,LZ勇气可嘉,这点挺让人佩服的,能再虚心点就好了
25 楼 erbin 2009-04-16  
我一会就把我的核心思想讲出来 我现在在单位上班呢 不能分心 工作要尽心,请大家见谅我没有把东西讲明白。。
24 楼 erbin 2009-04-16  
Ashela 写道
erbin 写道
hallenzzz 写道
erbin 写道
大哥们,高手们,你们别天天老是吹。。。。
有能耐就给点有实际意义的建议,我不行,我不才,至少我做了,javaeye封我号怎么了,我继续,我坚持,做人就要做事就要尽心尽力才对


楼主做的没有错。
如果你的程序在你的项目中提供了客户所需要的功能,而且提供了足够的生产力,你的开发就是成功的,最适合的东西才是最好的,不是么?Tapestry的开发者不是也放弃了spring么?客户怎么会管你用得是不是Hibernate?
想想我们国内的开源项目要么无人问津,要么被无数国内的高手们骂得狗血喷头(而且都是拿国外的产品做比较,从来不是他们自己开发的东西),如果你抱怨某些经典的产品不好使,他们只会告诉你:“是你自己不会用”,或者嘲笑你,很少有人会站你的立场或者帮你思考解决方案的。
我能理解你想创新的想法,但是你在这里恐怕很难得到帮助。如果你真的想提高,可以尝试加入国外新兴的一些开源ORM产品的社区,或许能找到一些志同道合的朋友,而且那里有很多是中国人。
祝你好运!加油哦。



555555555555555555555。。。。感动中。。。
谢谢 你的一番话 讲出了我内心想说的虽然我不知道该怎么表达,我会继续努力的,可能我不会在弄这个mapping工具 或者我以后不会在it这个行业了,但是我永远会坚持到底,努力,在努力,永不服输。。。

被那无数个5雷到了
这么情绪化的程序员是很难有进步的


5就是有点夸张 实际上我并没有那么大的情绪 谁说情绪大的程序员没有发展了 hibernate的作者 脾气暴躁 不是也很牛B么
23 楼 Ashela 2009-04-16  
erbin 写道
hallenzzz 写道
erbin 写道
大哥们,高手们,你们别天天老是吹。。。。
有能耐就给点有实际意义的建议,我不行,我不才,至少我做了,javaeye封我号怎么了,我继续,我坚持,做人就要做事就要尽心尽力才对


楼主做的没有错。
如果你的程序在你的项目中提供了客户所需要的功能,而且提供了足够的生产力,你的开发就是成功的,最适合的东西才是最好的,不是么?Tapestry的开发者不是也放弃了spring么?客户怎么会管你用得是不是Hibernate?
想想我们国内的开源项目要么无人问津,要么被无数国内的高手们骂得狗血喷头(而且都是拿国外的产品做比较,从来不是他们自己开发的东西),如果你抱怨某些经典的产品不好使,他们只会告诉你:“是你自己不会用”,或者嘲笑你,很少有人会站你的立场或者帮你思考解决方案的。
我能理解你想创新的想法,但是你在这里恐怕很难得到帮助。如果你真的想提高,可以尝试加入国外新兴的一些开源ORM产品的社区,或许能找到一些志同道合的朋友,而且那里有很多是中国人。
祝你好运!加油哦。



555555555555555555555。。。。感动中。。。
谢谢 你的一番话 讲出了我内心想说的虽然我不知道该怎么表达,我会继续努力的,可能我不会在弄这个mapping工具 或者我以后不会在it这个行业了,但是我永远会坚持到底,努力,在努力,永不服输。。。

被那无数个5雷到了
这么情绪化的程序员是很难有进步的
22 楼 jansel 2009-04-16  
既然是代码讲解,就把其中的设计思路和核心的代码拿出来给大家讲解一下,而不是让大家自行下载下来去看去研究。

21 楼 erbin 2009-04-16  
flyfan 写道
javaeye封过你的号?是因为发这个帖子还是什么原因?有勇气是好,不过别人指出的不足你要敢于承认才会更好



谁指出我的不足了 谁指出 我的代码那里写的有问题了 光说我写的不好有什么用啊
我那知道我那里写的不好,你去看医生 医生告诉你 你有病 你说对我有病 怎么治啊
医生还是说你有病 你说怎么治 医生还是说你有病 。。。。
20 楼 flyfan 2009-04-16  
javaeye封过你的号?是因为发这个帖子还是什么原因?有勇气是好,不过别人指出的不足你要敢于承认才会更好
19 楼 erbin 2009-04-16  
cats_tiger 写道
不是大家抨击你或者有什么偏见,你这确实烂。你让人家拿一个mapping出来,JE的人能写一个ROM的多的是,大家不写,是因为没有人能做出超越Hibernate和Ibatis的,即便做了也不过是又一个轮子。
建议你看一些优秀的源代码,恶补一下OO,然后再反过来重新审视你这个框架。青蛙只有从井里面跳出来才知道天有多大。


我就是青蛙了 我就是井底了 你有能耐你现在给我拿出来一个mapping出来 你自己写的 大哥我就服你以后我不再上javaeye发帖子 你现在给我拿出来一个,你有能耐给我造个轮子出来啊 牛啊
还有 我没有造轮子阿 我们架构师不让我们用jdk 1.4以上的版本阿 我们只能用jdk1.3的 你用hibernate给我在jdk1.3上跑一个 你给我配置一个 我这个工具用在项目里了 很成功 而且是军方的项目 还有 保险行业的项目
怎么了 别老 OO OO的 你牛 你自己开发个操作系统 跟比尔盖茨 比比阿 还有你有车有房子么 不也是个打工的么。
就跟我这个井底之蛙 比行 你厉害我真佩服你
18 楼 erbin 2009-04-16  
hallenzzz 写道
erbin 写道
大哥们,高手们,你们别天天老是吹。。。。
有能耐就给点有实际意义的建议,我不行,我不才,至少我做了,javaeye封我号怎么了,我继续,我坚持,做人就要做事就要尽心尽力才对


楼主做的没有错。
如果你的程序在你的项目中提供了客户所需要的功能,而且提供了足够的生产力,你的开发就是成功的,最适合的东西才是最好的,不是么?Tapestry的开发者不是也放弃了spring么?客户怎么会管你用得是不是Hibernate?
想想我们国内的开源项目要么无人问津,要么被无数国内的高手们骂得狗血喷头(而且都是拿国外的产品做比较,从来不是他们自己开发的东西),如果你抱怨某些经典的产品不好使,他们只会告诉你:“是你自己不会用”,或者嘲笑你,很少有人会站你的立场或者帮你思考解决方案的。
我能理解你想创新的想法,但是你在这里恐怕很难得到帮助。如果你真的想提高,可以尝试加入国外新兴的一些开源ORM产品的社区,或许能找到一些志同道合的朋友,而且那里有很多是中国人。
祝你好运!加油哦。



555555555555555555555。。。。感动中。。。
谢谢 你的一番话 讲出了我内心想说的虽然我不知道该怎么表达,我会继续努力的,可能我不会在弄这个mapping工具 或者我以后不会在it这个行业了,但是我永远会坚持到底,努力,在努力,永不服输。。。
17 楼 cats_tiger 2009-04-16  
不是大家抨击你或者有什么偏见,你这确实烂。你让人家拿一个mapping出来,JE的人能写一个ROM的多的是,大家不写,是因为没有人能做出超越Hibernate和Ibatis的,即便做了也不过是又一个轮子。
建议你看一些优秀的源代码,恶补一下OO,然后再反过来重新审视你这个框架。青蛙只有从井里面跳出来才知道天有多大。
16 楼 hallenzzz 2009-04-16  
erbin 写道
大哥们,高手们,你们别天天老是吹。。。。
有能耐就给点有实际意义的建议,我不行,我不才,至少我做了,javaeye封我号怎么了,我继续,我坚持,做人就要做事就要尽心尽力才对


楼主做的没有错。
如果你的程序在你的项目中提供了客户所需要的功能,而且提供了足够的生产力,你的开发就是成功的,最适合的东西才是最好的,不是么?Tapestry的开发者不是也放弃了spring么?客户怎么会管你用得是不是Hibernate?
想想我们国内的开源项目要么无人问津,要么被无数国内的高手们骂得狗血喷头(而且都是拿国外的产品做比较,从来不是他们自己开发的东西),如果你抱怨某些经典的产品不好使,他们只会告诉你:“是你自己不会用”,或者嘲笑你,很少有人会站你的立场或者帮你思考解决方案的。
我能理解你想创新的想法,但是你在这里恐怕很难得到帮助。如果你真的想提高,可以尝试加入国外新兴的一些开源ORM产品的社区,或许能找到一些志同道合的朋友,而且那里有很多是中国人。
祝你好运!加油哦。
15 楼 Ashela 2009-04-16  
LZ,这里有很多人都自己写过orm,其实大家只是想指出你的orm的不足而已
你说的关于ibatis和hibernate的差异大家都很明白,但是我觉得ibatis和hibernate的区别不仅仅是这些表面上的,可能还涉及到所采用的设计方法的差异,hibernate想从面向对象的方法解决问题,ibatis更多的是从关系型数据入手,用哪个更方便要看具体需求的情况而定
14 楼 erbin 2009-04-16  
不要说别人好不好,我性格怎么有问题了,我有问题怎么了,伤害你了,犯法了么?
随便把你们爱怎么说就怎么说,你们谁不服,自己做个mapping出来 比我的好 比我牛比 让我学习学习 借鉴一下 我就不说啥了 不行 就别说啥。。。。
13 楼 erbin 2009-04-16  
我那里有错误了 哪里有错误了
谁说我性格有问题 你敢说你们性格都好,都没有问题
12 楼 oracoo 2009-04-16  
<div class="quote_title">erbin 写道</div>
<div class="quote_div">
<div class="quote_title">wendong007 写道</div>
<div class="quote_div">
<p>很好很强大,2.0版中竟然还会出现 MingyaTemplaet这样的类名。</p>
<p> </p>
<p>看到这里终于明白为什么 <span>yuan </span><span>同学要批判“山寨”框架的三宗罪了,LZ写这个框架之前真的理解了Hibernate的精髓了吗,突然想起很多面试官喜欢问的一个问题:Hibernate和iBatis最大的区别是什么?</span></p>
</div>
<p>我就不会hibernate才写的这个 明白不 大哥,我要明白hibernate我还用写么。<br>MingyaTemplaet类名是我故意写错的 有个性怎么了。。。</p>
</div>
<p>先不说你写的东西, 看的回复别人的话语, 觉得你性格有严重问题.</p>
11 楼 kjj 2009-04-16  
楼主,有了错误就要虚心改正,错了我,还这么硬起,更别说别人指出你的错误了!!
10 楼 erbin 2009-04-16  
<div class="quote_title">wendong007 写道</div>
<div class="quote_div">
<p>很好很强大,2.0版中竟然还会出现 MingyaTemplaet这样的类名。</p>
<p> </p>
<p>看到这里终于明白为什么 <span>yuan </span><span>同学要批判“山寨”框架的三宗罪了,LZ写这个框架之前真的理解了Hibernate的精髓了吗,突然想起很多面试官喜欢问的一个问题:Hibernate和iBatis最大的区别是什么?</span></p>
</div>
<p>我就不会hibernate才写的这个 明白不 大哥,我要明白hibernate我还用写么。<br>MingyaTemplaet类名是我故意写错的 有个性怎么了。。。</p>

相关推荐

    cxf webservce的使用详解

    CXF 提供了一个简单的命令行工具或通过代码来生成WSDL文件。WSDL(Web Services Description Language)是描述Web服务的XML格式,客户端可以使用它来生成相应的调用代码。 例如,你可以通过CXF的WSDL2Java工具将已...

    cxf开发webservice服务端

    【标题】:“CXF开发Web服务端” 在Java世界中,Apache CXF是一个流行的开源框架,用于构建和部署Web服务。...在实践中,理解源码、合理利用工具以及编写测试代码是提升开发效率和保证服务质量的关键。

    springboot+jpa+swagger 动态查询

    Querydsl是一个类型安全的查询语言,它可以与JPA、JDO、Hibernate等持久层技术配合使用,通过代码生成工具,将查询表达式转换为对应的SQL语句。Specification接口则是Spring Data JPA自带的一种动态查询方式,开发者...

    举例讲解Python常用模块

    - **`Counter([iterable-or-mapping[, ...])`**:创建一个计数器,记录每个元素出现的次数。 **示例代码**: ```python from collections import Counter # 创建一个 Counter 对象 c = Counter() # 访问不存在的...

    ibatis 开发指南

    ibatis,作为一款“半自动化”的对象关系映射(Object-Relational Mapping,简称ORM)工具,以其独特的设计理念在众多ORM框架中独树一帜。相较于Hibernate和Apache OJB这类提供全面封装的ORM解决方案,ibatis更倾向...

    django 利用Q对象与F对象进行查询的实现

    在Django中,数据库查询是通过ORM(Object-Relational Mapping)来实现的,它提供了一种用Python代码操作数据库的方式,使得开发者无需直接编写SQL语句。本文将深入讲解Django中利用Q对象和F对象进行复杂查询的实现...

Global site tag (gtag.js) - Google Analytics