<?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>Blog @ SIB Visions &#187; database</title>
	<atom:link href="http://blog.sibvisions.com/tag/database/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.sibvisions.com</link>
	<description>Blog @ SIB Visions</description>
	<lastBuildDate>Mon, 13 Apr 2026 09:47:01 +0000</lastBuildDate>
		<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JavaFX, JVx and data binding</title>
		<link>https://blog.sibvisions.com/2015/04/04/javafx-jvx-and-data-binding/</link>
		<comments>https://blog.sibvisions.com/2015/04/04/javafx-jvx-and-data-binding/#comments</comments>
		<pubDate>Sat, 04 Apr 2015 10:56:08 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Chart]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[TableView]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=4088</guid>
		<description><![CDATA[We made great progress with our JavaFX UI for JVx. The whole UI stuff was already implemented and worked with some known problems. The next thing was data binding because this should fill the gap between UI and business logic. This means: bindings for a table, tree, chart, editors, cell editors, cell renderers, ... (hard [...]]]></description>
			<content:encoded><![CDATA[<p>We made great progress with our JavaFX UI for JVx. The whole UI stuff was already implemented and worked with some known problems. The next thing was data binding because this should fill the gap between UI and business logic. This means: bindings for a table, tree, chart, editors, cell editors, cell renderers, ... (hard work).</p>
<p>The data controls of JavaFX were very useful and we didn't implement our own controls because standard controls were working. Sure, we had a different model in JVx than the "model" in JavaFX, but also Swing and vaadin had different models. We're experts in such things.</p>
<p>We started with the table, because a table implementation should be easy without CRUD operations and of course, it was easy. The next thing was the integration of our cell renderers and cell editors because a date field should automatically use a date editor and a number field should use a number(only) editor. The same applies for checkboxes and comboboxes. This was a hard job because JavaFX' table had different concepts than e.g. swing. We're still working on the last bits but most functionality was implemented.</p>
<p>It's already possible to bind a database table/view to a JavaFX TableView without additional JDBC, ORM. Thanks to JVx, this works with all supported architectures (mem, 2-tier, 3-tier). Here's a first impression, followed by the source code:</p>
<div id="attachment_4089" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/04/fx_tableview.png" rel="lightbox[4088]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/04/fx_tableview-300x166.png" alt="TableView bound to JVx&#039; DataBook" title="fx_tableview" width="300" height="166" class="size-medium wp-image-4089" /></a><p class="wp-caption-text">TableView bound to JVx' DataBook</p></div>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">UITable table <span class="sy0">=</span> <span class="kw1">new</span> UITable<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
table.<span class="me1">setDataBook</span><span class="br0">&#40;</span>dataBook<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>UIFormLayout editorsPaneLayout <span class="sy0">=</span> <span class="kw1">new</span> UIFormLayout<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
editorsPaneLayout.<span class="me1">setNewlineCount</span><span class="br0">&#40;</span>2<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>UIPanel editorsPane <span class="sy0">=</span> <span class="kw1">new</span> UIPanel<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
editorsPane.<span class="me1">setLayout</span><span class="br0">&#40;</span>editorsPaneLayout<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>addEditor<span class="br0">&#40;</span>editorsPane, dataBook, <span class="st0">&quot;ID&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
addEditor<span class="br0">&#40;</span>editorsPane, dataBook, <span class="st0">&quot;BOOLEAN&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
addEditor<span class="br0">&#40;</span>editorsPane, dataBook, <span class="st0">&quot;STRING&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
addEditor<span class="br0">&#40;</span>editorsPane, dataBook, <span class="st0">&quot;CHOICE&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
addEditor<span class="br0">&#40;</span>editorsPane, dataBook, <span class="st0">&quot;DATETIME&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
addEditor<span class="br0">&#40;</span>editorsPane, dataBook, <span class="st0">&quot;NUMBER&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
addEditor<span class="br0">&#40;</span>editorsPane, dataBook, <span class="st0">&quot;TYPE_ID&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
addEditor<span class="br0">&#40;</span>editorsPane, dataBook, <span class="st0">&quot;TYPE_NAME&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>UISplitPanel splitPanel <span class="sy0">=</span> <span class="kw1">new</span> UISplitPanel<span class="br0">&#40;</span>UISplitPanel.<span class="me1">SPLIT_LEFT_RIGHT</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
splitPanel.<span class="me1">setDividerAlignment</span><span class="br0">&#40;</span>UISplitPanel.<span class="me1">DIVIDER_BOTTOM_RIGHT</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
splitPanel.<span class="me1">setFirstComponent</span><span class="br0">&#40;</span>table<span class="br0">&#41;</span><span class="sy0">;</span><br />
splitPanel.<span class="me1">setSecondComponent</span><span class="br0">&#40;</span>editorsPane<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>UIPanel content <span class="sy0">=</span> <span class="kw1">new</span> UIPanel<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
content.<span class="me1">setLayout</span><span class="br0">&#40;</span><span class="kw1">new</span> UIBorderLayout<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
content.<span class="me1">add</span><span class="br0">&#40;</span>splitPanel, UIBorderLayout.<span class="me1">CENTER</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>(see <a href="https://github.com/sibvisions/jvx.kitchensink">Kitchensink</a> application, hosted on github)</p>
<p>This was the whole source code for the table binding (= UI). The missing piece is the model. In our example, we've used the member dataBook. A databook is the model and controller of JVx. We have different implementations: MemDataBook, RemoteDataBook. A mem is like a database table, but in memory. A remote databook is connected to a remote/local storage. The storage provides data (from a database, filesystem, twitter, ...).</p>
<p>We didn't use a database in our kitchensink, so the dataBook was defined as MemDataBook:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">RowDefinition rowdef <span class="sy0">=</span> <span class="kw1">new</span> RowDefinition<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
rowdef.<span class="me1">addColumnDefinition</span><span class="br0">&#40;</span><span class="kw1">new</span> ColumnDefinition<span class="br0">&#40;</span><span class="st0">&quot;ID&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> BigDecimalDataType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
rowdef.<span class="me1">addColumnDefinition</span><span class="br0">&#40;</span><span class="kw1">new</span> ColumnDefinition<span class="br0">&#40;</span><span class="st0">&quot;STRING&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> StringDataType<span class="br0">&#40;</span><span class="kw1">new</span> UITextCellEditor<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
rowdef.<span class="me1">addColumnDefinition</span><span class="br0">&#40;</span><span class="kw1">new</span> ColumnDefinition<span class="br0">&#40;</span><span class="st0">&quot;BOOLEAN&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> BooleanDataType<span class="br0">&#40;</span><span class="kw1">new</span> UICheckBoxCellEditor<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Boolean</span>.<span class="kw2">TRUE</span>, <span class="kw3">Boolean</span>.<span class="kw2">FALSE</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
rowdef.<span class="me1">addColumnDefinition</span><span class="br0">&#40;</span><span class="kw1">new</span> ColumnDefinition<span class="br0">&#40;</span><span class="st0">&quot;CHOICE&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> StringDataType<span class="br0">&#40;</span>choiceCellEditor<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
rowdef.<span class="me1">addColumnDefinition</span><span class="br0">&#40;</span><span class="kw1">new</span> ColumnDefinition<span class="br0">&#40;</span><span class="st0">&quot;DATETIME&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> TimestampDataType<span class="br0">&#40;</span><span class="kw1">new</span> UIDateCellEditor<span class="br0">&#40;</span><span class="st0">&quot;dd.MM.yyyy&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
rowdef.<span class="me1">addColumnDefinition</span><span class="br0">&#40;</span><span class="kw1">new</span> ColumnDefinition<span class="br0">&#40;</span><span class="st0">&quot;NUMBER&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> BigDecimalDataType<span class="br0">&#40;</span><span class="kw1">new</span> UINumberCellEditor<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
rowdef.<span class="me1">addColumnDefinition</span><span class="br0">&#40;</span><span class="kw1">new</span> ColumnDefinition<span class="br0">&#40;</span><span class="st0">&quot;TYPE_ID&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> BigDecimalDataType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
rowdef.<span class="me1">addColumnDefinition</span><span class="br0">&#40;</span><span class="kw1">new</span> ColumnDefinition<span class="br0">&#40;</span><span class="st0">&quot;TYPE_NAME&quot;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> StringDataType<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> UILinkedCellEditor<span class="br0">&#40;</span>referenceDefinition<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
IDataBook dataBook <span class="sy0">=</span> <span class="kw1">new</span> MemDataBook<span class="br0">&#40;</span>rowdef<span class="br0">&#41;</span><span class="sy0">;</span><br />
dataBook.<span class="me1">setName</span><span class="br0">&#40;</span><span class="st0">&quot;DATABINDING&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
dataBook.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>It's the definition of a table with some columns and different column types, like String, Date, Number, ComboBox. It's easy to use a real database table if you read <a href="http://blog.sibvisions.com/2015/02/21/plain-jdbc-vs-dbstorage/">following article</a> or <a href="http://blog.sibvisions.com/2015/02/28/simple-db-application-with-javafx/">this one</a>.</p>
<p><strong>The difference</strong></p>
<p>What's the difference to standard JavaFX without JVx and why should you use JVx?</p>
<p>Here's the <a href="https://docs.oracle.com/javafx/2/ui_controls/table-view.htm">official documentation of Table View</a> from Oracle. It's very complex to work with tables <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  (seems to be so). The example in the official documentation doesn't use a database, like our example above!</p>
<p><strong>The first difference</strong>: Save time and LoC.<br />
This will reduce complexity and saves your dev time. It'll be easier to maintain an application with 1.000 LoC instead of 50.000.</p>
<p><strong>Second difference</strong>: JVx already is a framework and library - don't create your own and waste dev time.</p>
<p><strong>Advantage of JVx</strong>: Simply bind a database table with 10 LoC:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">DBAccess dba <span class="sy0">=</span> DBAccess.<span class="me1">getDBAccess</span><span class="br0">&#40;</span><span class="st0">&quot;jdbc:hsqldb:hsql://localhost/testdb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">setUsername</span><span class="br0">&#40;</span><span class="st0">&quot;sa&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">setPassword</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>DBStorage dbs <span class="sy0">=</span> <span class="kw1">new</span> DBStorage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dbs.<span class="me1">setDBAccess</span><span class="br0">&#40;</span>dba<span class="br0">&#41;</span><span class="sy0">;</span><br />
dbs.<span class="me1">setWritebackTable</span><span class="br0">&#40;</span><span class="st0">&quot;testtable&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dbs.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>StorageDataBook dataBook <span class="sy0">=</span> <span class="kw1">new</span> StorageDataBook<span class="br0">&#40;</span>dbs<span class="br0">&#41;</span><span class="sy0">;</span><br />
dataBook.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>This is enough to get full CRUD support for your tables.</p>
<p>This article was the first intro of our databinding implementation for JavaFX. The next artile will cover our chart implementation. Here's first a impression:</p>
<div id="attachment_4105" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/04/fx_chart_bar.png" rel="lightbox[4088]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/04/fx_chart_bar-300x206.png" alt="FX Chart binding" title="fx_chart_bar" width="300" height="206" class="size-medium wp-image-4105" /></a><p class="wp-caption-text">FX Chart binding</p></div>
<p>We love the clean UI of JavaFX and our maximized internal frames <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/04/04/javafx-jvx-and-data-binding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plain JDBC vs. DBStorage</title>
		<link>https://blog.sibvisions.com/2015/02/21/plain-jdbc-vs-dbstorage/</link>
		<comments>https://blog.sibvisions.com/2015/02/21/plain-jdbc-vs-dbstorage/#comments</comments>
		<pubDate>Sat, 21 Feb 2015 00:08:52 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=3784</guid>
		<description><![CDATA[Did you ever use plain JDBC? For sure.
Wasn't it horrible because of so much boilerplate code? There are different solutions like Hibernate, EclipseLink, MyBatis, .... But such libraries create mappings, annotations, xml files, POJOs, ....
The idea behind JDBC is great but the API generates a lot of code and work.
I want to show you how [...]]]></description>
			<content:encoded><![CDATA[<p>Did you ever use plain JDBC? For sure.</p>
<p>Wasn't it horrible because of so much boilerplate code? There are different solutions like Hibernate, EclipseLink, MyBatis, .... But such libraries create mappings, annotations, xml files, POJOs, ....</p>
<p>The idea behind JDBC is great but the API generates a lot of code and work.</p>
<p>I want to show you how easy DB access could be, without overhead.<br />
First I want to define the table for our test:</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> t_calculate <br />
<span class="br0">&#40;</span><br />
&nbsp; id integer GENERATED <span class="kw1">BY</span> <span class="kw1">DEFAULT</span> <span class="kw1">AS</span> IDENTITY<span class="br0">&#40;</span>start <span class="kw1">WITH</span> 1<span class="br0">&#41;</span> <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span><span class="sy0">,</span><br />
&nbsp; costs decimal<span class="br0">&#40;</span>10<span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> 0<span class="sy0">,</span><br />
&nbsp; factor decimal<span class="br0">&#40;</span>2<span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> 10<span class="sy0">,</span><br />
&nbsp; <span class="kw1">STATUS</span> char<span class="br0">&#40;</span>1<span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="st0">'?'</span><span class="sy0">,</span><br />
&nbsp; description varchar<span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span><br />
<span class="br0">&#41;</span></div>
</div>
<p>The following snippet opens a HSQLDB connection inserts 3 records, checks the auto-generated id of the first inserted record, counts the number of records and does some filtering by id and value.</p>
<p>Here's the code:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="co1">//OPEN DB connection &nbsp; &nbsp; &nbsp; &nbsp;</span><br />
<span class="kw1">Class</span>.<span class="me1">forName</span><span class="br0">&#40;</span><span class="st0">&quot;org.hsqldb.jdbcDriver&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">Connection</span> connection <span class="sy0">=</span> <span class="kw3">DriverManager</span>.<span class="me1">getConnection</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;jdbc:hsqldb:hsql://localhost/testdb&quot;</span>, <span class="st0">&quot;sa&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">try</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//pre-create statements</span><br />
&nbsp; &nbsp; <span class="kw3">PreparedStatement</span> psInsert <span class="sy0">=</span> connection.<span class="me1">prepareStatement</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;insert into t_calculate (costs) values (?)&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">PreparedStatement</span> psFetchById &nbsp;<span class="sy0">=</span> connection.<span class="me1">prepareStatement</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;select * from t_calculate where id = ?&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//INSERT first record</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psInsert.<span class="me1">setObject</span><span class="br0">&#40;</span>1, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>35<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psInsert.<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//check generated ID</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">CallableStatement</span> csId <span class="sy0">=</span> connection.<span class="me1">prepareCall</span><span class="br0">&#40;</span><span class="st0">&quot;CALL IDENTITY()&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">ResultSet</span> resKey <span class="sy0">=</span> csId.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>resKey.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Long</span> id <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">Long</span><span class="br0">&#41;</span>resKey.<span class="me1">getObject</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; psFetchById.<span class="me1">setObject</span><span class="br0">&#40;</span>1, id<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">ResultSet</span> res <span class="sy0">=</span> psFetchById.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>res.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">Long</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span>, id<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span>, res.<span class="me1">getBigDecimal</span><span class="br0">&#40;</span><span class="st0">&quot;FACTOR&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="st0">&quot;?&quot;</span>, res.<span class="me1">getString</span><span class="br0">&#40;</span><span class="st0">&quot;STATUS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">fail</span><span class="br0">&#40;</span><span class="st0">&quot;Couldn't fetch record!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">fail</span><span class="br0">&#40;</span><span class="st0">&quot;Couldn't fetch identity!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//INSERT second record</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psInsert.<span class="me1">setObject</span><span class="br0">&#40;</span>1, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>40<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psInsert.<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//INSERT third record</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psInsert.<span class="me1">setObject</span><span class="br0">&#40;</span>1, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>45<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psInsert.<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Check record count</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Statement</span> stmt <span class="sy0">=</span> connection.<span class="me1">createStatement</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">ResultSet</span> res <span class="sy0">=</span> stmt.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="st0">&quot;select count(*) from t_calculate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>res.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>3, res.<span class="me1">getInt</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">fail</span><span class="br0">&#40;</span><span class="st0">&quot;Couldn't fetch record count!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//FILTER by ID</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psFetchById.<span class="me1">setObject</span><span class="br0">&#40;</span>1, <span class="kw3">Long</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res <span class="sy0">=</span> psFetchById.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>res.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="nu0">40</span>, res.<span class="me1">getInt</span><span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">fail</span><span class="br0">&#40;</span><span class="st0">&quot;Couldn't fetch records with id = 1!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//FILTER by value (COSTS)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">PreparedStatement</span> psFetchByCosts &nbsp;<span class="sy0">=</span> connection.<span class="me1">prepareStatement</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;select count(*) from t_calculate where costs &gt;= ?&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psFetchByCosts.<span class="me1">setObject</span><span class="br0">&#40;</span>1, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>40<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res <span class="sy0">=</span> psFetchByCosts.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>res.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>2, res.<span class="me1">getInt</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">fail</span><span class="br0">&#40;</span><span class="st0">&quot;Couldn't fetch records with costs &gt;= 40!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; psFetchByCosts.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">finally</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psInsert.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; psFetchById.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw1">finally</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; connection.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Nice, isn't it. Hopefully I didn't forget a close() call. The use-case was simple and not really complex compared to real world problems, but the LoC are extreme. <strong>All together 144 lines</strong> (comments included).</p>
<p>Sure you could write a small utility to auto-close statements and to read result sets, but why re-inventing the wheel? The most problems seem to be trivial but gets really complex.</p>
<p>I want to show you different solutions with DBStorage from JVx framework. It's a small class with extreme power. It handles whole JDBC for you, solves CRUD and more. The class is a server-side class and was designed for multi-tier environments but can also be used directly on client-side.</p>
<p>Here's the code, for the same use-case as before:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">DBAccess dba <span class="sy0">=</span> DBAccess.<span class="me1">getDBAccess</span><span class="br0">&#40;</span><span class="st0">&quot;jdbc:hsqldb:hsql://localhost/testdb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">setUsername</span><span class="br0">&#40;</span><span class="st0">&quot;sa&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">setPassword</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">try</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; DBStorage dbs <span class="sy0">=</span> <span class="kw1">new</span> DBStorage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; dbs.<span class="me1">setDBAccess</span><span class="br0">&#40;</span>dba<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; dbs.<span class="me1">setWritebackTable</span><span class="br0">&#40;</span><span class="st0">&quot;t_calculate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; dbs.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//inserting records</span><br />
&nbsp; &nbsp; Bean bean35 <span class="sy0">=</span> <span class="kw1">new</span> Bean<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; bean35.<span class="me1">put</span><span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>35<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; bean35 <span class="sy0">=</span> dbs.<span class="me1">insert</span><span class="br0">&#40;</span>bean35<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; Bean bean40 <span class="sy0">=</span> <span class="kw1">new</span> Bean<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; bean40.<span class="me1">put</span><span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>40<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; bean40 <span class="sy0">=</span> dbs.<span class="me1">insert</span><span class="br0">&#40;</span>bean40<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; Bean bean45 <span class="sy0">=</span> <span class="kw1">new</span> Bean<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; bean45.<span class="me1">put</span><span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>45<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; bean45 <span class="sy0">=</span> dbs.<span class="me1">insert</span><span class="br0">&#40;</span>bean45<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>, bean35.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;ID&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span>, bean35.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;FACTOR&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="st0">&quot;?&quot;</span>, bean35.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;STATUS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//filtering</span><br />
&nbsp; &nbsp; List<span class="sy0">&lt;</span>IBean<span class="sy0">&gt;</span> liBeans <span class="sy0">=</span> dbs.<span class="me1">fetchBean</span><span class="br0">&#40;</span><span class="kw2">null</span>, <span class="kw2">null</span>, 0, <span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>3, liBeans.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; IBean bean <span class="sy0">=</span> dbs.<span class="me1">fetchBean</span><span class="br0">&#40;</span><span class="kw1">new</span> Equals<span class="br0">&#40;</span><span class="st0">&quot;ID&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">40</span><span class="br0">&#41;</span>, bean.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; liBeans <span class="sy0">=</span> dbs.<span class="me1">fetchBean</span><span class="br0">&#40;</span><span class="kw1">new</span> GreaterEquals<span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>40<span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw2">null</span>, 0, <span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>2, liBeans.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw1">finally</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; CommonUtil.<span class="me1">close</span><span class="br0">&#40;</span>dba<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Better? <strong>Only 49 LoC</strong>.</p>
<p>As I told you before, the DBStorage is a server-side class and the API wasn't designed as client API. But there are some very useful classes in JVx. We call them DataBooks. A databook can be compared to a database table because it is row and column oriented. We have different DataBooks like MemDataBook, RemoteDataBook or StorageDataBook. MemDataBook is the base of all our databooks and RemoteDataBook extends it. The StorageDataBook extends the RemoteDataBook. A remote databook gets its records from a remote storage. The storage databook directly gets its records from a DBStorage.<br />
Sounds tricky? A little bit, but these classes allow using multi-tier architectures without making a difference how many tiers you use.</p>
<p>Here's the same example again, but using a StorageDataBook for using a DBStorage with client API:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">DBAccess dba <span class="sy0">=</span> DBAccess.<span class="me1">getDBAccess</span><span class="br0">&#40;</span><span class="st0">&quot;jdbc:hsqldb:hsql://localhost/testdb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">setUsername</span><span class="br0">&#40;</span><span class="st0">&quot;sa&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">setPassword</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">try</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; DBStorage dbs <span class="sy0">=</span> <span class="kw1">new</span> DBStorage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; dbs.<span class="me1">setDBAccess</span><span class="br0">&#40;</span>dba<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; dbs.<span class="me1">setWritebackTable</span><span class="br0">&#40;</span><span class="st0">&quot;t_calculate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; dbs.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; StorageDataBook sdb <span class="sy0">=</span> <span class="kw1">new</span> StorageDataBook<span class="br0">&#40;</span>dbs<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; sdb.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//inserting records</span><br />
&nbsp; &nbsp; sdb.<span class="me1">insert</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; sdb.<span class="me1">setValues</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="st0">&quot;DESCRIPTION&quot;</span><span class="br0">&#125;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">35</span><span class="br0">&#41;</span>, <span class="st0">&quot;Record with costs = 35&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; sdb.<span class="me1">insert</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; sdb.<span class="me1">setValues</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="st0">&quot;DESCRIPTION&quot;</span><span class="br0">&#125;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">40</span><span class="br0">&#41;</span>, <span class="st0">&quot;Record with costs = 40&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; sdb.<span class="me1">insert</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; sdb.<span class="me1">setValues</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="st0">&quot;DESCRIPTION&quot;</span><span class="br0">&#125;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">45</span><span class="br0">&#41;</span>, <span class="st0">&quot;Record with costs = 45&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; sdb.<span class="me1">saveAllRows</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; sdb.<span class="me1">setSelectedRow</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>, sdb.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="st0">&quot;ID&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span>, sdb.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="st0">&quot;FACTOR&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="st0">&quot;?&quot;</span>, sdb.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="st0">&quot;STATUS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co1">//filtering</span><br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>3, sdb.<span class="me1">getRowCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; sdb.<span class="me1">setFilter</span><span class="br0">&#40;</span><span class="kw1">new</span> Equals<span class="br0">&#40;</span><span class="st0">&quot;ID&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>1, sdb.<span class="me1">getRowCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">40</span><span class="br0">&#41;</span>, sdb.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; sdb.<span class="me1">setFilter</span><span class="br0">&#40;</span><span class="kw1">new</span> GreaterEquals<span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>40<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>2, sdb.<span class="me1">getRowCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw1">finally</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; CommonUtil.<span class="me1">close</span><span class="br0">&#40;</span>dba<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p><strong>The LoC: 51</strong> (but we could save 3 lines).<br />
The code doesn't use a remote storage, because we don't use a multi-tier architecture, but how does it look with a multi-tier architecture?</p>
<p>The server in our example is a Tomcat application server and we connect via HttpConnection. You could also use different server implementations like <a href="http://blog.sibvisions.com/2015/02/07/jvx-with-vert-x/">vert.x</a> or a plain <a href="http://blog.sibvisions.com/2015/02/19/jvx-application-on-embedded-devices/">socket server</a>.</p>
<p>Here is the code:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">HttpConnection con <span class="sy0">=</span> <span class="kw1">new</span> HttpConnection<span class="br0">&#40;</span><span class="st0">&quot;http://localhost/myapp/services/Server&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>MasterConnection macon <span class="sy0">=</span> <span class="kw1">new</span> MasterConnection<span class="br0">&#40;</span>con<span class="br0">&#41;</span><span class="sy0">;</span><br />
macon.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">try</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; RemoteDataSource rds <span class="sy0">=</span> <span class="kw1">new</span> RemoteDataSource<span class="br0">&#40;</span>macon<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; rds.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; RemoteDataBook rdb <span class="sy0">=</span> <span class="kw1">new</span> RemoteDataBook<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; rdb.<span class="me1">setDataSource</span><span class="br0">&#40;</span>rds<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; rdb.<span class="me1">setName</span><span class="br0">&#40;</span><span class="st0">&quot;calculate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//inserting records</span><br />
&nbsp; &nbsp; rdb.<span class="me1">insert</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; rdb.<span class="me1">setValues</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="st0">&quot;DESCRIPTION&quot;</span><span class="br0">&#125;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">35</span><span class="br0">&#41;</span>, <span class="st0">&quot;Record with costs = 35&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; rdb.<span class="me1">insert</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; rdb.<span class="me1">setValues</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="st0">&quot;DESCRIPTION&quot;</span><span class="br0">&#125;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">40</span><span class="br0">&#41;</span>, <span class="st0">&quot;Record with costs = 40&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; rdb.<span class="me1">insert</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; rdb.<span class="me1">setValues</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="st0">&quot;DESCRIPTION&quot;</span><span class="br0">&#125;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">45</span><span class="br0">&#41;</span>, <span class="st0">&quot;Record with costs = 45&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; rdb.<span class="me1">saveAllRows</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; rdb.<span class="me1">setSelectedRow</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>, rdb.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="st0">&quot;ID&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span>, rdb.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="st0">&quot;FACTOR&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="st0">&quot;?&quot;</span>, rdb.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="st0">&quot;STATUS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co1">//filtering</span><br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>3, rdb.<span class="me1">getRowCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; rdb.<span class="me1">setFilter</span><span class="br0">&#40;</span><span class="kw1">new</span> Equals<span class="br0">&#40;</span><span class="st0">&quot;ID&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>1, rdb.<span class="me1">getRowCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span><span class="nu0">40</span><span class="br0">&#41;</span>, rdb.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; rdb.<span class="me1">setFilter</span><span class="br0">&#40;</span><span class="kw1">new</span> GreaterEquals<span class="br0">&#40;</span><span class="st0">&quot;COSTS&quot;</span>, <span class="kw3">BigDecimal</span>.<span class="me1">valueOf</span><span class="br0">&#40;</span>40<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">Assert</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span>2, rdb.<span class="me1">getRowCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw1">finally</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; CommonUtil.<span class="me1">close</span><span class="br0">&#40;</span>macon<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p><strong>LoC: 50</strong> (but we could save the same 3 lines as before)</p>
<p>The API calls are the same, but we used a HttpConnection, a MasterConnection, a RemoteDataSource and a RemoteDataBook. The HttpConnection could be replaced with e.g.  NetConnection or any other transport protocol. The MasterConnection is protocol independent and handles the communication between client and server-tier. The RemoteDataSource is the datasource for RemoteDataBook. The RemoteDataBook communicates indirectly with a DBStorage on the server-tier.</p>
<p>The DBStorage definition for the server-side is the same as in all other examples:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">DBAccess dba <span class="sy0">=</span> DBAccess.<span class="me1">getDBAccess</span><span class="br0">&#40;</span><span class="st0">&quot;jdbc:hsqldb:hsql://localhost/testdb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">setUsername</span><span class="br0">&#40;</span><span class="st0">&quot;sa&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">setPassword</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
dba.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>but the server-tier contains the definition. The client doesn't know connection settings and credentials in that case.</p>
<p>Sure, there's a difference between fat-client, client/server and multi-tier architecture, but have you ever seen an easier API to use a multi-tier architecture?</p>
<p>The DBStorage and DataBooks have a lot of useful APIs for you and your database applications. It solves all CRUD operations, take care of column metadata and much more.</p>
<p><a href="http://sourceforge.net/projects/jvx/">JVx</a> is Apache 2.0 licensed.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/02/21/plain-jdbc-vs-dbstorage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
