大家好,好久没有在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();
最后这么使用就可以了。。。。
以前太过轻狂,望大家见谅,希望大家牺牲下宝贵时间点评下,为我国山寨事业献上一份力量。
谢谢。
分享到:
相关推荐
Hummer 是一套高性能高可用的跨端开发框架,一套代码可以同时支持开发 Android 和 iOS 应用。现已经支持 Vue/React/TypeScript/JavaScript 四种语法,面向大前端开发人员,总有一款适合你。
java8 源码 Hummer 1. 环境搭建 1.1. 准备所需工具 JDK NDK Android SDK Android Studio 搭建开发环境 上述工具无需我们一一下载,Google已将所需工具集成好了,可到安卓官网下载,,需要科学上网。下载下来Android ...
田宫纸模中悍马M242模型,可打印自己制作。建议用A3的纸哦,彩打效果很好!
此项目是一个用于测试各家跨端开发框架 App 各项 benchmark 数据指标的一个示例工程集合,包括了基于五种不同的跨端开发框架开发的示例 APP 工程项目(Native、Hummer、Tenon、ReactNative 和 Flutter),每个项目都...
使用傅里叶变换红外光谱(FTIR),能量色散X射线光谱(EDX),场发射扫描电子显微镜(FE-SEM),拉曼光谱和紫外可见光谱对这两个GO进行了表征。 FTIR光谱显示,在6天合成的GO中,氧在两个GO中都具有较高的氧化度,...
【悍马汽车3D模型】是一种专业用于设计和可视化项目的数字资源,主要针对悍马这一著名品牌的汽车。3D模型是计算机图形学中的一个重要概念,它通过数学算法在三维空间中构建物体的几何形状,包括其外观、尺寸和结构。...
Hummer是一套高性能,高可用的跨端开发框架,可以同时支持开发Android和iOS应用程序。现已经支持Vue / TypeScript / JavaScript某种语法,面向大型前端开发人员,总有一套适合您。 技术优势 正如Hummer(蜂鸟)的...
MyBatis3 是由Mike Hummer开发的一款轻量级的ORM(对象关系映射)框架,它的出现是为了弥补传统JDBC的繁琐和低效。通过MyBatis,你可以直接编写SQL语句,实现灵活的数据查询,同时避免了手动处理结果集的麻烦。 二...
2. **组件化开发**:组件是Hummer框架的核心,组件模板帮助开发者遵循组件化原则,实现代码的复用和模块化,提高开发效率。 3. **Webpack**:Webpack是前端资源管理和打包工具,它将不同类型的源文件(如JavaScript...
用于制造新型导电材料石墨烯的方法,未来能源的革命
MyBatis 是一款深受开发者喜爱的持久层框架,它简化了Java开发中数据库操作的复杂性,通过将SQL语句与Java代码分离,实现了数据访问的灵活和高效。这款开源框架由Mike Hummer创建,目前在Apache Software Foundation...
模板方法模式是一种行为设计模式,它允许在抽象类中定义算法框架,而将具体步骤的实现推迟到子类中。这种模式通常用于那些算法的骨架已经固定,但部分步骤可以根据具体环境有所不同的情况。 在Java中,模板方法模式...
Historic Urban Modeler(HUMmer)是功能齐全的CAD程序,以前称为HOK,Inc.开发的drawVision。此3D多边形建模器可导出VRML,X3D,X3Dv和COLLADA文件。
移动端手势开发,滑动及触屏等效果使用,源代码
切换编译器的包为Tenon Compiler备注:由于Tenon中样式逻辑需要特殊处理,并需要css的样式解析下沉到Tenon Loader中,针对较少的或scss样式处理等,不需要再进行css-loader和style-loader,建议直接使用进行开发。...
悍马(Hummer),是通用汽车公司的一家子公司,主要制造 SUV 和军用车。悍马的标志是一个H形状的商标,象征着力量和力量。 本资源提供了一个详细的汽车标志大全,涵盖了十六个知名汽车品牌的标志信息。这对于汽车...
将 antv/f2 适配到 weex 和 GCanvas ,使用 weex 开发网页端的请自行判断 platform 。 weex 可以在获取到的组件引用 ref 上使用 addEvent api 监听事件,而 f2 传过来的 source 是经过 GCanvas 和 f2 加工过的 ...
- **需求文档命名规范**:参考《Hummer产品需求规格说明书命名范例》,确保文档命名的一致性和规范性。 #### 五、总结 腾讯需求文档模板提供了一个结构化的框架,帮助项目团队有效地管理和记录需求信息。通过遵循...
#### 1.1 Hummer法氧化天然鳞片石墨 - **定义**:Humm法是一种常用的氧化石墨的方法,通过这种方法可以有效地将石墨转化为氧化石墨。 - **过程**:首先,使用硫酸和硝酸的混合物作为氧化剂,加入高锰酸钾作为氧化剂...