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

hummer_2.1(悍马)版java开发框架有or/mapping和事务处理

阅读更多
大家好,好久没有在javaeye上发贴了,我又回来了,回来的感觉真好O(∩_∩)O~,其实我就是消失了好几个月的不差托的作者,经过大家对我原来的mymapping的批评后我又潜心研究,总于发了这一版hummer2.1之所以取名为悍马,是因为本人比较喜欢悍马的车,牛逼什么路都能开,所以我也希望我写的这个框架使用自由,没有什么限制,多了不说了都是废话,下面我说说我的改进。
1:我参考了ibatis的源码把它里面的engine部分抄袭过来感觉真TM好用。
2:还是用我原来写mapping的思想,core没有太大的变化但是比以前更加简洁了。
3:配置文件比以前更加简单,一对一 多对多更加让人容易理解。
4:增加了自由sql功能,可以任意写sql,用起来更加方便。
5:增加了事务处理功能,不知道这样写对不对,我感觉有点问题,所以请大牛们浪费点你们宝贵的时间帮我看看我写的事务处理那块对不对。
6:这次我是怀着一颗感恩的心来的,感谢那些曾在我迷茫之中贬低我的人,您们才是真正的活菩萨,逆境菩萨谢谢你们,还有曾经帮助过我的人,谢谢你们。

具体配置文件请看里面的readme文件。
db目录是sql创建表的语句。

==============================================================
上回没有说出我的思想这回我详细的说下吧,
其实ormapping主要用到的就是java的反射机制,还有动态创建对象的机制,我是以配置文件的字段中property为基准的,来影射数据库中的表的字段,所以没有在配置文件中写明字段类型。
大家再看看relation包下的Onetoone,onetomany,manytomany,selecttowhere这几个类,顾名思义就是对象的关联关系,里面有个exec这个方法,委托到Select类进行执行sql查询语句。Select select,Property p这2个参数第一个一会会提到,第二个是属性这个关联关系对应的对象的属性信息。
再看下Select这个类,这个类主要是用来执行sql语句的,看下这个方法:
public Object Action(PreparedStatement ps) throws Exception {
		try
		{
			this.ps = ps;
			this.rs = this.ps.executeQuery();
			if(rs.next())
			{
				for(int i=0;i<all.size();i++){
					Property p = (Property)all.get(i);
					java.lang.Class t =p.getType();
					Object value = null;
					if(p.getRelation()!=null)
					{
						Relation r = p.getRelation();
						r.exec(this,p);
					}
					else
					{
						TypeHandler hander = this.typeFactory.getTypeHandler(t);
						value = hander.getResult(rs, p.getColumn());
						String fangfa = "set" + p.getProperty().substring(0, 1).toUpperCase() + p.getProperty().substring(1); 
						Method setMonth = myself.getClass().getMethod(fangfa,new Class[]{p.getType()});
						setMonth.invoke(myself, new Object[]{value}); 
					}
					
				}
			    return myself;
			}else return null;
		}
		catch(Exception e)
		{
			int f= 3;
			log.error("select Object failed", e);
			throw new Exception();
		}
	}



我想大家应该明白了吧,循环所有需要映射的属性,然后根据每个属性的类型,取得TypeHandler 每个类型都有对性的handler,里面有相应的set,get方法大家可以看下,这个不是我写的是ibatis的,我把它拿来用还真是好用啊,O(∩_∩)O~。
Relation r = p.getRelation();这个是如果这个属性有对应关系的话就调用r.exec(this,p);就是刚才的Onetoone,onetomany,manytomany,selecttowhere类中的一个,基本的核心就是这么多,如果大家有什么意见或者更好的建议的话要给我哦。

事务处理:这块我还是没有太明白,机制就是用的java的动态代理机制,jta事务到底能不能这么用我还没有测试过,只知道jdbc的没有问题我用了一个TransactionManager来管理事务setTransaction这个方法是设置事务用的如是 是jdbc就实例化JdbcTransaction如果是jta就实例化JtaTransaction,在这2个事务类里有个init这个方法是用于保存数据源的
jdbc的我用的是BasicDataSource,jta我用的是javax.sql.DataSource,把数据源缓存到DataBase类里,然后在begin的时候
public void beginTransaction()throws SQLException, TransactionException {
		
		    if (connection == null) {
		    	connection = DataBase.getConnection();
		    }
		   
		    // AutoCommit
		    if (connection.getAutoCommit()) {
		      connection.setAutoCommit(false);
		    }
	  }

在取出来 这样不知道可以不,请指点下。
这个就是我写的事务处理的代理类:
public class ServiceProxy implements MethodInterceptor{
	 private static final Log log = LogFactory.getLog(ServiceProxy.class);
     private Object service=null;
     private Enhancer enhancer=new Enhancer();


	//返回DAO的子类
     public Object getService(Class clz) throws  TransactionException
     {
         enhancer.setSuperclass(clz);
         enhancer.setCallback(this);
         service = enhancer.create();
         return service;
     }      

	public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable,TransactionException {
		log.info("调用日志方法"+method.getName());
		try {
		TransactionManager.begin();
		Object result = proxy.invokeSuper(obj, args);
		TransactionManager.commit();
		return result;
		}catch (Exception e) {
			TransactionManager.rollback();
			throw new TransactionException(method.getName()+"has error transaction rollback");
		} finally{   
            try {   
            	TransactionManager.end();
            } catch (Exception e) {   
                log.error(e.getMessage());   
                throw new Throwable("关闭conn时出错!");   
            }   
        }   

	}

}

用的是cglib这个包,不知道这么写事务可不可以,这里是我最头疼的地方,指点下吧。
ServiceProxy proxy = new ServiceProxy();
MyTest my = (MyTest)proxy.getService(MyTest.class);
    my.testReflect();
最后这么使用就可以了。。。。
以前太过轻狂,望大家见谅,希望大家牺牲下宝贵时间点评下,为我国山寨事业献上一份力量。
谢谢。
分享到:
评论
11 楼 santafeng 2009-12-23  
做了几年系统,很久没有上网回帖子,对于lz的热诚是支持,做项目无非就是增删查改另外加个分页,至于数据库设计要按照范式做,然后优化加入冗余设计,表分区,索引,数据库缓存等,另外就是外层网络机器的规划了。
以前很少使用spring,hibernate
近期需要用上或许需要在原框架基础上修改支持spring
我们的框架是自己使用方便适合快速构建工程开发的元数据表对象映射内置分页,支持目前行业多种数据库
或许对与lz的开发框架有所参考。
http://sourceforge.net/projects/speedframework/
10 楼 erbin 2009-08-04  
198642yaya 写道
erbin 写道
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?

lz可以试着做一个事务引擎,用一个事务列表,里面存放者事务回滚的方法和模拟时钟,当当前的程序抛出异常的时候就找最近的一个时钟然后回滚,不知道这样是否可行。


事务引擎?这个到没有接触过,可以试下,不过要是多数据库连接怎么办呢?如果在一个业务逻辑里存在多个数据库连接,那我怎么回滚啊 ?
9 楼 198642yaya 2009-08-03  
erbin 写道
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?

lz可以试着做一个事务引擎,用一个事务列表,里面存放者事务回滚的方法和模拟时钟,当当前的程序抛出异常的时候就找最近的一个时钟然后回滚,不知道这样是否可行。
8 楼 pansonphy 2009-07-28  
楼主继续加油 我下载下来先研究研究 能否留个联系方式 方便以后讨论哈
7 楼 erbin 2009-07-28  
kimmking 写道
erbin 写道
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?

日,考虑过几天把我的orm框架也发出来。


发出来吧 共享一下 我也参考下你的orm 这样才有进步么 O(∩_∩)O~
6 楼 kimmking 2009-07-28  
erbin 写道
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?

日,考虑过几天把我的orm框架也发出来。
5 楼 erbin 2009-07-28  
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?
4 楼 doyc 2009-07-27  
正在看,看的出来LZ很用心。希望LZ再接再厉。
3 楼 torycatkin 2009-07-27  
下载看了看,还不错,用起来比H简单了。
2 楼 198642yaya 2009-07-24  
恩 下来看了下 简单配置了下能跑起来 总体来说 还算可以 在山寨界还算过得去,我也一直在找框架呢 我们公司用不了高版本的jdk 所以楼主写的框架 很实用,很适合我们公司的开发 我打算收藏了 呵呵 希望楼主再接再厉,更上一层楼。。。
1 楼 8210 2009-07-14  
不知道是不是IBATIS的优化?

相关推荐

    Hummer 是一套高性能高可用的跨端开发框架,一套代码可以同时支持开发 Android 和 iOS 应用

    Hummer 是一套高性能高可用的跨端开发框架,一套代码可以同时支持开发 Android 和 iOS 应用。现已经支持 Vue/React/TypeScript/JavaScript 四种语法,面向大前端开发人员,总有一款适合你。

    java8源码-hummer-android:悍马-android

    java8 源码 Hummer 1. 环境搭建 1.1. 准备所需工具 JDK NDK Android SDK Android Studio 搭建开发环境 上述工具无需我们一一下载,Google已将所需工具集成好了,可到安卓官网下载,,需要科学上网。下载下来Android ...

    悍马hummer纸模型

    田宫纸模中悍马M242模型,可打印自己制作。建议用A3的纸哦,彩打效果很好!

    hummer-standard-benchmarks

    此项目是一个用于测试各家跨端开发框架 App 各项 benchmark 数据指标的一个示例工程集合,包括了基于五种不同的跨端开发框架开发的示例 APP 工程项目(Native、Hummer、Tenon、ReactNative 和 Flutter),每个项目都...

    论文研究 - 简化悍马法合成高产氧化石墨烯的表征

    使用傅里叶变换红外光谱(FTIR),能量色散X射线光谱(EDX),场发射扫描电子显微镜(FE-SEM),拉曼光谱和紫外可见光谱对这两个GO进行了表征。 FTIR光谱显示,在6天合成的GO中,氧在两个GO中都具有较高的氧化度,...

    悍马汽车3D模型

    【悍马汽车3D模型】是一种专业用于设计和可视化项目的数字资源,主要针对悍马这一著名品牌的汽车。3D模型是计算机图形学中的一个重要概念,它通过数学算法在三维空间中构建物体的几何形状,包括其外观、尺寸和结构。...

    悍马

    Hummer是一套高性能,高可用的跨端开发框架,可以同时支持开发Android和iOS应用程序。现已经支持Vue / TypeScript / JavaScript某种语法,面向大型前端开发人员,总有一套适合您。 技术优势 正如Hummer(蜂鸟)的...

    MyBatis3 教程 中文版

    MyBatis3 是由Mike Hummer开发的一款轻量级的ORM(对象关系映射)框架,它的出现是为了弥补传统JDBC的繁琐和低效。通过MyBatis,你可以直接编写SQL语句,实现灵活的数据查询,同时避免了手动处理结果集的麻烦。 二...

    hummer-component-template:组件模板工程

    2. **组件化开发**:组件是Hummer框架的核心,组件模板帮助开发者遵循组件化原则,实现代码的复用和模块化,提高开发效率。 3. **Webpack**:Webpack是前端资源管理和打包工具,它将不同类型的源文件(如JavaScript...

    HUMMER'S制备法

    用于制造新型导电材料石墨烯的方法,未来能源的革命

    扒下来的MyBatis网站.rar

    MyBatis 是一款深受开发者喜爱的持久层框架,它简化了Java开发中数据库操作的复杂性,通过将SQL语句与Java代码分离,实现了数据访问的灵活和高效。这款开源框架由Mike Hummer创建,目前在Apache Software Foundation...

    Java设计模式之模板方法模式.docx

    模板方法模式是一种行为设计模式,它允许在抽象类中定义算法框架,而将具体步骤的实现推迟到子类中。这种模式通常用于那些算法的骨架已经固定,但部分步骤可以根据具体环境有所不同的情况。 在Java中,模板方法模式...

    HUMmer-开源

    Historic Urban Modeler(HUMmer)是功能齐全的CAD程序,以前称为HOK,Inc.开发的drawVision。此3D多边形建模器可导出VRML,X3D,X3Dv和COLLADA文件。

    hammer的手势开发

    移动端手势开发,滑动及触屏等效果使用,源代码

    tenon-loader

    切换编译器的包为Tenon Compiler备注:由于Tenon中样式逻辑需要特殊处理,并需要css的样式解析下沉到Tenon Loader中,针对较少的或scss样式处理等,不需要再进行css-loader和style-loader,建议直接使用进行开发。...

    汽车标志大全(图解版).doc

    悍马(Hummer),是通用汽车公司的一家子公司,主要制造 SUV 和军用车。悍马的标志是一个H形状的商标,象征着力量和力量。 本资源提供了一个详细的汽车标志大全,涵盖了十六个知名汽车品牌的标志信息。这对于汽车...

    F2-gcanvas-wrapper:将 antvf2 适配到 weex 和 GCanvas ,使用 weex 开发网页端的请自行判断 platform

    将 antv/f2 适配到 weex 和 GCanvas ,使用 weex 开发网页端的请自行判断 platform 。 weex 可以在获取到的组件引用 ref 上使用 addEvent api 监听事件,而 f2 传过来的 source 是经过 GCanvas 和 f2 加工过的 ...

    腾讯需求文档(模板)

    - **需求文档命名规范**:参考《Hummer产品需求规格说明书命名范例》,确保文档命名的一致性和规范性。 #### 五、总结 腾讯需求文档模板提供了一个结构化的框架,帮助项目团队有效地管理和记录需求信息。通过遵循...

    化学分散法制备石墨烯及结构表征

    #### 1.1 Hummer法氧化天然鳞片石墨 - **定义**:Humm法是一种常用的氧化石墨的方法,通过这种方法可以有效地将石墨转化为氧化石墨。 - **过程**:首先,使用硫酸和硝酸的混合物作为氧化剂,加入高锰酸钾作为氧化剂...

Global site tag (gtag.js) - Google Analytics