﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我把青春献给你！-随笔分类-Java</title><link>http://www.blogjava.net/bluestone2006/category/11727.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:55:44 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:55:44 GMT</pubDate><ttl>60</ttl><item><title>利用回调简化JDBC编程</title><link>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65490.html</link><dc:creator>bluestone</dc:creator><author>bluestone</author><pubDate>Thu, 24 Aug 2006 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65490.html</guid><wfw:comment>http://www.blogjava.net/bluestone2006/comments/65490.html</wfw:comment><comments>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluestone2006/comments/commentRss/65490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluestone2006/services/trackbacks/65490.html</trackback:ping><description><![CDATA[
		<span class="smalltxt">
				<span class="bold">利用回调简化JDBC编程</span>
		</span>
		<br />
		<br />
		<div style="FONT-SIZE: 12px">简单看了一下spring 的jdbc支持，现在又要直接用到jdbc，想想就是痛苦。于是参考了spring，自己写了一些简单的java封装类来简化编程。<br /><p></p><br />废话少说，我这里就用代码来代言吧，看看怎样简化我们的JDBC编程，可以和以前进行对比。<br /><p></p><br />(1） JdbcTemplate。 <br /><p></p><font color="blue"><font style="BACKGROUND-COLOR: #f8f8f8" color="#000000"></font>import java.sql.Connection;<br />import java.sql.PreparedStatement;<br />import java.sql.ResultSet;<br />import java.sql.SQLException;<br />import java.sql.Statement;</font><br /><p></p><br /><font color="blue">import javax.sql.DataSource;</font><br /><p></p><br /><font color="blue">import org.winter.util.DBUtil;</font><br /><p></p><br /><font color="blue">/**<br /> * a simple JDBC template 模仿spring的JdbcTemplate<br /> * <br /> * @author bluestone<br /> * @version 1.0 2006-8-8<br /> * <br /> */<br />public class JdbcTemplate {</font><br /><p></p><br /><font color="blue"> private DataSource dataSource = null;</font><br /><p></p><br /><font color="blue"> public JdbcTemplate(DataSource ds) {<br />  this.dataSource = ds;<br /> }</font><br /><p></p><br /><font color="blue">/**<br />  * 执行更新操作<br />  * <br />  * @param sql<br />  * @param setter<br />  * @return<br />  * @throws SQLException<br />  */<br /> public int update(String sql, PreparedStatementSetter setter)<br />   throws SQLException {<br />  Connection conn = null;<br />  reparedStatement ps = null;<br />  try {<br />   conn = dataSource.getConnection();<br />   ps = conn.prepareStatement(sql);<br />   setter.setValues(ps);<br />   return ps.executeUpdate();<br />  } finally {<br />   DBUtil.colseConnection(conn, ps, null);<br />  }<br /> }</font><br /><p></p><br /><font color="blue"> /**<br />  * <br />  * @param sql<br />  * @return<br />  * @throws SQLException<br />  */<br /> public boolean execute(String sql) throws SQLException {<br />  Connection conn = null;<br />  Statement stmt = null;<br />  try {<br />   conn = dataSource.getConnection();<br />   stmt = conn.createStatement();<br />   return stmt.execute(sql);<br />  } finally {<br />   DBUtil.colseConnection(conn, stmt, null);<br />  }<br /> }</font><br /><p></p><br /><font color="blue"> /**<br />  * <br />  * @param sql<br />  * @param setter<br />  * @param extractor<br />  * @return<br />  * @throws SQLException<br />  */<br /> public Object query(String sql, PreparedStatementSetter setter,<br />   ResultSetExtractor extractor) throws SQLException {<br />  Connection conn = null;<br />  reparedStatement ps = null;<br />  ResultSet rs = null;<br />  try {<br />   conn = dataSource.getConnection();<br />   ps = conn.prepareStatement(sql);<br />   setter.setValues(ps);<br />   rs = ps.executeQuery();<br />   return extractor.extractData(rs);<br />  } finally {<br />   DBUtil.colseConnection(conn, ps, rs);<br />  }<br /> }</font><br /><p></p><br /><font color="blue"> // .........................<br />}</font><br /><br /><font color="#0000ff"><font color="black">(2)</font>  <font color="black">Pr</font><font color="black">eparedStatementSetter</font></font><br /><p></p><br /><font color="blue">public interface PreparedStatementSetter {<br /> void setValues(PreparedStatement ps) throws SQLException;<br />}</font><br /><p></p><br />(3)  <font color="#0000ff"><font color="black">ResultSetExtractor</font></font><br /><p></p><br /><font color="blue">public interface ResultSetExtractor {<br /> Object extractData(ResultSet rs) throws SQLException; <br />}</font><br /><br /><p></p><br />(4) 可以参考spring自己定义其他接口。。。<br /><br /><p></p><br />用了这些辅助类，我们就可以像用spring那样编程了（当然这只能用在对事务要求不高的应用环境中）。看看怎么使用：<br /><p></p><br /><br /> <font color="blue">private JdbcTemplate template;</font><br /><br /><p></p><br /><font color="blue"> public JobManageDao() throws BusinessException {<br />  try {<br />   template = new JdbcTemplate(DBHelper.getDataSource());<br />  } catch (NamingException e) {<br />   throw new BusinessException(e);<br />  }<br /> }</font><br /><p></p><br /><font color="blue">public long saveJobInfo(final JobInfo info) throws BusinessException {<br />  final long id = IdGenerator.getIdLong();<br />  try {<br />   int j = template.update(INSERT_JOB_SQL, new PreparedStatementSetter() {</font><br /><p></p><br /><font color="blue">  public void setValues(PreparedStatement ps) throws SQLException {<br />     int i = 1;<br />     ps.setLong(i++, id);</font><br /><p></p><br /><font color="blue">   //......</font><br /><p></p><br /><font color="blue">   }<br />   });<br />      return j &gt; 0 ? id : 0L;<br />  } catch (SQLException e) {<br />      throw new BusinessException(e);<br />  }<br /> }</font><br /></div>
<img src ="http://www.blogjava.net/bluestone2006/aggbug/65490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluestone2006/" target="_blank">bluestone</a> 2006-08-24 12:38 <a href="http://www.blogjava.net/bluestone2006/archive/2006/08/24/65490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>考虑用代码来生成代码</title><link>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65489.html</link><dc:creator>bluestone</dc:creator><author>bluestone</author><pubDate>Thu, 24 Aug 2006 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65489.html</guid><wfw:comment>http://www.blogjava.net/bluestone2006/comments/65489.html</wfw:comment><comments>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65489.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bluestone2006/comments/commentRss/65489.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluestone2006/services/trackbacks/65489.html</trackback:ping><description><![CDATA[web开发经常遇到这样的情形：写代码的模式基本相同，特别是在写jdbc代码时，会经常要先写sql，然后调用PreparedStatement的setXXX方法，而读取数据时要调用ResultSet的getXXX方法。如果表中的字段很多，那可够你受的了；等你耐心把这些写完，可能在某个地方却出错了。
<p>        如果没有用ORM工具，这些又不能省了不写。于是我考虑用代码来生成这些sql 和 setXXX及getXXX方法。</p><p>        生成代码有许多方法，比如可以用脚本语言（个人喜欢用perl），也可以用模板技术。发现java里面已经有很多模板技术可以直接使用了，比如velocity、freemaker等。我一开始是直接用perl来生成代码的，方法比较原始，就是字符串拼凑在一起。 后来发现有许多的模板技术可以利用。现在打算用velocity来生成代码。说不定可以直接生成DAO、Biz、Bean、XML等一大堆东西，呵呵。等有空要好好研究一下。</p><img src ="http://www.blogjava.net/bluestone2006/aggbug/65489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluestone2006/" target="_blank">bluestone</a> 2006-08-24 12:37 <a href="http://www.blogjava.net/bluestone2006/archive/2006/08/24/65489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>request参数的自动填充</title><link>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65488.html</link><dc:creator>bluestone</dc:creator><author>bluestone</author><pubDate>Thu, 24 Aug 2006 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65488.html</guid><wfw:comment>http://www.blogjava.net/bluestone2006/comments/65488.html</wfw:comment><comments>http://www.blogjava.net/bluestone2006/archive/2006/08/24/65488.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/bluestone2006/comments/commentRss/65488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluestone2006/services/trackbacks/65488.html</trackback:ping><description><![CDATA[在jsp页面，一个表单如果字段很多的话，要写很多request.getParameter(name)之类的代码，如果用web framework的话，则可以免去写这些代码的麻烦。但如果不用framework是否也可以达到参数自动填充的功能呢？ 答案是肯定的。<br /><p>    下面是我在就业网重构时用到的一个java类，其中就是对BeanUtils进行了简单的封装。<br /></p><p><font color="magenta"><strong>   <font color="green">import java.sql.Date;<br />   import java.util.Map;</font></strong></font></p><br /><p><strong><font color="green">   import org.apache.commons.beanutils.BeanUtils;<br />   import org.apache.commons.beanutils.ConvertUtils;<br />   import org.apache.commons.beanutils.converters.SqlDateConverter;</font></strong><br /></p><p><strong><font color="green">   public class NullSafeBeanUtils {<br />   </font></strong><br /></p><p><strong><font color="green">   public final static String EMPTY_STRING = "";<br /> <br />   public static boolean isNull(Object obj) {<br />       return obj == null;<br />   }</font></strong><br /></p><p><strong><font color="green">   public static String getProperty(Object bean, String property) {<br />       if (bean == null) {<br />            return EMPTY_STRING;<br />       }<br />     try {<br />          String str = BeanUtils.getProperty(bean, property);<br />          if (str == null) {<br />              return EMPTY_STRING;<br />         }<br />        return str;<br />     } catch (Exception e) {<br />         return EMPTY_STRING;<br />   }<br />  }</font></strong><br /></p><p><strong><font color="green">  public static void populate(Object bean, Map props) {<br />     if (bean == null) {<br />        return;<br />     }<br />    try {<br />     SqlDateConverter con = new SqlDateConverter(new Date(System.currentTimeMillis()));<br />      ConvertUtils.register(con, java.sql.Date.class);<br />      BeanUtils.populate(bean, props);<br />   } catch (Exception e) {<br />     e.printStackTrace();<br />   }<br /> }<br /> // 此处省略了一些其他代码<br /> }</font></strong></p><br /><p><strong><font color="#008000"></font></strong> </p><br /><p><font color="black">    在这里，poplulate方法就是我用来自动填充参数的。要实现自动填充，只需简单调用此方法就行了。看一个例子：</font></p><br /><p>    JobExperience jobExp = new JobExperience();<br /></p><p>    NullSafeBeanUtils.populate(jobExp, request.getParameterMap());</p><br /><p>   是不是简单了许多？要注意的是表单的各输入字段名要和bean的各属性名对应才能自动填充。另外NullSafeBeanUtils 的getProperty方法也很有用，可以避免写</p><p>   if (bean != null) {</p><p>      yyy = bean.getXXX()＝＝null?"":bean.getXXX()</p><p>   } </p><p>   这样的代码，直接写NullSafeBeanUtils.getProperty(bean, "XXX")就可以了。<br /></p><img src ="http://www.blogjava.net/bluestone2006/aggbug/65488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluestone2006/" target="_blank">bluestone</a> 2006-08-24 12:35 <a href="http://www.blogjava.net/bluestone2006/archive/2006/08/24/65488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>