`
erbin
  • 浏览: 4457 次
  • 性别: 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);
		}
	}
分享到:
评论
9 楼 erbin 2009-04-16  
大哥们,高手们,你们别天天老是吹。。。。
有能耐就给点有实际意义的建议,我不行,我不才,至少我做了,javaeye封我号怎么了,我继续,我坚持,做人就要做事就要尽心尽力才对
8 楼 erbin 2009-04-16  
insiku 写道
不是说封号了
怎么又放出来了

他封我了,我又注册一个号,我又没有什么恶意,无所谓了封就封把 我坚持到底 身正不怕影子斜,
我就做了这个工具,你们要是真是高手的话就告诉我 我写的那里还有改进的地方,帮助我一下。
7 楼 erbin 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.
6 楼 erbin 2009-04-16  
fcoffee 写道
这个东西前几天不是刚被拖到海版曝光过么? 又来?? 果然有性格...

大哥,那个是管理员的问题,我同事也用了我的mapping他顶我,所以被管理员封了,他并不是托,你可以用下不好就给我意见,反正我坚持到底。。。
5 楼 insiku 2009-04-16  
不是说封号了
怎么又放出来了
4 楼 erbin 2009-04-16  
我不知道hibernate和ibatas有啥区别 知道区别有啥用阿 我问你 你做项目 能用到区别阿
3 楼 fcoffee 2009-04-16  
随处可见这样的异常处理:
		try
		{
			
                   //do something
		
		} catch (Exception e) {
			throw new Exception();
		}


倒是可以做个反面教材~~
2 楼 fcoffee 2009-04-16  
这个东西前几天不是刚被拖到海版曝光过么? 又来?? 果然有性格...
1 楼 wendong007 2009-04-16  
<p>很好很强大,2.0版中竟然还会出现 MingyaTemplaet这样的类名。</p>
<p> </p>
<p>看到这里终于明白为什么 <span style="">yuan </span><span style="">同学要批判“山寨”框架的三宗罪了,LZ写这个框架之前真的理解了Hibernate的精髓了吗,突然想起很多面试官喜欢问的一个问题:Hibernate和iBatis最大的区别是什么?</span></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