<?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>Java crumbs &#187; JDBC</title>
	<atom:link href="http://blog.krecan.net/tag/jdbc/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.krecan.net</link>
	<description>Short remarks from Java world</description>
	<lastBuildDate>Tue, 31 Jan 2012 20:13:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Selects are IN</title>
		<link>http://blog.krecan.net/2008/05/10/selects-are-in/</link>
		<comments>http://blog.krecan.net/2008/05/10/selects-are-in/#comments</comments>
		<pubDate>Sat, 10 May 2008 16:52:06 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
				<category><![CDATA[Articles in English]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[SimpleJdbcTemplate]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/?p=71</guid>
		<description><![CDATA[Today it will be short. I will write about one small Spring feature that I have discovered recently. It is another nice functionality of SimpleJdbcTemplate. Imagine that you want to find all account with given account numbers. Since we want to gain maximal performance we want to do it in one SQL statement. SELECT ACCOUNT_NUMBER, [...]]]></description>
			<content:encoded><![CDATA[<p>Today it will be short. I will write about one small Spring feature that I have discovered recently.  It is another nice functionality of <a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/simple/SimpleJdbcTemplate.html">SimpleJdbcTemplate</a>. </p>
<p>Imagine that you want to find all account with given account numbers. Since we want to gain maximal performance we want to do it in one SQL statement. </p>
<p>SELECT ACCOUNT_NUMBER, BALANCE FROM ACCOUNT WHERE ACCOUNT_NUMBER IN (?, ?)</p>
<p>Using Spring it is easy. The only trouble is, that I do not know number of account numbers beforehand. Therefore I do not know the number of question marks needed in the SQL query. Of course I can create the statement dynamically using string manipulation, but the code would be messy. Fortunately Spring comes to rescue. If I use named parameters in SimpleJdbcTemplate, Spring will automatically do everything for me. So the code will be nice and simple as it should be</p>
<pre name="code" class="java">
	public List&lt;Account&gt; findAccounts(Set&lt;String&gt; accountNumbers)
	{
		return getSimpleJdbcTemplate().query(
				"SELECT ACCOUNT_NUMBER, BALANCE FROM ACCOUNT WHERE ACCOUNT_NUMBER IN (:accountNumbers)",
				ACCOUNT_ROW_MAPPER,
				Collections.singletonMap("accountNumbers", accountNumbers)
		);
	}
</pre>
<p>Nice, isn't it? Source code can be found in <a href="https://java-crumbs.svn.sourceforge.net/svnroot/java-crumbs/spring-demo/trunk/src/main/java/net/krecan/spring/jdbc">SVN</a>.  More details are in the <a href="http://static.springframework.org/spring/docs/2.5.x/reference/jdbc.html#jdbc-in-clause">Spring documentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/05/10/selects-are-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple JDBC template</title>
		<link>http://blog.krecan.net/2008/03/02/simple-jdbc-template/</link>
		<comments>http://blog.krecan.net/2008/03/02/simple-jdbc-template/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 09:36:15 +0000</pubDate>
		<dc:creator>Lukáš Křečan</dc:creator>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[SimpleJdbcTemplate]]></category>

		<guid isPermaLink="false">http://blog.krecan.net/2008/03/02/simple-jdbc-template/</guid>
		<description><![CDATA[Občas se mi stane, že nepotřebuji celou tu mašinérii kolem ORM. Chci jenom přistupovat do databáze. Zavolat pár insertů a pár selectů. V té chvíli přichází na řadu JDBC. Je samozřejmě možné používat JDBC přímo, ale jak říká Rod Johnson, je to „sackable offence“. (česky asi důvod k vyhazovu). Zvládnout bez chyby všechny ty try, [...]]]></description>
			<content:encoded><![CDATA[<p>	Občas se mi stane, že nepotřebuji celou tu mašinérii kolem ORM. Chci jenom přistupovat do databáze. Zavolat pár insertů a pár selectů. V té chvíli přichází na řadu JDBC. Je samozřejmě možné používat JDBC přímo, ale jak říká Rod Johnson, je to „sackable offence“. (česky asi důvod k vyhazovu). Zvládnout bez chyby všechny ty try, catche, finally, zavírání connection, result setů a kdoví čeho ještě je jen pro zkušené a velmi disciplinované vývojáře. Spring odjakživa poskytoval rozhranní <a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/JdbcTemplate.html">JdbcTemplate</a>, které krásně usnadňovalo volání JDBC a staralo se o všechnu tu nudnou a nebezpečnou práci se správou zdrojů. Chybělo mi tam ale několik věcí. První z nich bylo pojmenování parametrů jak je známe třeba z HQL. Prostě jsem místo všech těch otazníků v query chtěl psát jména parametrů. Chybělo mi také lepší provázanost s Javou 5 a generiky. (To mi mimochodem dost chybí i u JPA query, která je novější než Java 5).</p>
<p>	Nevím jestli se vám to také děje. Já když už umím nějakou technologii, tak se mi občas stane, že mi její zajímavé novinky občas uniknou. Podobně mi uniklo zavedení <a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/simple/SimpleJdbcTemplate.html">SimpleJdbcTemplate</a> do Springu 2.0. SimpleJdbcTemplate totiž všechny mé stesky řeší. Nejlépe si to ukážeme na příkladě (ten je převzatý z mého skvělého a nepostradatelného projektu <a href="http://www.mvnindex.org/">MvnIndex.org</a>, který si teď všichni povinně stáhnete a začnete ho používat, nebo se naštvu a už nikdy nic podobného nenapíšu). </p>
<p>Nejlepší je naimplementovat DAO, které rozšiřuje <a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/simple/SimpleJdbcDaoSupport.html">SimpleJdbcDaoSupport</a>. Tím si ušetříme spoustu práce, stačí nám už jen injektnout do této třídy DataSource. Pak už máme k dispozici SimpleJdbcTemplate a můžeme si dovolit například takovéto volání:</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#000000">List&lt;BasicArtifactInfo&gt;&nbsp;searchArtifacts</font><font color="#000000">(</font><font color="#000000">String&nbsp;searchExpression,&nbsp;PagingInfo&nbsp;pagingInfo</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Map&lt;String,Object&gt;&nbsp;args&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">HashMap&lt;String,&nbsp;Object&gt;</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">args.put</font><font color="#000000">(</font><font color="#2a00ff">&#34;searchExpression&#34;</font><font color="#000000">,&nbsp;</font><font color="#2a00ff">&#34;%&#34;</font><font color="#000000">+searchExpression+</font><font color="#2a00ff">&#34;%&#34;</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">args.put</font><font color="#000000">(</font><font color="#2a00ff">&#34;from&#34;</font><font color="#000000">,&nbsp;pagingInfo.getFrom</font><font color="#000000">())</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">args.put</font><font color="#000000">(</font><font color="#2a00ff">&#34;size&#34;</font><font color="#000000">,&nbsp;pagingInfo.getSize</font><font color="#000000">())</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>return&nbsp;</b></font><font color="#000000">getSimpleJdbcTemplate</font><font color="#000000">()</font><font color="#000000">.query</font><font color="#000000">(</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#2a00ff">&#34;select&nbsp;distinct&nbsp;group_id,&nbsp;artifact_id&nbsp;from&nbsp;ARTIFACT&nbsp;where&nbsp;artifact_id&nbsp;like&nbsp;:searchExpression&nbsp;or&nbsp;group_id&nbsp;like&nbsp;:searchExpression&nbsp;order&nbsp;by&nbsp;if(group_id&nbsp;like&nbsp;:searchExpression,&nbsp;0,&nbsp;1),&nbsp;group_id,&nbsp;artifact_id&nbsp;limit&nbsp;:from,&nbsp;:size&#34;</font><font color="#000000">,&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">BASIC_ARTIFACT_INFO_MAPPER&nbsp;,&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">args</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Vidíme že atributy dotazu dáme jednoduše do mapy, zavoláme dotaz, poskytneme mapovač výsledků a je to. V dotazu můžeme použít jména parametrů stejně jako to známe z HQL. Takže můžeme například psát „<code>... where artifact_id like :searchExpression or group_id like :searchExpression...</code>“.  Pro mapování výsledků musíme implementovat jednoduché rozhraní ParameterizedRowMapper. </p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;static&nbsp;final&nbsp;</b></font><font color="#000000">ParameterizedRowMapper&lt;BasicArtifactInfo&gt;&nbsp;BASIC_ARTIFACT_INFO_MAPPER&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">ParameterizedRowMapper&lt;BasicArtifactInfo&gt;</font><font color="#000000">(){</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#000000">BasicArtifactInfo&nbsp;mapRow</font><font color="#000000">(</font><font color="#000000">ResultSet&nbsp;rs,&nbsp;</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">rowNum</font><font color="#000000">)&nbsp;</font><font color="#7f0055"><b>throws&nbsp;</b></font><font color="#000000">SQLException&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>return&nbsp;new&nbsp;</b></font><font color="#000000">BasicArtifactInfo</font><font color="#000000">(</font><font color="#000000">rs.getString</font><font color="#000000">(</font><font color="#2a00ff">&#34;group_id&#34;</font><font color="#000000">)</font><font color="#000000">,&nbsp;rs.getString</font><font color="#000000">(</font><font color="#2a00ff">&#34;artifact_id&#34;</font><font color="#000000">))</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><font color="#000000">;</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Vidíme, že generika jsou tu plně podporována, takže si nemusíme dělat hlavu s přetypováváním, varováními překladače atp. Super ne? A to jsem zapomněl na to hlavní. Spring se mi postará o vytvoření PreparedStatementů, správu transakcí, mapování vyjímek a prostě o všechno na co jsme od něj zvyklí.</p>
<p>Takže pokud je pro vás Hibernate moc těžkopádný a nechcete se učit iBatis, pokud chcete jen volat JDBC, zkuste se podívat na SimpleJdbcTemplate, stojí to za to.</p>
<p><em>Celou třídu si můžete prohlédnout v <a href="http://m2-repoindex.svn.sourceforge.net/svnroot/m2-repoindex/trunk/mvnindex/server/mvnindex-indexer-server/src/main/java/net/krecan/mvnindex/indexer/dao/jdbc/JdbcArtifactInfoDao.java">SVN</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.krecan.net/2008/03/02/simple-jdbc-template/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

