论坛首页 Java企业应用论坛

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

浏览 10394 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (6)
作者 正文
   发表时间:2009-10-31   最后修改:2009-11-02
    这个小项目第一个版本是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;
	}
}  


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

   发表时间:2009-10-31   最后修改:2009-10-31
这种造法没多大意义,如果一定要造,直接造Criteria查询,更符合OO风格。
0 请登录后投票
   发表时间:2009-10-31  
fansofjava 写道
这种造法没多大意义,如果一定要造,直接造Criteria查询,更符合OO风格。

s.like("bookName", "%"+bookName+"%").and().large("stock", stock); 

这是仿Criteria的,2007初时,我不知道Hibernate里有这玩意,不然也不会造轮子......
0 请登录后投票
   发表时间:2009-10-31  
把那个Bean贴出来...吼吼
@Table(name="BOOK_INFO")
public class BookInfo {
	@Column
	@Id
	@Value(strategy=Strategy.HHEX16)
	public String id;
	
	@Column()
	@VString(minLenth=2)
	public String bookName;

	@Column()
	@Value(def="true")
	public boolean showAble;
	
	@Column()
	@VString(minLenth=20,maxLenth=4000)
	public String description;
	
	@Column()
	public String img;
	
	@Column()
	@VString(nullable=false)
	public String typeId;
	
	@Column()
	@Value(def="0")
	public Integer stock;
	
}
0 请登录后投票
   发表时间:2009-11-02  
很强大的说,似乎LZ自己做了压力测试。
0 请登录后投票
   发表时间:2009-11-02  
不如写一个语法分析器,让hql支持动态查询方式。
如 select t from Table t where t.name = :name [and t.location=:location]
如果location为空就不要后面的条件。
0 请登录后投票
   发表时间:2009-11-02  
好像不错,可否将visit3.0.jar 源码公布下
让大家学习下
0 请登录后投票
   发表时间:2009-11-02  
treblesoftware 写道
很强大的说,似乎LZ自己做了压力测试。

以前版本做过压力测试(比较简单,不全面的),因为封装、抽象没有Hibernate那样深层化;功能也没那么多大全,够用就行;鄙人代码写的还不是太烂,所以测试中,比Ibatis略好。
0 请登录后投票
   发表时间: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则不会做为查询条件
0 请登录后投票
   发表时间:2009-11-02  
qiren83 写道
好像不错,可否将visit3.0.jar 源码公布下
让大家学习下

重构版本没写注释,不怎么好看啊!但比Hibernate的源码容易看多了
实在小啊,源码大小不及Hibernate的1/20.....哈哈,看看还是不错的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics