<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wet Feet - Online Marketing and Technology Blog &#187; jdbc</title>
	<atom:link href="http://www.wetfeetblog.com/tag/jdbc/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wetfeetblog.com</link>
	<description></description>
	<lastBuildDate>Wed, 19 May 2010 15:34:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Spring JDBC Template &#8211; A leaner alternative to fat Hibernate</title>
		<link>http://www.wetfeetblog.com/spring-jdbc-template-leaner-alternative-fat-hibernate/328</link>
		<comments>http://www.wetfeetblog.com/spring-jdbc-template-leaner-alternative-fat-hibernate/328#comments</comments>
		<pubDate>Tue, 23 Feb 2010 14:00:12 +0000</pubDate>
		<dc:creator>Tomas Mazukna</dc:creator>
				<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[JDO]]></category>

		<guid isPermaLink="false">http://www.wetfeetblog.com/?p=328</guid>
		<description><![CDATA[Objective This post will show you how to use Spring JDBC Template to perform real world CRUD operations. I hope I can show you that you do not need overweight Hibernate to interact with database of your choice. The Problem Domain Almost all application I have coded needed to store and get data of some [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.wetfeetblog.com/wp-content/uploads/2010/02/network_server_2.jpg" alt="" title="network_server_2" width="300" height="225" class="float-right" /></p>
<h3>Objective</h3>
<p>This post will show you how to use Spring JDBC Template to perform real world CRUD operations. I hope I can show you that you do not need overweight Hibernate to interact with database of your choice.</p>
<h3>The Problem Domain</h3>
<p>Almost all application I have coded needed to store and get data of some sort. In most cases it was relational database. With hibernate being all the rage these days I have used it in multiple projects with varying degree of problems and success. In <strong>my personal</strong> opinion hibernate tries to solve a problem that really is not there. If you can not wire SQL you should not be using Hibernate or be doing any software development.<br />
<span id="more-328"></span><br />
I advise the use of Spring JDBC templates. In essence Spring JDBC Template will offload all the mundane steps of database access from you shoulders only requiring you to write SQL and move data from result set into your model objects. Here is how Spring documentation describes responsibilities:</p>
<table summary="Spring JDBC - who does what?" style="border-collapse: collapse;border-top: 0.5pt solid ; border-bottom: 0.5pt solid ; border-left: 0.5pt solid ; border-right: 0.5pt solid ; " width="80%">
<colgroup>
<col>
<col>
<col></colgroup>
<thead>
<tr>
<th style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">Action</th>
<th style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">Spring</th>
<th style="border-bottom: 0.5pt solid ; " align="center">You</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Define connection parameters.</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center"><span class="bold"><strong></strong></span></td>
<td style="border-bottom: 0.5pt solid ; " align="center">X</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Open the connection.</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">X</td>
<td style="border-bottom: 0.5pt solid ; " align="center">&nbsp;</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Specify the SQL statement.</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">&nbsp;</td>
<td style="border-bottom: 0.5pt solid ; " align="center">X</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Declare parameters and provide parameter values</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">&nbsp;</td>
<td style="border-bottom: 0.5pt solid ; " align="center">X</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Prepare and execute the statement.</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">X</td>
<td style="border-bottom: 0.5pt solid ; " align="center">&nbsp;</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Set up the loop to iterate through the results (if any).</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">X</td>
<td style="border-bottom: 0.5pt solid ; " align="center">&nbsp;</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Do the work for each iteration.</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">&nbsp;</td>
<td style="border-bottom: 0.5pt solid ; " align="center">X</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Process any exception.</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">X</td>
<td style="border-bottom: 0.5pt solid ; " align="center">&nbsp;</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="left">Handle transactions.</td>
<td style="border-right: 0.5pt solid ; border-bottom: 0.5pt solid ; " align="center">X</td>
<td style="border-bottom: 0.5pt solid ; " align="center">&nbsp;</td>
</tr>
<tr>
<td style="border-right: 0.5pt solid ; " align="left">Close the connection, statement and resultset.</td>
<td style="border-right: 0.5pt solid ; " align="center">X</td>
<td style="" align="center">&nbsp;</td>
</tr>
</tbody>
</table>
<p><br/></p>
<h3>CRUD Example with Spring JDBC Template</h3>
<p>For this example you will need spring-core, spring-tx and spring-aop components. We will use spring-tx to manage the transaction so we can get back the auto generated IDs of the persisted objects and aop to set up the transaction management. Here is meat for spring configuration file:</p>
<pre>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">id</span>=<span class="st0">&quot;propertyPlaceholder&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp;<span class="re0">class</span>=<span class="st0">&quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&quot;</span> <span class="re2">&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;location&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;/WEB-INF/config.properties&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">id</span>=<span class="st0">&quot;mysqlDataSource&quot;</span> <span class="re0">class</span>=<span class="st0">&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp;<span class="re0">destroy-method</span>=<span class="st0">&quot;close&quot;</span><span class="re2">&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;driverClass&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;com.mysql.jdbc.Driver&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;jdbcUrl&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${database.url}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;user&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${database.user}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;password&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${database.password}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;initialPoolSize&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${database.connections.start}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;maxPoolSize&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;${database.connections.max}&quot;</span><span class="re2">/&gt;</span></span> &nbsp;
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;idleConnectionTestPeriod&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;270&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">id</span>=<span class="st0">&quot;txManager&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp;<span class="re0">class</span>=<span class="st0">&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;</span> <span class="re2">&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;dataSource&quot;</span> <span class="re0">ref</span>=<span class="st0">&quot;mysqlDataSource&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;tx:advice</span> <span class="re0">id</span>=<span class="st0">&quot;txAdvice&quot;</span> <span class="re0">transaction-manager</span>=<span class="st0">&quot;txManager&quot;</span><span class="re2">&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;tx:attributes<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc-1">&lt;!-- all methods starting with 'get' are read-only --&gt;</span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;tx:method</span> <span class="re0">name</span>=<span class="st0">&quot;get*&quot;</span> <span class="re0">read-only</span>=<span class="st0">&quot;true&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;tx:method</span> <span class="re0">name</span>=<span class="st0">&quot;list*&quot;</span> <span class="re0">read-only</span>=<span class="st0">&quot;true&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; <span class="sc-1">&lt;!-- other methods use the default transaction settings (see below) --&gt;</span>
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;tx:method</span> <span class="re0">name</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/tx:attributes<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/tx:advice<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;aop:config<span class="re2">&gt;</span></span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;aop:pointcut</span> <span class="re0">id</span>=<span class="st0">&quot;uOwnerDataSvcOperation&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp; &nbsp;<span class="re0">expression</span>=<span class="st0">&quot;execution(* com.es.rto.dao.UOwnerDataServiceImpl.*(..))&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;aop:advisor</span> <span class="re0">advice-ref</span>=<span class="st0">&quot;txAdvice&quot;</span> <span class="re0">pointcut-ref</span>=<span class="st0">&quot;uOwnerDataSvcOperation&quot;</span><span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/aop:config<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">id</span>=<span class="st0">&quot;namedTemplate&quot;</span> </span>
<span class="sc3"> &nbsp; &nbsp;<span class="re0">class</span>=<span class="st0">&quot;org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate&quot;</span><span class="re2">&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;constructor-arg</span> <span class="re0">index</span>=<span class="st0">&quot;0&quot;</span> <span class="re0">ref</span>=<span class="st0">&quot;mysqlDataSource&quot;</span><span class="re2">/&gt;</span></span> &nbsp; 
<span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">id</span>=<span class="st0">&quot;qandADao&quot;</span> <span class="re0">class</span>=<span class="st0">&quot;com.es.rto.dao.QandADao&quot;</span> <span class="re2">&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;jdbcTemplate&quot;</span> <span class="re0">ref</span>=<span class="st0">&quot;namedTemplate&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span>

<span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">id</span>=<span class="st0">&quot;uOwnerDataSvc&quot;</span> <span class="re0">class</span>=<span class="st0">&quot;com.es.rto.dao.UOwnerDataServiceImpl&quot;</span> <span class="re2">&gt;</span></span>
&nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;qandADao&quot;</span> <span class="re0">ref</span>=<span class="st0">&quot;qandADao&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span></div>
</div>
</pre>
<p>First thing we do we load our config.properties file where we have database configuration defined. Second we define a pooled data source to connect to mysql database. Third bean is a transaction manager that is watching our data source from the step two. Next we set up our transaction manager. We instruct transaction manager that methods starting with &#8220;get&#8221; and &#8220;list&#8221; are read only. This means that they will not be subject to transaction management. Then we define named jdbc template and pass in the data source as first constructor argument and then pass in the template into our own DAO bean.</p>
<h3>Why do we need Transaction Management?</h3>
<p>When we create a new row in a mysql table with autoincrement id value we need a way to get that auto generated id. To do so we need to query the database using same connection. When we use jdbcTemplate.update() or jdbcTemplate.query() it will check out a connection form the pool execute the query, process the results and return this connection to the pool. So if we do update() and then get() to query &#8220;SELECT LAST_INSERT_ID()&#8221; we will get another connection, which is a problem since we need to do this on the same connection to get the right id. This is where the transaction comes in. Instead of releasing connection back to the pool spring will hold on to it until we are done with it.</p>
<h3>Java code side of the Spring JDBC template</h3>
<p> We will use 3 beans to illustrate the scenario: question, answer and user.</p>
<pre>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> Question <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> questionId<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> categoryId<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> userId<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> areaId<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> question<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> verifyKey<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Adate+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Date</span></a> created<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> User user<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> List<span class="sy0">&lt;</span>Answer<span class="sy0">&gt;</span> answers<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> answerCount<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> name<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// getters and setters omited...</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> Answer <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> answerId<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> questionId<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> userId<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> answer<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> verifyKey<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> url<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Adate+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Date</span></a> created<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> User user<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> name<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// getters and setters omited...</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> User <span class="kw1">implements</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aserializable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Serializable</span></a> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">long</span> id<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> email<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> retypeE<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> name<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> password<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> password2<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> verifyKey<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> buyer<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> seller<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> active<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> privacy<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">int</span> pageSize <span class="sy0">=</span> <span class="nu0">20</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> next<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> administrator<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// getters and setters omited...</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Here are the 2 classes that do all the work:</p>
<pre>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> QandADao <span class="br0">&#123;</span>

&nbsp; <span class="kw1">private</span> <span class="kw1">final</span> Logger logger <span class="sy0">=</span> Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span>QandADao.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; <span class="kw1">protected</span> NamedParameterJdbcTemplate jdbcTemplate <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span>
&nbsp; 

&nbsp; @SuppressWarnings<span class="br0">&#40;</span><span class="st0">&quot;unchecked&quot;</span><span class="br0">&#41;</span>
&nbsp; <span class="kw1">public</span> List<span class="sy0">&lt;</span>Question<span class="sy0">&gt;</span> getQuestions<span class="br0">&#40;</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> search, <span class="kw4">int</span> page, <span class="kw4">int</span> step <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">try</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; MapSqlParameterSource params <span class="sy0">=</span> <span class="kw1">new</span> MapSqlParameterSource<span class="br0">&#40;</span> <span class="st0">&quot;search&quot;</span>, <span class="st0">&quot;%&quot;</span><span class="sy0">+</span>search<span class="sy0">+</span><span class="st0">&quot;%&quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sql <span class="sy0">=</span> <span class="st0">&quot;SELECT q.*, count( a.answer_id ) as answers, u.name, u.seller &nbsp;FROM users u, questions q LEFT JOIN answers a &quot;</span><span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; <span class="st0">&quot;ON &nbsp;a.question_id = q.question_id WHERE a.answer LIKE :search AND q.user_id = u.id &quot;</span><span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; <span class="st0">&quot;GROUP BY q.question_id, q.category_id, q.user_id, q.question, q.created, q.area_id, u.name, u.seller &quot;</span><span class="sy0">+</span> &nbsp;
&nbsp; &nbsp; &nbsp; <span class="st0">&quot;UNION &quot;</span><span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; <span class="st0">&quot;SELECT q.*, count( a.answer_id ) as answers, u.name, u.seller &nbsp;FROM users u, questions q LEFT JOIN answers a &quot;</span><span class="sy0">+</span> 
&nbsp; &nbsp; &nbsp; <span class="st0">&quot;ON &nbsp;a.question_id = q.question_id WHERE q.question LIKE :search AND q.user_id = u.id &quot;</span><span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; <span class="st0">&quot;GROUP BY q.question_id, q.category_id, q.user_id, q.question, q.created, q.area_id, u.name, u.seller &quot;</span><span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; <span class="st0">&quot;LIMIT &quot;</span><span class="sy0">+</span><span class="br0">&#40;</span>step<span class="sy0">*</span><span class="br0">&#40;</span>page<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;, &quot;</span><span class="sy0">+</span>step<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span> sql <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> jdbcTemplate.<span class="me1">query</span><span class="br0">&#40;</span>sql, params, <span class="kw1">new</span> RowMappers.<span class="me1">QuestionsMapper</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span> DataAccessException exc <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; logger.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;FAILED to get Question List&quot;</span>, exc<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> ArrayList<span class="sy0">&lt;</span>Question<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span>

&nbsp; <span class="kw1">public</span> Question saveQuestion<span class="br0">&#40;</span> Question question <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">try</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; BeanPropertySqlParameterSource namedParameters <span class="sy0">=</span> <span class="kw1">new</span> BeanPropertySqlParameterSource<span class="br0">&#40;</span>question<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sql<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> question.<span class="me1">getQuestionId</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="nu0">0</span> <span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; sql <span class="sy0">=</span> <span class="st0">&quot;INSERT INTO questions ( category_id, user_id, question, area_id, uname ) VALUES ( :categoryId, :userId, :question, :areaId, :name )&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; &nbsp; &nbsp; sql <span class="sy0">=</span> <span class="st0">&quot;UPDATE questions SET question=:question, category_id=:categoryId, area_id=:areaId WHERE question_id=:questionId&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span> sql <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; jdbcTemplate.<span class="me1">update</span><span class="br0">&#40;</span>sql, namedParameters<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span> question.<span class="me1">getQuestionId</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> 0 <span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; question.<span class="me1">setQuestionId</span><span class="br0">&#40;</span> <span class="kw1">this</span>.<span class="me1">getInsertedID</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span> DataAccessException exc <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; logger.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;SAVE answer FAILED!&quot;</span>, exc<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> exc<span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">return</span> question<span class="sy0">;</span>
&nbsp; <span class="br0">&#125;</span>

&nbsp; <span class="kw1">protected</span> <span class="kw4">long</span> getInsertedID<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> jdbcTemplate.<span class="me1">queryForLong</span><span class="br0">&#40;</span> <span class="st0">&quot;SELECT LAST_INSERT_ID()&quot;</span> , <span class="kw1">new</span> MapSqlParameterSource<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; 
<span class="br0">&#125;</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> RowMappers <span class="br0">&#123;</span>

&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">final</span> <span class="kw1">class</span> QuestionMapper <span class="kw1">implements</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arowmapper+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">RowMapper</span></a> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> mapRow<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aresultset+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ResultSet</span></a> rs, <span class="kw4">int</span> rowNum<span class="br0">&#41;</span> <span class="kw1">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asqlexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">SQLException</span></a> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Question q <span class="sy0">=</span> <span class="kw1">new</span> Question<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; q.<span class="me1">setQuestionId</span><span class="br0">&#40;</span>rs.<span class="me1">getLong</span><span class="br0">&#40;</span> <span class="st0">&quot;question_id&quot;</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; q.<span class="me1">setCategoryId</span><span class="br0">&#40;</span>rs.<span class="me1">getLong</span><span class="br0">&#40;</span> <span class="st0">&quot;category_id&quot;</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; q.<span class="me1">setUserId</span><span class="br0">&#40;</span>rs.<span class="me1">getLong</span><span class="br0">&#40;</span> <span class="st0">&quot;user_id&quot;</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; q.<span class="me1">setAreaId</span><span class="br0">&#40;</span> rs.<span class="me1">getLong</span><span class="br0">&#40;</span><span class="st0">&quot;area_id&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; q.<span class="me1">setQuestion</span><span class="br0">&#40;</span> rs.<span class="me1">getString</span><span class="br0">&#40;</span><span class="st0">&quot;question&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; q.<span class="me1">setCreated</span><span class="br0">&#40;</span> rs.<span class="me1">getTimestamp</span><span class="br0">&#40;</span> <span class="st0">&quot;created&quot;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; q.<span class="me1">setName</span><span class="br0">&#40;</span> rs.<span class="me1">getString</span><span class="br0">&#40;</span><span class="st0">&quot;uname&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; User u <span class="sy0">=</span> <span class="kw1">new</span> User<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; u.<span class="me1">setName</span><span class="br0">&#40;</span> rs.<span class="me1">getString</span><span class="br0">&#40;</span><span class="st0">&quot;name&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; u.<span class="me1">setSeller</span><span class="br0">&#40;</span> rs.<span class="me1">getBoolean</span><span class="br0">&#40;</span><span class="st0">&quot;seller&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; u.<span class="me1">setId</span><span class="br0">&#40;</span>q.<span class="me1">getUserId</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; q.<span class="me1">setUser</span><span class="br0">&#40;</span>u<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> q<span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span> 
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>So what is going on here? Lets look at the <strong>QuestionMapper</strong>. It implements one method &#8211; mapRow. Its hob is to process a single row of the result set. As you see here we create a Question bean and a User bean which is included in the Questions bean. It can not be more strait forward then this.</p>
<p><strong>QandADao</strong> is the class where all the magic happens. First lets examine the getQuestions() method. First we define query parameter(s) using MapSqlParameterSource class. We simply put the values in the map and jdbc template will pull them out by the key. Next we write our sql query. In this case iti is pretty complex to pull out any questions where either question or the answer have the thing we are searching for. We use union to be able to pull out  the questions without the answers. Lastly we call query method on the jdbc template and we pass in our query, parameters and the row mapper instance. Spring takes care of all the plumbing. What we get out of this call is a list of Question objects.</p>
<p>saveQuestion() method is not much different. In this case we use BeanPropertySqlParameterSource which maps bean properties to sql parameters. If you define a sql parameter &#8220;name&#8221; your bean should have &#8220;getName()&#8221; method. Instead of calling query() we call update() on the jdbc template which only takes sql and the parameters.</p>
<h3>Conclusion</h3>
<p>You may have noticed that the effort to use the Spring approach to JDCB is very simple, flexible and powerful. You have all the control in all the right places! You write the sql with all the performance hints and tweaks, you write code how to transfer results to the domain objects the way you need it or like it. I only mentioned about one tenth of the options you have with spring. <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html">Read The Fine Manual (RTFM)</a> to explore the full potential.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wetfeetblog.com/spring-jdbc-template-leaner-alternative-fat-hibernate/328/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
