论坛首页 Java企业应用论坛

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

浏览 4887 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-07-13   最后修改:2009-07-13
大家好,好久没有在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();
最后这么使用就可以了。。。。
以前太过轻狂,望大家见谅,希望大家牺牲下宝贵时间点评下,为我国山寨事业献上一份力量。
谢谢。
   发表时间:2009-07-14  
不知道是不是IBATIS的优化?
0 请登录后投票
   发表时间:2009-07-24  
恩 下来看了下 简单配置了下能跑起来 总体来说 还算可以 在山寨界还算过得去,我也一直在找框架呢 我们公司用不了高版本的jdk 所以楼主写的框架 很实用,很适合我们公司的开发 我打算收藏了 呵呵 希望楼主再接再厉,更上一层楼。。。
0 请登录后投票
   发表时间:2009-07-27  
下载看了看,还不错,用起来比H简单了。
0 请登录后投票
   发表时间:2009-07-27  
正在看,看的出来LZ很用心。希望LZ再接再厉。
0 请登录后投票
   发表时间:2009-07-28  
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?
0 请登录后投票
   发表时间:2009-07-28  
erbin 写道
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?

日,考虑过几天把我的orm框架也发出来。
0 请登录后投票
   发表时间:2009-07-28  
kimmking 写道
erbin 写道
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?

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


发出来吧 共享一下 我也参考下你的orm 这样才有进步么 O(∩_∩)O~
0 请登录后投票
   发表时间:2009-07-28  
楼主继续加油 我下载下来先研究研究 能否留个联系方式 方便以后讨论哈
0 请登录后投票
   发表时间:2009-08-03  
erbin 写道
谢谢大家 可是有没有人发现什么问题呢,比如事务处理那个模块应该怎么写呢?

lz可以试着做一个事务引擎,用一个事务列表,里面存放者事务回滚的方法和模拟时钟,当当前的程序抛出异常的时候就找最近的一个时钟然后回滚,不知道这样是否可行。
0 请登录后投票
论坛首页 Java企业应用版

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