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();}}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时出错!"); } } }}