论坛首页 Java企业应用论坛

(模板方法的运用)持久层操作的java代码

浏览 29432 次
精华帖 (1) :: 良好帖 (5) :: 新手帖 (6) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-03-10   最后修改:2011-03-11
虽然楼主的书面表达看起来有点蛋疼,但代码还是玩得不错的。建议看下dbutils的源码,那才是上佳之作。

又仔细看了下,发现viewName这种设计比较傻瓜,不如没有。

单就你这里的设计,可以搞成:

//SqlHelper<T>改造如下,去掉loadDataBeanSelf

protected T loadDataBean(ResultSet rs, List<SqlHelper<?>> otherBOs){
	T parent = loadBean(rs);
	for(SqlHelper<?> bo : otherBOs){
		Object child = bo.loadBean(rs);
		BeanUtil.setXvalue(parent,child);  //为某对象某个类型设置值。
	}
	
};

protected abstract T loadBean(ResultSet rs);




protected Book loadBean(ResultSet rs)
			throws SQLException {
		
		Book book = new Book();		
		book.setBook_id(rs.getInt("book_id"));
		book.setBook_name(this.changeFont(rs, "book_name"));
		book.setBook_price(rs.getDouble("book_price"));
		book.setStu_id(rs.getInt("stu_id"));	
		return book;
}




以上只是半伪码,未经测试。若在项目中使用,后果自负。


0 请登录后投票
   发表时间:2011-03-11  
把数据库连接对象作为成员变量而存在,在并发环境中应该会出现连接关不了的情况。
0 请登录后投票
   发表时间:2011-03-11   最后修改:2011-03-11
huyaohua 写道
kanny87929 写道
huyaohua 写道
我说怎么代码这么熟悉,看楼下才想起.NET,API来!楼主3年前,写成这样已经很强了。不过还是有个建议,楼主对异常的处理还有些问题,对于SQL异常,我的建议或者封装异常,抛出,或者直接运行时异常。



你怎么处理呢,能给出源码不

其实这只是我个人习惯,对于异常的处理,尤其是这种底层的不习惯于  e.printStackTrace();
还有是我的错觉吗,怎么感觉connection为公有变量,在多线程下对同一个实例操作,应该会有问题吧。虽然实际应用中没有人会这么用。



你觉得在什么情况下会发生多线程的情况
0 请登录后投票
   发表时间:2011-03-11   最后修改:2011-03-11
马伽角 写道
干嘛不用反射来做呢,,反射来生成SQL



到目前2个人提出要用反射来弄,你有思路?
0 请登录后投票
   发表时间:2011-03-11   最后修改:2011-03-11
whaosoft 写道
有一点想问 持久在哪里 lz如何理解何为持久?


数据库就是一个可以持久性保存数据的容器
操作数据库的这层代码就可以理解为持久层操作代码
0 请登录后投票
   发表时间:2011-03-11  
yangguo 写道
虽然楼主的书面表达看起来有点蛋疼,但代码还是玩得不错的。建议看下dbutils的源码,那才是上佳之作。

又仔细看了下,发现viewName这种设计比较傻瓜,不如没有。

单就你这里的设计,可以搞成:

//SqlHelper<T>改造如下,去掉loadDataBeanSelf

protected T loadDataBean(ResultSet rs, List<SqlHelper<?>> otherBOs){
	T parent = loadBean(rs);
	for(SqlHelper<?> bo : otherBOs){
		Object child = bo.loadBean(rs);
		BeanUtil.setXvalue(parent,child);  //为某对象某个类型设置值。
	}
	
};

protected abstract T loadBean(ResultSet rs);




protected Book loadBean(ResultSet rs)
			throws SQLException {
		
		Book book = new Book();		
		book.setBook_id(rs.getInt("book_id"));
		book.setBook_name(this.changeFont(rs, "book_name"));
		book.setBook_price(rs.getDouble("book_price"));
		book.setStu_id(rs.getInt("stu_id"));	
		return book;
}




以上只是半伪码,未经测试。若在项目中使用,后果自负。





这个建议蛮好
0 请登录后投票
   发表时间:2011-03-11  
出道能写这样的代码不错了!
如果论模式,我无话可说。
但是论面向对象设计,我认为你那个什么bean都要继承什么sqlhelp的继承纯粹为继承而继承,我没有看到非要继承的理由。
只是封装对jdbc的访问,其实他本身只是工具类。如果是为了那个connection的话,你又未达到屏蔽jdbc的目的。
使用jdbc编程最容易出错的是连接管理的问题。
也就是说你的封装不完全,而且你的侵入性太高,对后续修改不利,移一发而动全身。
0 请登录后投票
   发表时间:2011-03-11  
强烈鄙视几年前写的某某程序,毛意思吗
0 请登录后投票
   发表时间:2011-03-11  
问一个问题啊,我在用tomcat6+ssh+jotm测试jta时,如果两个数据源都是基于MySQL的就可以,如果一个是MySQL,一个是SqlServer,就不能回滚,请问哪位遇到过吗????
0 请登录后投票
   发表时间:2011-03-11  
68. 
69.    /** 
70.     * 为了方便操作,我还特意写定义了这个返回ResultSet的方法,便于直接操作 
71.     * @param sql 
72.     * @param params 
73.     * @param executeCall 
74.     * @return 
75.     * @throws SQLException 
76.     */ 
77.    public ResultSet returnResultSet(String sql, Object[] params, boolean executeCall) throws SQLException;  


我被这个雷到了,还能返回ResultSet结果集?????
那方法里面的结果集你没关闭么???如果关闭了,还怎么能返回呢???
0 请登录后投票
论坛首页 Java企业应用版

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