`
simgsg
  • 浏览: 96008 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

spring JdbcTemplate 的若干问题

 
阅读更多
<p>spring的javadoc上讲getObject(String, Object[], Class) will return NULL if the result of the query is NUL<br><span style="color: #ff3300;">这里有0行和nullresult的区别</span><br>0行: select salary from user where 1 = 2<br>null result: select max(salary) from user where 1 = 2 返回就是null<br>0行一定抛出IncorrectResultSizeDataAccessException异常<br>原因如下<br>ResultSetMetaData rsmd = rs.getMetaData();<br>int nrOfColumns = rsmd.getColumnCount();这里返回ResultSet的列数<br>if (nrOfColumns != 1) {<br>throw new IncorrectResultSizeDataAccessException(<br>"Expected single column but found " + nrOfColumns, 1, nrOfColumns);<br>}<br><span style="color: #ee6911;">0行,多于1行,就抛异常了</span><br>最好还是用QueryForList,返回的list的size为0,就是0行<br><br>还有oracle 10g的问题,jdbc驱动版本10.1.0.20<br>getObject返回一个日期类型为java.util.Date<br>但是这个日期只有年-月-日,没有时-分-秒,因为10g对于DATE类型的列,<br>getObject().getClass().getName()得到 java.sql.Date<br>System.out.println(rs.getObject("date_created") + " " + rs.getObject("date_created").getClass());<br>得到 2005-10-06 class java.sql.Date<br>要得到全部日期,必须使用oracle.sql.TIMESTAMP<br>但是使用queryForObject("sql", Timestamp.class) <br>得到org.springframework.dao.TypeMismatchDataAccessException异常<br>java.sql.Timestamp] and could not be converted to required type [java.sql.Timestamp] 很是莫名其妙<br><span style="color: #f73809;">只好使用java -Doracle.jdbc.V8Compatibility="true" MyApp解决</span></p>
<p></p>
<p></p>
<p></p>
<p><span style="color: #f73809;">以下是对JdbcTemplate 常规用法总结:</span></p>
<p></p>
<p><span style="color: #f73809;">
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">jdbcTemplate.execute(</span></span><span class="string"><span style="color: #0000ff;">"CREATETABLEUSER(user_idinteger,namevarchar(100))"</span></span><span><span style="color: #000000;">);</span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");</pre>
<p><br>2、如果是UPDATE或INSERT,可以用update()方法。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">jdbcTemplate.update(</span></span><span class="string"><span style="color: #0000ff;">"INSERTINTOUSERVALUES('"</span></span><span><span style="color: #000000;"></span></span></span></li>
<li>
<span><span style="color: #000000;">+user.getId()+</span></span><span class="string"><span style="color: #0000ff;">"','"</span></span><span><span style="color: #000000;"></span></span>
</li>
<li>
<span><span style="color: #000000;">+user.getName()+</span></span><span class="string"><span style="color: #0000ff;">"','"</span></span><span><span style="color: #000000;"></span></span>
</li>
<li>
<span><span style="color: #000000;">+user.getSex()+</span></span><span class="string"><span style="color: #0000ff;">"','"</span></span><span><span style="color: #000000;"></span></span>
</li>
<li>
<span><span style="color: #000000;">+user.getAge()+</span></span><span class="string"><span style="color: #0000ff;">"')"</span></span><span><span style="color: #000000;">);</span></span>
</li>
</ol>
</div>
<pre class="java" style="display: none;">jdbcTemplate.update("INSERT INTO USER VALUES('"
           + user.getId() + "', '"
           + user.getName() + "', '"
           + user.getSex() + "', '"
           + user.getAge() + "')");
</pre>
<p><br>3、带参数的更新</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">jdbcTemplate.update(</span></span><span class="string"><span style="color: #0000ff;">"UPDATEUSERSETname=?WHEREuser_id=?"</span></span><span><span style="color: #000000;">,</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">Object[]{name,id});</span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});</pre>
<p></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">jdbcTemplate.update(</span></span><span class="string"><span style="color: #0000ff;">"INSERTINTOUSERVALUES(?,?,?,?)"</span></span><span><span style="color: #000000;">,</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">Object[]{user.getId(),user.getName(),user.getSex(),user.getAge()});</span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});
</pre>
<p><br>4、使用JdbcTemplate进行查询时,使用queryForXXX()等方法</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">int</span></strong></span><span><span style="color: #000000;">count=jdbcTemplate.queryForInt(</span></span><span class="string"><span style="color: #0000ff;">"SELECTCOUNT(*)FROMUSER"</span></span><span><span style="color: #000000;">);</span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");</pre>
<p><br></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">Stringname=(String)jdbcTemplate.queryForObject(</span></span><span class="string"><span style="color: #0000ff;">"SELECTnameFROMUSERWHEREuser_id=?"</span></span><span><span style="color: #000000;">,</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">Object[]{id},java.lang.String.</span></span><span class="keyword"><strong><span style="color: #7f0055;">class</span></strong></span><span><span style="color: #000000;">);</span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class);</pre>
<p><br></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">Listrows=jdbcTemplate.queryForList(</span></span><span class="string"><span style="color: #0000ff;">"SELECT*FROMUSER"</span></span><span><span style="color: #000000;">);</span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">List rows = jdbcTemplate.queryForList("SELECT * FROM USER");</pre>
<p><br></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">Listrows=jdbcTemplate.queryForList(</span></span><span class="string"><span style="color: #0000ff;">"SELECT*FROMUSER"</span></span><span><span style="color: #000000;">); </span></span></span></li>
<li><span><span style="color: #000000;">Iteratorit=rows.iterator(); </span></span></li>
<li>
<span class="keyword"><strong><span style="color: #7f0055;">while</span></strong></span><span><span style="color: #000000;">(it.hasNext()){ </span></span>
</li>
<li><span><span style="color: #000000;">MapuserMap=(Map)it.next(); </span></span></li>
<li>
<span><span style="color: #000000;">System.out.print(userMap.get(</span></span><span class="string"><span style="color: #0000ff;">"user_id"</span></span><span><span style="color: #000000;">)+</span></span><span class="string"><span style="color: #0000ff;">"/t"</span></span><span><span style="color: #000000;">); </span></span>
</li>
<li>
<span><span style="color: #000000;">System.out.print(userMap.get(</span></span><span class="string"><span style="color: #0000ff;">"name"</span></span><span><span style="color: #000000;">)+</span></span><span class="string"><span style="color: #0000ff;">"/t"</span></span><span><span style="color: #000000;">); </span></span>
</li>
<li>
<span><span style="color: #000000;">System.out.print(userMap.get(</span></span><span class="string"><span style="color: #0000ff;">"sex"</span></span><span><span style="color: #000000;">)+</span></span><span class="string"><span style="color: #0000ff;">"/t"</span></span><span><span style="color: #000000;">); </span></span>
</li>
<li>
<span><span style="color: #000000;">System.out.println(userMap.get(</span></span><span class="string"><span style="color: #0000ff;">"age"</span></span><span><span style="color: #000000;">)+</span></span><span class="string"><span style="color: #0000ff;">"/t"</span></span><span><span style="color: #000000;">); </span></span>
</li>
<li><span><span style="color: #000000;">}</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
Iterator it = rows.iterator();
while(it.hasNext()) {
    Map userMap = (Map) it.next();
    System.out.print(userMap.get("user_id") + "/t");
    System.out.print(userMap.get("name") + "/t");
    System.out.print(userMap.get("sex") + "/t");
    System.out.println(userMap.get("age") + "/t");
}
</pre>
<p><br><br> JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。 <br> 除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。 <br><br>JDBC的PreparedStatement</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">final</span></strong></span><span><span style="color: #000000;">Stringid=user.getId(); </span></span></span></li>
<li>
<span class="keyword"><strong><span style="color: #7f0055;">final</span></strong></span><span><span style="color: #000000;">Stringname=user.getName(); </span></span>
</li>
<li>
<span class="keyword"><strong><span style="color: #7f0055;">final</span></strong></span><span><span style="color: #000000;">Stringsex=user.getSex()+</span></span><span class="string"><span style="color: #0000ff;">""</span></span><span><span style="color: #000000;">; </span></span>
</li>
<li>
<span class="keyword"><strong><span style="color: #7f0055;">final</span></strong></span><span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">int</span></strong></span><span><span style="color: #000000;">age=user.getAge(); </span></span>
</li>
<li><span><span style="color: #000000;"></span></span></li>
<li>
<span><span style="color: #000000;">jdbcTemplate.update(</span></span><span class="string"><span style="color: #0000ff;">"INSERTINTOUSERVALUES(?,?,?,?)"</span></span><span><span style="color: #000000;">, </span></span>
</li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">PreparedStatementSetter(){ </span></span>
</li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">void</span></strong></span><span><span style="color: #000000;">setValues(PreparedStatementps)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">SQLException{ </span></span>
</li>
<li>
<span><span style="color: #000000;">ps.setString(</span></span><span class="number"><span style="color: #c00000;">1</span></span><span><span style="color: #000000;">,id); </span></span>
</li>
<li>
<span><span style="color: #000000;">ps.setString(</span></span><span class="number"><span style="color: #c00000;">2</span></span><span><span style="color: #000000;">,name); </span></span>
</li>
<li>
<span><span style="color: #000000;">ps.setString(</span></span><span class="number"><span style="color: #c00000;">3</span></span><span><span style="color: #000000;">,sex); </span></span>
</li>
<li>
<span><span style="color: #000000;">ps.setInt(</span></span><span class="number"><span style="color: #c00000;">4</span></span><span><span style="color: #000000;">,age); </span></span>
</li>
<li><span><span style="color: #000000;">} </span></span></li>
<li><span><span style="color: #000000;">});</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">final String id = user.getId();
final String name = user.getName();
final String sex = user.getSex() + "";
final int age = user.getAge();

jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
                     new PreparedStatementSetter() {
                         public void setValues(PreparedStatement ps) throws SQLException {
                             ps.setString(1, id);
                             ps.setString(2, name);         
                             ps.setString(3, sex);
                             ps.setInt(4, age);
                         }
                     });

</pre>
<p><br></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">final</span></strong></span><span><span style="color: #000000;">Useruser=</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">User(); </span></span></span></li>
<li>
<span><span style="color: #000000;">jdbcTemplate.query(</span></span><span class="string"><span style="color: #0000ff;">"SELECT*FROMUSERWHEREuser_id=?"</span></span><span><span style="color: #000000;">, </span></span>
</li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">Object[]{id}, </span></span>
</li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">RowCallbackHandler(){ </span></span>
</li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">void</span></strong></span><span><span style="color: #000000;">processRow(ResultSetrs)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">SQLException{ </span></span>
</li>
<li>
<span><span style="color: #000000;">user.setId(rs.getString(</span></span><span class="string"><span style="color: #0000ff;">"user_id"</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li>
<span><span style="color: #000000;">user.setName(rs.getString(</span></span><span class="string"><span style="color: #0000ff;">"name"</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li>
<span><span style="color: #000000;">user.setSex(rs.getString(</span></span><span class="string"><span style="color: #0000ff;">"sex"</span></span><span><span style="color: #000000;">).charAt(</span></span><span class="number"><span style="color: #c00000;">0</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li>
<span><span style="color: #000000;">user.setAge(rs.getInt(</span></span><span class="string"><span style="color: #0000ff;">"age"</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li><span><span style="color: #000000;">} </span></span></li>
<li><span><span style="color: #000000;">});</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">final User user = new User();
jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",
                    new Object[] {id},
                    new RowCallbackHandler() {
                        public void processRow(ResultSet rs) throws SQLException {
                            user.setId(rs.getString("user_id"));
                            user.setName(rs.getString("name"));
                            user.setSex(rs.getString("sex").charAt(0));
                            user.setAge(rs.getInt("age"));
                        }
                    });

</pre>
<p><br><br><br></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">class</span></strong></span><span><span style="color: #000000;">UserRowMapper</span></span><span class="keyword"><strong><span style="color: #7f0055;">implements</span></strong></span><span><span style="color: #000000;">RowMapper{ </span></span></span></li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;">ObjectmapRow(ResultSetrs,</span></span><span class="keyword"><strong><span style="color: #7f0055;">int</span></strong></span><span><span style="color: #000000;">index)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">SQLException{ </span></span>
</li>
<li>
<span><span style="color: #000000;">Useruser=</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">User(); </span></span>
</li>
<li><span><span style="color: #000000;"></span></span></li>
<li>
<span><span style="color: #000000;">user.setId(rs.getString(</span></span><span class="string"><span style="color: #0000ff;">"user_id"</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li>
<span><span style="color: #000000;">user.setName(rs.getString(</span></span><span class="string"><span style="color: #0000ff;">"name"</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li>
<span><span style="color: #000000;">user.setSex(rs.getString(</span></span><span class="string"><span style="color: #0000ff;">"sex"</span></span><span><span style="color: #000000;">).charAt(</span></span><span class="number"><span style="color: #c00000;">0</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li>
<span><span style="color: #000000;">user.setAge(rs.getInt(</span></span><span class="string"><span style="color: #0000ff;">"age"</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li><span><span style="color: #000000;"></span></span></li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">return</span></strong></span><span><span style="color: #000000;">user; </span></span>
</li>
<li><span><span style="color: #000000;">} </span></span></li>
<li><span><span style="color: #000000;">} </span></span></li>
<li><span><span style="color: #000000;"></span></span></li>
<li>
<span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;">ListfindAllByRowMapperResultReader(){ </span></span>
</li>
<li>
<span><span style="color: #000000;">Stringsql=</span></span><span class="string"><span style="color: #0000ff;">"SELECT*FROMUSER"</span></span><span><span style="color: #000000;">; </span></span>
</li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">return</span></strong></span><span><span style="color: #000000;">jdbcTemplate.query(sql,</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">RowMapperResultReader(</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">UserRowMapper())); </span></span>
</li>
<li><span><span style="color: #000000;">}</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">class UserRowMapper implements RowMapper {
    public Object mapRow(ResultSet rs, int index) throws SQLException {
        User user = new User();

        user.setId(rs.getString("user_id"));
        user.setName(rs.getString("name"));
        user.setSex(rs.getString("sex").charAt(0));
        user.setAge(rs.getInt("age"));

        return user;
    }
}

public List findAllByRowMapperResultReader() {
    String sql = "SELECT * FROM USER";
    return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
}

</pre>
<p><br><br>在getUser(id)里面使用UserRowMapper</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;">UsergetUser(</span></span><span class="keyword"><strong><span style="color: #7f0055;">final</span></strong></span><span><span style="color: #000000;">Stringid)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">DataAccessException{ </span></span></span></li>
<li>
<span><span style="color: #000000;">Stringsql=</span></span><span class="string"><span style="color: #0000ff;">"SELECT*FROMUSERWHEREuser_id=?"</span></span><span><span style="color: #000000;">; </span></span>
</li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">final</span></strong></span><span><span style="color: #000000;">Object[]params=</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">Object[]{id}; </span></span>
</li>
<li>
<span><span style="color: #000000;">Listlist=jdbcTemplate.query(sql,params,</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">RowMapperResultReader(</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">UserRowMapper())); </span></span>
</li>
<li><span><span style="color: #000000;"></span></span></li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">return</span></strong></span><span><span style="color: #000000;">(User)list.get(</span></span><span class="number"><span style="color: #c00000;">0</span></span><span><span style="color: #000000;">); </span></span>
</li>
<li><span><span style="color: #000000;">}</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;">public User getUser(final String id) throws DataAccessException {
    String sql = "SELECT * FROM USER WHERE user_id=?";
    final Object[] params = new Object[] { id };
    List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));

    return (User) list.get(0);
}
</pre>
<p><br><br>网上收集 <br>org.springframework.jdbc.core.PreparedStatementCreator 返回预编译SQL 不能于Object[]一起用</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;">PreparedStatementcreatePreparedStatement(Connectioncon)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">SQLException{ </span></span></span></li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">return</span></strong></span><span><span style="color: #000000;">con.prepareStatement(sql); </span></span>
</li>
<li><span><span style="color: #000000;">}</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;"> public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
  return con.prepareStatement(sql);
}
</pre>
<p><br>1.增删改 <br>org.springframework.jdbc.core.JdbcTemplate 类(必须指定数据源dataSource)</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">template.update(</span></span><span class="string"><span style="color: #0000ff;">"insertintoweb_personvalues(?,?,?)"</span></span><span><span style="color: #000000;">,Object[]);</span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none;"> template.update("insert into web_person values(?,?,?)",Object[]);
</pre>
<p><br> 或</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">template.update(</span></span><span class="string"><span style="color: #0000ff;">"insertintoweb_personvalues(?,?,?)"</span></span><span><span style="color: #000000;">,</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">PreparedStatementSetter(){匿名内部类只能访问外部最终局部变量 </span></span></span></li>
<li><span><span style="color: #000000;"></span></span></li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">void</span></strong></span><span><span style="color: #000000;">setValues(PreparedStatementps)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">SQLException{ </span></span>
</li>
<li>
<span><span style="color: #000000;">ps.setInt(index++,</span></span><span class="number"><span style="color: #c00000;">3</span></span><span><span style="color: #000000;">); </span></span>
</li>
<li><span><span style="color: #000000;">});</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;"> template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名内部类 只能访问外部最终局部变量

  public void setValues(PreparedStatement ps) throws SQLException {
   ps.setInt(index++,3);
});
</pre>
<p><br>org.springframework.jdbc.core.PreparedStatementSetter 接口 处理预编译SQL</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">void</span></strong></span><span><span style="color: #000000;">setValues(PreparedStatementps)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">SQLException{ </span></span></span></li>
<li>
<span><span style="color: #000000;">ps.setInt(index++,</span></span><span class="number"><span style="color: #c00000;">3</span></span><span><span style="color: #000000;">); </span></span>
</li>
<li><span><span style="color: #000000;">}</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;"> public void setValues(PreparedStatement ps) throws SQLException {
  ps.setInt(index++,3);
}
</pre>
<p><br>2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler) <br>org.springframework.jdbc.core.RowMapper 记录映射接口 处理结果集</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;">ObjectmapRow(ResultSetrs,</span></span><span class="keyword"><strong><span style="color: #7f0055;">int</span></strong></span><span><span style="color: #000000;">arg1)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">SQLException{</span></span><span class="keyword"><strong><span style="color: #7f0055;">int</span></strong></span><span><span style="color: #000000;">表当前行数 </span></span></span></li>
<li>
<span><span style="color: #000000;">person.setId(rs.getInt(</span></span><span class="string"><span style="color: #0000ff;">"id"</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li><span><span style="color: #000000;">} </span></span></li>
<li>
<span><span style="color: #000000;">Listtemplate.query(</span></span><span class="string"><span style="color: #0000ff;">"select*fromweb_personwhereid=?"</span></span><span><span style="color: #000000;">,Object[],RowMapper);</span></span>
</li>
</ol>
</div>
<pre class="java" style="display: none;"> public Object mapRow(ResultSet rs, int arg1) throws SQLException {   int表当前行数
   person.setId(rs.getInt("id"));
}
List template.query("select * from web_person where id=?",Object[],RowMapper);
</pre>
<p><br>org.springframework.jdbc.core.RowCallbackHandler 记录回调管理器接口 处理结果集</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://www.javaeye.com/topic/53526#"><img src="http://www.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span><span style="color: #000000;">template.query(</span></span><span class="string"><span style="color: #0000ff;">"select*fromweb_personwhereid=?"</span></span><span><span style="color: #000000;">,Object[],</span></span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span><span style="color: #000000;">RowCallbackHandler(){ </span></span></span></li>
<li>
<span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span><span style="color: #000000;"></span></span><span class="keyword"><strong><span style="color: #7f0055;">void</span></strong></span><span><span style="color: #000000;">processRow(ResultSetrs)</span></span><span class="keyword"><strong><span style="color: #7f0055;">throws</span></strong></span><span><span style="color: #000000;">SQLException{ </span></span>
</li>
<li>
<span><span style="color: #000000;">person.setId(rs.getInt(</span></span><span class="string"><span style="color: #0000ff;">"id"</span></span><span><span style="color: #000000;">)); </span></span>
</li>
<li><span><span style="color: #000000;">});</span></span></li>
</ol>
</div>
<pre class="java" style="display: none;"> template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){
  public void processRow(ResultSet rs) throws SQLException {
   person.setId(rs.getInt("id"));
});
</pre>
<p></p>
</span></p>
<p></p>
分享到:
评论

相关推荐

    基于注解的Spring JdbcTemplate

    **基于注解的Spring JdbcTemplate** 在Java世界中,Spring框架是企业级应用开发的首选。Spring JDBC模絫提供了一种简洁的方式来处理数据库操作,而`Spring JdbcTemplate`是这个模絫的核心组件。本教程将深入探讨...

    spring-jdbcTemplate实例工程

    《深入解析Spring JdbcTemplate》 Spring JDBC Template是Spring框架中用于简化JDBC操作的一个核心组件,它是Spring对JDBC API的封装,旨在提供一个更加简洁、健壮且可测试的数据库访问层。在这个实例工程中,我们...

    SpringJdbcTemplate封装工具类

    "更新记录.docx"文件可能是项目开发过程中对SpringJdbcTemplate封装工具类的修改日志,记录了每次更新的功能改进、bug修复或性能优化等内容,这对于版本管理和问题排查非常有帮助。 通过上述分析,我们可以看到...

    Spring JdbcTemplate 常用方法整理

    Spring的JdbcTemplate是Spring框架中用于简化数据库操作的工具类,它是基于JDBC但又抽象出了一层,避免了直接与数据库驱动API交互,从而提高了代码的可读性和可维护性。本文将深入探讨Spring JdbcTemplate的常用方法...

    Spring JDBCTemplate连接池jar包

    3. `spring-jdbc-5.0.0.RELEASE.jar`:包含Spring对JDBC的支持,包括JDBCTemplate和DataSourceTransactionManager,它们是与数据库交互和管理事务的关键。 4. `spring-tx-5.0.0.RELEASE.jar`:提供了事务管理功能,...

    Spring JdbcTemplate调用Oracle存储过程实现CRUD

    使用 Spring JdbcTemplate 调用 Oracle 存储过程实现 CRUD 在本文中,我们将讨论如何使用 Spring JdbcTemplate 调用 Oracle 存储过程来实现 CRUD(Create、Read、Update、Delete)操作。我们将首先编写 Oracle 存储...

    strut2+spring+springjdbctemplate做的简易登录系统

    Struts2、Spring和Spring JDBC Template是Java Web开发中常用的三个框架,它们分别负责不同的职责。Struts2作为MVC(Model-View-Controller)框架,主要处理前端请求和业务逻辑;Spring则是一个全面的后端框架,提供...

    Spring JdbcTemplate查询实例

    Spring JdbcTemplate是Spring框架中用于简化数据库操作的一个重要组件,它是Spring对JDBC的轻量级封装,旨在提供一种结构良好、易于使用的SQL执行机制,同时保持了JDBC的灵活性。在本实例中,我们将深入探讨Spring ...

    Spring JdbcTemplate例子

    Spring JdbcTemplate是Spring框架中的一个核心组件,主要用来简化数据库操作。它提供了一种模板方法设计模式,将SQL语句的执行与结果处理进行了抽象,使得开发者可以更加专注于业务逻辑,而无需关心底层数据访问的...

    模仿spring jdbcTemplate的实现

    模仿spring jdbcTemplate的粗略实现,只有很小的参考价值,如果是java初学者可以使用这个封装好的工具进行数据库操作,只需要在db.properties里配置好driver,url等信息

    使用Spring JDBCTemplate进行增删改查curd操作

    如果数据库操作失败,JdbcTemplate会抛出异常,如`DataAccessException`,使得我们可以快速定位并处理问题。 总结来说,Spring JdbcTemplate通过提供一套简单易用的API,极大地简化了数据库操作,同时保证了代码的...

    Spring JdbcTemplate api

    根据给定的文件信息,以下是对“Spring JdbcTemplate API”的详细知识点解析: ### Spring JdbcTemplate API:数据库操作的模板模式 #### 概述 在Spring框架中,`JdbcTemplate`是一个用于简化JDBC编程的工具类,...

    spring的jdbcTemplate小案例

    在本文中,我们将深入探讨Spring框架中的一个核心组件——JdbcTemplate。JdbcTemplate是Spring提供的一种数据库操作工具,它简化了数据库访问,使开发者能够编写出更健壮、更易于维护的代码,避免了手动处理JDBC连接...

    Spring jdbcTemplate pom.xml

    1.Spring4前 spring-jdbc包是独立的,4以后spring-jdbc 就已经没有了

    spring jdbcTemplate 源码

    Spring JDBCTemplate是Spring框架中的一个核心组件,它提供了一种简化数据库操作的抽象层,使得开发者可以更加方便、高效地处理数据库事务。本篇将深入探讨Spring JDBCTemplate的使用及其源码解析,帮助你理解其背后...

    Spring JdbcTemplate

    在Spring JdbcTemplate中,良好的日志配置可以帮助我们追踪SQL执行情况,排查问题。例如,你可以配置日志级别(DEBUG, INFO, WARN等),指定日志输出位置,以及决定是否记录SQL语句和执行时间等信息。 **4. ...

    使用Spring的JdbcTemplate实现分页功能

    使用Spring的JdbcTemplate实现分页功能

    spring JdbcTemplate query方法使用示例

    spring JdbcTemplate query方法使用示例,欢迎下载借鉴

    Spring 学习 JdbcTemplate,模板模式,回调

    本主题将深入探讨Spring框架中的JdbcTemplate组件,以及模板模式和回调机制的概念。 **1. Spring JdbcTemplate** JdbcTemplate是Spring提供的一个用于简化数据库操作的API,它是Spring对JDBC(Java Database ...

    spring jdbcTemplate

    《Spring JdbcTemplate 深入解析与实战应用》 在Java世界中,Spring框架以其强大的功能和灵活性,深受广大开发者的喜爱。其中,Spring JDBC Template是Spring提供的一个用于简化数据库操作的工具,它抽象了JDBC API...

Global site tag (gtag.js) - Google Analytics