`
zspzlxn
  • 浏览: 1309 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

造了个Hibernate的小轮子,显丑下

阅读更多
    这个小项目第一个版本是2007年初,在四五个中小项目中使用过吧,最近辞职在家,没事就对它进行了重构玩玩。现在重构初步完成,帖上来让大家指导一下。
     以下贴段分页查询的代码,展示下它的基本风格:
/**
	 * 以下的四个分页查询参数一样,结果也是一样的,只是编码风格不一样
	 * */
	
	public Pagination<BookInfo> page1(Pagination<BookInfo> page, String bookName, int stock) {
		Selecter<BookInfo> s=this.createSelecter();
		s.like("bookName", "%"+bookName+"%").and().large("stock", stock);
		//s.orderBy("stock");
		//s.exclude("description");
		s.page(page);
		return page;
	}
	
	public Pagination<BookInfo> page2(Pagination<BookInfo> page, String bookName, int stock) {
		this.pageByWhere(page, "$bookName like ? and $stock>?", "%"+bookName+"%",stock);
		return page;
	}
	
	public Pagination<BookInfo> page3(Pagination<BookInfo> page, String bookName, int stock) {
		//$开头表示成员变量名  ?开始为参数占位名
		Executer e=this.createQueryExecuter("$bookName like ?bname and $stock>?stock");
		e.set("bname", "%"+bookName+"%");
		e.set(1, 0);
		e.pageBeans(BookInfo.class, page);
		return page;
	}

	public Pagination<BookInfo> page4(Pagination<BookInfo> page, String bookName, int stock) {
		String sql="select * from book_info where book_Name like ?bname and stock>?stock";
		Executer e=this.getVisiter().createExecutor(sql);
		e.set("bname", "%"+bookName+"%");
		e.set("stock",0);
		e.pageBeans(BookInfo.class, page);
		return page;
	}
	
	/**将查询结果封装到一个数组中*/
	public Pagination<Object[]> pageArray(Pagination<Object[]> page,
			String bookName, int stock) {
		
		Executer e=this.createQueryExecuter("$bookName like ?bname and $stock>?stock");
		e.set("bname", "%"+bookName+"%");
		e.set(1, 0);
		e.pageArray(page);
		return page;
	}
    
	/**将查询结果封装到一个以列名为键,数据为值的Map集合*/
	public Pagination<Map<String, Object>> pageMap(
			Pagination<Map<String, Object>> page, String bookName, int stock) {
		Executer e=this.createQueryExecuter("$bookName like ?bname and $stock>?stock");
		e.set("bname", "%"+bookName+"%");
		e.set(1, 0);
		e.pageMap(page);
		return page;
	}



贴下BaseDao接口
public interface IBaseDao <T extends Object> {
	
	  T add(T bean);
	 
	  void update(T bean);
	  
	  void delById(Object id);
	  
	  int delByField(String field,Object value);
	  
	  T getById(Object id);
	  
	  T getFirstByField(String field,Object value);
	  
	  T getUniqueByField(String  field,Object value);
	  
	  List<T> listAll();
	  
	  List<T>  list(Integer curPage,Integer perPage);
	  
	  List<T>  list(Long beginRow,Long endRow);
	  
	  List<T> listByField(String field,Object value);
	  
	  Pagination<T>  page(Pagination<T> page);
	  
	  Pagination<T> pageByField(Pagination<T> page,String field,Object value);
	  
}


再贴上下文(此项目无任何xml配置文件,全是anntation)
@VisitConfig(
	dataSource={@Source(driverClazz=com.mysql.jdbc.Driver.class,
				 url="jdbc:mysql://127.0.0.1:3300/books",
				 userName="root",
				 password="root",
				 dbType=DBType.MYSQL
				 )				 
	}
)
public class TestVisitContext extends VisitContext{
	
	private TestVisitContext(){
		this.init();
	}
	
	private static VisitContext testContext;
	
	public static VisitContext getContext(){
		if(testContext==null)testContext=new TestVisitContext();
		return testContext;
	}
}  


自以为它的适用比较适用于大并发的互联网项目,对性能要求比较高的项目
再贴一个示例   

分享到:
评论
25 楼 china_volcano 2009-11-25  
studying......
24 楼 yuyinghan 2009-11-09  
fansofjava 写道
这种造法没多大意义,如果一定要造,直接造Criteria查询,更符合OO风格。

23 楼 zspzlxn 2009-11-06  
ycysth 写道
不知道分页查询设置setFirstResult和setMaxResults也有类似的语法

当然提供,自动分页支持
22 楼 zspzlxn 2009-11-06  
还是那句话哈,存在即合理。我造了些轮子,想造一个比较通用、全面、稳定的轮子是不容易的,我一般造了后BUG都懒得改的,只是学习。。。。。。
这个轮子也不是很成熟的,学学可以哈。。
------------------------------
这个项目也有一些特点,简单精悍,时间和空间复杂度比Hibernate要低得多,但不支持的功能也多了,如拦截器、一对多、多对多关系映射等,当然也加入了自已的一些想法;
    1\ Hibernate中拦截器不常用也不大实用,而且必须用到动态代理(比较耗),所以就不支持了
     2\ 一对多,多对多等不支持也是有原因的,互联网项目一般要做数据缓存,级联查询\更新不利于控制缓存的
     3\一级缓存,二级缓存 个人认为Hibernate的缓存只有在超长的事务中有比较大的优化,对于互联网项目,自已做缓存的话,这个就没意义了
     4\事务控制  事务API很简单,支持分布式事务,没有Hibernate\Ibatis复杂,更没有JTA复杂,只能应用普通场景,对于银行电信级项目不适用
     5\验证框架(自已加的)  所有数据都是通过持久层存入数据库的,在这加入验证框架,能保证所有的数据的完整性,也就不必要在数据库中添加约束,增加数据库负担
     6\不支持二进制数据  二进制数据不常用,不提供支持  
     7\没有xml文件,全是annotation  感觉一个包中文件太多了有点不爽,一个BEAN文件能看到所有,比较直观
--------------------说白了,为自已项目定做的,啥啥
      
21 楼 ycysth 2009-11-06  
matt.u 写道
不如写一个语法分析器,让hql支持动态查询方式。
如 select t from Table t where t.name = :name [and t.location=:location]
如果location为空就不要后面的条件。

不知道分页查询设置setFirstResult和setMaxResults也有类似的语法
20 楼 mingjie115 2009-11-05  
不错,不过貌似要一定的技术来支持,我也想过自己造。可惜技术不过关,努力中。

用别人的只能永远跟着别人跑,别人怎样写,你就只能这样做,你做的工作永远都是跟着别人的脚步。这种说法可能片面,但我是这样想的。当初选择。NET还是JAVA的时候我选择了JAVA,因为他开源,你知道怎么用,你还可以知道他是怎样做到的,那么你就有可能模仿甚至创新。开发,不能永远都是只会使用别人的东西。
19 楼 ChinaHopes 2009-11-05  
PS:那个用了hibernate的应用是一个开源的Blog。
18 楼 ChinaHopes 2009-11-05  
fireflyc 写道
这个不成火候的。只能说是一个很简单的东西,以下几个问题需要思考
1. 这里终归是一种SQL的组合,也就是只是对拼接SQL的一种简化。
2. 这里没有一种HQL之类的语法规则来作为自己的查询语言来屏蔽底层的SQL。
3. 这里model都是public的,这样虽然容易使用,但是它这种做法在和整个java世界为敌,这种对象无法使用beanutils,无法和现有的各种开源框架组合在一起使用。因为它不是javabean。

如果说这个和hibernate比,那是没有办法比的。hibernate有自己的查询语言,根据不同的数据库类型会有相应的优化方法。这种语法的推导和优化手法不必数据库的SQL分析器简单。单单这一点,这个程序都没有办法相比。


1、就是要简化,越弄越复杂是跟在跟谁较劲?

2、为什么要用HQL?

3、java不是学术研究,是实用,是用来开发软件的。只要能开发出稳定的软件,满足需求,我们不介意跟任何人做对。(你知道JavaBean规范对方法里面对方法前两个字母的大小写有个特别的处理吗,如果两个都是大写字母就不转换第一个,你知道那有多恶心么)。

4、hibernate万岁,万岁。我们两个应用部署在一台机器上,一个用了,一个没用hibernate,用了hibernate的应用把内存吃光,害的weblogic一天重启一次。
17 楼 zspzlxn 2009-11-03  
lgdlgd 写道
com.tepando

这个是以前版依赖的工具包,验证框架也在这个包里面,重构我把它合到一起了,并没有使用到这个包了
userya 写道
让annotation也见鬼去吧


存在即合理,没啥好争的!方便,觉得用得习惯就行
fireflyc 写道
1. 这里终归是一种SQL的组合,也就是只是对拼接SQL的一种简化。
2. 这里没有一种HQL之类的语法规则来作为自己的查询语言来屏蔽底层的SQL。
3. 这里model都是public的,这样虽然容易使用,但是它这种做法在和整个java世界为敌,这种对象无法使用beanutils,无法和现有的各种开源框架组合在一起使用。因为它不是javabean。

呵呵,本来就不是和Hibernate比,不可能做的像HIbernate那样大而全
1、确实是简单的拼接,把成员变量名替代为字段名
2、HQL本身的语法规则是SQL的面向对象化及扩展
3、Model两种都支持(public和get/set),这里简写了
------------------------------------------------------------------
    鄙人最初造这个轮子的目的是为了学习JDBC和Hibernate,根据工作经验,加入了自已的一些想法。当初并没有打算把它应用到项目中,后来用到了项目中也是偶然的。
     每个人的学习方法不一样,我的学习方法就是造轮子。我造过的轮子还蛮多的,哈哈,SPRING,Struts,JSTL,SOA总线,工作流,Web容器等等.....这些轮子都加入了自已的想法,但基本上没应到项目,因为没法跟稳定成熟的产品比。
     因尔,这个项目并不推荐大家使用,学习学习即可!学习一门技术,看书不如造轮子,会带来很多好处,如造个Web服务器,就能把线程、HTTP协议、网络IO流、Servlet/JSP规范弄得比较透,就不会出现学了几个月后会写Action不会写Servlet的尴尬.


16 楼 fireflyc 2009-11-02  
这个不成火候的。只能说是一个很简单的东西,以下几个问题需要思考
1. 这里终归是一种SQL的组合,也就是只是对拼接SQL的一种简化。
2. 这里没有一种HQL之类的语法规则来作为自己的查询语言来屏蔽底层的SQL。
3. 这里model都是public的,这样虽然容易使用,但是它这种做法在和整个java世界为敌,这种对象无法使用beanutils,无法和现有的各种开源框架组合在一起使用。因为它不是javabean。

如果说这个和hibernate比,那是没有办法比的。hibernate有自己的查询语言,根据不同的数据库类型会有相应的优化方法。这种语法的推导和优化手法不必数据库的SQL分析器简单。单单这一点,这个程序都没有办法相比。
15 楼 Rjx2008 2009-11-02  
请问LZ com.tepando的源码:)
14 楼 lgdlgd 2009-11-02  
不错啊,粗略瞄了一下,楼主要是在2000年就有这想法,估计HIBERNATE就是中国人做的了,翻页时不小心点到新手贴,不好意思。
13 楼 userya 2009-11-02  
让annotation也见鬼去吧.
12 楼 ChinaHopes 2009-11-02  
我 顶。

我 顶楼主这样的造轮子的行为。

老吃现成的就退化了。

跟吃麦当劳似的,死肥死肥没营养。

有些东西真不如自己动手来的舒服。

让嗯多XML配置见鬼去吧!
11 楼 qiren83 2009-11-02  
zspzlxn 写道
qiren83 写道
好像不错,可否将visit3.0.jar 源码公布下
让大家学习下

重构版本没写注释,不怎么好看啊!但比Hibernate的源码容易看多了
实在小啊,源码大小不及Hibernate的1/20.....哈哈,看看还是不错的



感谢楼主
下午不做事了 看你代码了 呵呵
10 楼 zspzlxn 2009-11-02  
  
9 楼 zspzlxn 2009-11-02  
qiren83 写道
好像不错,可否将visit3.0.jar 源码公布下
让大家学习下

重构版本没写注释,不怎么好看啊!但比Hibernate的源码容易看多了
实在小啊,源码大小不及Hibernate的1/20.....哈哈,看看还是不错的
8 楼 zspzlxn 2009-11-02  
matt.u 写道
不如写一个语法分析器,让hql支持动态查询方式。
如 select t from Table t where t.name = :name [and t.location=:location]
如果location为空就不要后面的条件。

这确实是个很重要的问题,比较方便啊,但是我为了简单抽象程度没这么高,只写了简单的扫描器,但有替代方案
s.like("bookName", "%"+bookName+"%").and().large("stock", stock); 

这种模式下,参数值为null则不会做为查询条件
7 楼 zspzlxn 2009-11-02  
treblesoftware 写道
很强大的说,似乎LZ自己做了压力测试。

以前版本做过压力测试(比较简单,不全面的),因为封装、抽象没有Hibernate那样深层化;功能也没那么多大全,够用就行;鄙人代码写的还不是太烂,所以测试中,比Ibatis略好。
6 楼 qiren83 2009-11-02  
好像不错,可否将visit3.0.jar 源码公布下
让大家学习下

相关推荐

    hibernate登录小例子

    【hibernate登录小例子】是一个面向初学者的教程,主要展示了如何利用Hibernate框架实现一个简单的用户登录功能。在这个例子中,我们将深入探讨Hibernate的基本概念、配置、实体类的创建、映射文件的编写以及Session...

    在Myeclipse中搭建的一个Hibernate小程序

    总之,通过这个在Myeclipse中搭建的Hibernate小程序,你可以了解和实践如何在Java Web项目中集成Hibernate,从而提高数据库操作的便捷性和效率。在实践中不断学习和探索,你将能够熟练运用Hibernate来解决复杂的...

    hibernate显示不带?的完整sql

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。在开发过程中,为了调试和优化SQL查询,有时我们需要查看Hibernate生成的完整SQL语句,包括其参数...

    hibernate小程序源码

    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt; &lt;!-- Generated by MyEclipse Hibernate Tools. --&gt; &lt;hibernate-configuration&gt; ...

    hibernate小程序

    通过这个小程序,你可以更好地理解Hibernate的工作原理,并将其应用于实际项目。 总之,Hibernate简化了Java开发中的数据库操作,使得开发者能更专注于业务逻辑。通过学习和实践这个“hibernate小程序”,新手可以...

    hibernate入门小程序

    **hibernate入门小程序** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了方便...通过学习和实践这个入门小程序,你将掌握Hibernate的基本操作,为进一步深入学习和使用Hibernate打下坚实基础。

    hibernate电子书小压缩包

    总的来说,Hibernate电子书小压缩包为我们提供了一个深入理解Hibernate的窗口,涵盖了从基本概念到高级特性的全面内容。无论是初学者还是经验丰富的开发者,都能从中获益,提升自己的Java持久化技术。通过学习和实践...

    struts2+hibernate小项目

    通过这个小项目,你可以学习到如何在实际开发中整合Struts2和Hibernate,提升Web应用程序的开发效率。同时,这也是一个很好的实践机会,加深对MVC模式和ORM思想的理解。在学习过程中,你可能会遇到各种问题,如数据...

    hibernate需要的最小jar包

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数 据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程 序员可以...

    myeclipse下hibernate用法

    MyEclipse 是一个功能强大的集成开发环境,支持多种编程语言和框架,而 Hibernate 则是一种流行的 ORM(Object-Relational Mapping)框架,用于简化数据库交互。本文将指导您如何在 MyEclipse 中使用 Hibernate,並...

    Hibernate小Demo

    这是一个在Myeclipse中的Hibernate入门小Demo

    netbeans下安装hibernate

    在Java开发领域,Hibernate是一个非常流行的开源对象关系映射(ORM)框架,它极大地简化了数据库操作。在NetBeans这样的集成开发环境(IDE)中安装Hibernate可以帮助开发者更高效地进行数据库驱动的应用程序开发。...

    一个hibernate的小程序

    Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使得开发者可以更加专注于业务...通过深入研究这个小程序,初学者可以快速掌握Hibernate的核心功能,并为后续的Java开发打下坚实的基础。

    Hibernate入门到精通

    Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...

    JSP+Hibernate实现留言板

    例如,当用户提交留言时,我们可以创建一个新的`Message`对象,设置其属性,然后使用Hibernate的`Session`对象保存这个对象到数据库。同样,当需要显示留言列表时,我们可以查询数据库,获取所有`Message`对象,并将...

    Hibernate,hibernate笔记

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,简化了数据持久化的复杂度。以下是对Hibernate的一些关键知识点的...

    hibernate基础jar包

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的编程工作。这个压缩包包含了Hibernate的基础jar包,这些jar文件是开发Hibernate应用所...

    Hibernate分页查询小结

    Hibernate分页查询小结

    hibernate所需的13个(1个mysql驱动包+3个日志包+9个hibernate-required包)jar包

    在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本资源包含了学习和使用Hibernate所必需的13个jar包,这些包主要分为三个部分...

    hibernate3.zip 包含hibernate3.jar

    Hibernate3 是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发人员可以更加专注于业务逻辑而不是数据库的细节。这个`hibernate3.zip`压缩包包含了`hibernate3.jar`,它是Hibernate 3版本的核心库,包含...

Global site tag (gtag.js) - Google Analytics