`
erbin
  • 浏览: 4366 次
  • 性别: 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>

相关推荐

    简单的OR-Mapping 工具---不差托作者

    标题中的“简单的OR-Mapping工具---不差托作者”指的是一个关于对象关系映射(Object-Relational Mapping,简称ORM)的简易工具,由作者“不差托”开发。ORM是一种编程技术,它允许程序员使用面向对象的方式操作...

    SANGFOR_NGAF_6.8_DNS-Mapping配置指导.pdf

    SANGFOR NGAF 6.8 DNS-Mapping 配置指导 SANGFOR NGAF 6.8 DNS-Mapping 配置指导是深信服公司发布的一份关于 NGAF 6.8 version 的 DNS-Mapping 配置指南。下面是从该指导中总结的重要知识点: 1. 文档说明:文档...

    hibernate-mapping-3.0.dtd

    hibernate-mapping-3.0.dtd 配置后,就会在xml中进行提示

    hib-mapping-3.0.dtd

    hibernate-mapping-3.0.dtd hibernate-mapping-3.0.dtd hibernate-mapping-3.0.dtd hibernate-mapping-3.0.dtd hibernate-mapping-3.0.dtd hibernate-mapping-3.0.dtd hibernate-mapping-3.0.dtd hibernate-mapping-...

    hibernate-mapping参数详解

    在深入探讨`hibernate-mapping`参数之前,我们先理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库。`hibernate-mapping`是Hibernate配置...

    Hibernate 离线的配置方法(hibernate-mapping-3.0.dtd)

    因为Hibernate在读出hbm.xml文件时需要通过网络读取到hibernate-mapping-3.0.dtd 文件。 如果没有网络不能正常工作。 所以提供上述文件。 以及hibernate-mapping-3.0.dtd,hibernate-configuration-3.0.dtd提供下载...

    xml里filter-mapping中的dispatcher的使

    ### XML中的filter-mapping与dispatcher使用详解 在Java Web开发中,过滤器(Filter)是十分重要的组件之一,主要用于处理客户端请求或响应服务器反馈时的数据处理任务,如编码转换、登录验证、敏感词过滤等。而在...

    react-data-mapping:一个React组件,专注于Data-Mapping和Table-Field-Mapping。

    npm install react-data-mapping API : 数据映射属性 参数 说明 类型 默认值 宽度 组件宽度 数字 默认500,自适应的话可以设置“ auto” 高度 组件高度 数字 默认500,自适应的话可以设置“ auto” 类型 映射类型 ...

    超级注意复杂整合环境中的Filter-Mapping的顺序--配置单点登陆及UrlRewrite有感

    这篇博客“超级注意复杂整合环境中的Filter-Mapping的顺序--配置单点登陆及UrlRewrite有感”深入探讨了如何在这样的环境中正确配置Filter和Mapping,以实现单点登录(Single Sign-On, SSO)以及URL重写。下面我们将...

    matlab-mapping toolbox-提取自r2019b

    同时,工具箱还提供了丰富的示例代码和教程,帮助初学者快速上手。 总结,MATLAB Mapping Toolbox是MATLAB在地理空间领域的重要扩展,它为科研人员和工程师提供了强大的地图处理和分析能力。在R2019b版本中,正确...

    Indoor-Mapping-Using-the-VLC-Channel-State-Information-master源码

    标题 "Indoor-Mapping-Using-the-VLC-Channel-State-Information-master源码" 提供的信息表明,这是一个关于室内定位技术的项目,它利用了Visible Light Communication (VLC)的信道状态信息。VLC是一种利用可见光...

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    《深入理解Hibernate配置与映射:hibernate-configuration-3.0.dtd与hibernate-mapping-3.0.dtd解析》 在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而`hibernate-...

    T1-Mapping中文版..pptx

    T1-Mapping 的测量方法有多种,常见的方法有IR序列、Look-Locker序列、MOLLI序列、ShMOLLI序列和SASHA方法。每种方法都有其特点和优缺点。 IR序列是一种经典的T1-Mapping测量方法,但其信号强度恢复曲线较慢,需要...

    3D-Mapping-在CPU上实现的实时Volumetric-3D-Mapping-附项目源码-优质项目分享.zip

    在Volumetric-3D映射中,我们关注的是“体积”,即对三维空间内部的每一个点进行处理,构建出一个连续的、有密度的体数据。这种技术通常用于创建逼真的烟雾、火焰、云层等动态效果。 CPU实现的实时3D映射面临的主要...

    advanced-mapping-tool:Dataninja 的另一个高级映射工具

    高级映射工具 Dataninja 的一个非常先进的映射工具,基于 、 和更多库对增强。 安装 正常使用 git clone https://github.com/Dataninja/advanced-mapping-tool.git # or download ...

Global site tag (gtag.js) - Google Analytics