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

作者介绍了悍马ORM框架2.1的新特性,包括借鉴ibatis的engine部分、简化配置文件、增加自由SQL及事务处理功能,并分享了核心实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,好久没有在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();
最后这么使用就可以了。。。。
以前太过轻狂,望大家见谅,希望大家牺牲下宝贵时间点评下,为我国山寨事业献上一份力量。
谢谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值