由于不太喜欢hibernate和mybatis,更多使用spring jdbc来开发,针对spring jdbc一些不便捷的地方,做了写整合,写了sborm,具体可以看项目介绍。
osc项目地址:http://www.oschina.net/p/sborm
之所以要写这个,主要基于以下几个方面:
1、hibernate:过于臃肿,使用不够灵活,优化难(其实主要是因为很少用),HQL感觉就是个渣,在 mysql几乎一统天下的背景下,跨数据库级别的兼容吃力不讨好。Hibernate的对象化关联处理确实挺强大,但是使用起来坑太多,有多少人敢在项目 中大范围使用真不知道,屠龙刀不是人人都提的起啊。
2、mybatis:轻量级,基于xml的模式感觉不利于封装,代码量不小,基于xml维护也麻烦(个人观点, 现在注解模式貌似也挺不错),感觉mybatis更适合存在dba角色的年代,可以远离代码进行sql调优,复杂的查询拼装起来也更加优雅(java基本 就是if else ...),但是对于查询业务简单但是数据库集群环境的场景有点憋屈(其实对mybatis使用也不多,瞎评论^_^)。
3、springjdbc:小巧,灵活,足够优秀,个人比较喜欢使用,但是代码量偏大,原生的接口重复劳动量大,比如insert、mapper之类的;
sborm只是针对springjdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于springjdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由springjdbc实现了。
平时不太喜欢使用hibernate和mybatis,主要是使用springjdbc,写这个东西的出发点主要是平时使用springjdbc觉 得比较麻烦,重复性的代码偏多,一方面通过自动mapper降低返回结果处理工作量,另一方面参考hibernate对象化查询条件的模式,写了一个 QueryBudiler,使得更多简单的单表查询可以通过对象组织查询、更改逻辑,避免过多去写相似性的SQL语句,减少DAO接口量。
######欢迎交流使用activerecord模式、https://github.com/Dreampie/resty 或者 http://git.oschina.net/Dreampie/resty###### 下面这样的代码,看上去就不想用了。
public static void testSelect() { try { Demo demo = new Demo(); QueryBuilder q = new QueryBuilder(demo); q.columns().select(Demo.Columns.id, Demo.Columns.name); // 不选择默认查询所有,多参数模式 q.where() .add(QueryCondition.EQ(Demo.Columns.name, "test")) // =条件 .add(QueryCondition.BETWEEN(Demo.Columns.createTime, "2014-07-10 11", "2014-07-19 12")); // between条件 q.order().add(Demo.Columns.createTime, OrderMode.DESC); // 条件排序 List<?> list = dao.select(q); System.out.println(list.size()); } catch (Exception e) { e.printStackTrace(); } }
######回复 @franticwind : 没什么代码量,定义接口Mapper和SQL的XML就完了,Mapper用Spring生成,用autowared注入,都是固定的模式。主要是SQL可以直接用,拼的SQL太难读######回复 @jorneyr : 这个是mybatis的方式吧,感觉代码量有点大,无法抽象,你是咋简化的?######回复 @franticwind : 直接写SQL在xml里比这个看上去好多了######你一般是怎么写的?说实话,开始我也是写n多dao接口,发现实在麻烦,才这么做,更通用一点,你有啥好推荐的方法,指教下。######同意!###### 推荐我的ORM
https://github.com/hubinix/com.kamike.db ###### 我ORM的检索代码
public ArrayList<Disk> find(Disk t) { GenericSelect<Disk> select = createSelect(); ResultSet rs = null; PreparedStatement ps = null; Connection conn = null;
ArrayList<Disk> ret = null;
try {
conn = DbInst.getInstance().getDatabase().getSingleConnection();
ps = conn.prepareStatement(select.rawSql() + "where t.id=? ", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ps.setString(1, t.getId());
rs = ps.executeQuery();
ret = select.fetch(rs);
} catch (Exception e) {
ret = new ArrayList<>();
System.out.println(this.getClass().getName() + e.toString());
} finally {
try {
if (rs != null) {
rs.close();
rs = null;
}
if (ps != null) {
ps.close();
ps = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException ex) {
Logger.getLogger(DiskReader.class.getName()).log(Level.SEVERE, null, ex);
}
}
return ret;
}</pre>
######很好!最重要找到自己的方式,适合就是最好!######自己用的爽就好了。######
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。