{"id":12944,"date":"2018-09-03T11:13:59","date_gmt":"2018-09-03T09:13:59","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=12944"},"modified":"2018-09-03T11:14:13","modified_gmt":"2018-09-03T09:14:13","slug":"sql2o-accesso-immediato-ai-database-tramite-java","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/sql2o-accesso-immediato-ai-database-tramite-java\/","title":{"rendered":"Sql2o, accesso immediato ai database tramite Java"},"content":{"rendered":"<p>L&#8217;accesso ad un database relazionale da un&#8217;applicazione Java viene solitamente condotto con\u00a0il protocollo JDBC &#8211; elastico ma dalla sintassi prolissa &#8211; o con framework dedicati come Hibernate o MyBatis la cui conoscenza richiede per\u00f2 una certa dose di studio. Proponiamo qui un&#8217;alternativa efficace ma dall&#8217;approccio immediato: <a href=\"http:\/\/www.sql2o.org\/\" target=\"_blank\" rel=\"noopener\">Sql2o<\/a>.<\/p>\n<h2>Vantaggi di Sql2o<\/h2>\n<p>Non ci vuole molto a notare i vantaggi di Sql2o anche perch\u00e8 vengono ben pubblicizzati nell&#8217;homepage del progetto:<\/p>\n<ul>\n<li>la <strong>sintassi \u00e8 ridotta all&#8217;osso<\/strong>: la stessa operazione svolta con JDBC classico pu\u00f2 richiedere anche sette o otto volte le righe di codice di cui Sql2o necessita;<\/li>\n<li>i <strong>risultati di una query vengono mappati direttamente in classi Java<\/strong>: sar\u00e0 sufficiente predisporre una sua definizione le cui propriet\u00e0 abbiano nomi identici a ai campi dei record restituiti;<\/li>\n<li>anche nell&#8217;inserimento si potr\u00e0 avere una mappatura inversa tra oggetti Java e record della tabella.<\/li>\n<\/ul>\n<p>L&#8217;<strong>installazione<\/strong> \u00e8 piuttosto comoda grazie alla disponibilit\u00e0 del progetto nei repository <em>Maven<\/em>, queste le coordinate da utilizzare:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;dependencies&gt;\r\n    &lt;dependency&gt;\r\n        &lt;groupId&gt;org.sql2o&lt;\/groupId&gt;\r\n        &lt;artifactId&gt;sql2o&lt;\/artifactId&gt;\r\n        &lt;version&gt;1.5.4&lt;\/version&gt;\r\n    &lt;\/dependency&gt;\r\n&lt;\/dependencies&gt;<\/pre>\n<p>In alternativa, si pu\u00f2 scaricare il <a href=\"https:\/\/github.com\/aaberg\/sql2o\/releases\/tag\/sql2o-1.5.4\" target=\"_blank\" rel=\"noopener\">file in formato <em>jar<\/em><\/a> dal link fornito.<\/p>\n<p>Nell&#8217;homepage viene dichiarata inoltre la<strong> compatibilit\u00e0 del progetto con la maggior parte dei DBMS pi\u00f9 famosi<\/strong> come MySQL, PostgreSQL, Oracle e SQL Server ma in realt\u00e0 lo si pu\u00f2 utilizzare anche con altri, come il diffusissimo Sqlite, fornendo per\u00f2 il driver JDBC compatibile e caricandolo correttamente all&#8217;avvio dell&#8217;esecuzione.<\/p>\n<h2>Esempio<\/h2>\n<p>Vediamolo subito al lavoro.<\/p>\n<p>Pensiamo ad una tabella che abbia la struttura fornita da tale definizione:<\/p>\n<pre class=\"lang:mysql decode:true \">CREATE TABLE `persone` (\r\n\t`id`\tINTEGER PRIMARY KEY AUTOINCREMENT,\r\n\t`nome`\tTEXT,\r\n\t`cognome`\tTEXT,\r\n\t`eta`\tINTEGER,\r\n\t`citta`\tINTEGER\r\n);<\/pre>\n<p>e alla classe Java che rappresenter\u00e0 i suoi record:<\/p>\n<pre class=\"lang:java decode:true \">public class Persona {\r\n\r\n\tprivate long id;\r\n\tprivate String nome;\r\n\tprivate String cognome;\r\n\tprivate int eta;\r\n\tprivate String citta;\r\n \r\n        \/*\r\n         * OMISSIS: tutti i getter e setter necessari\r\n         *\r\n         *\/\r\n\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 300;\">Con Sql2o possiamo <strong>eseguire una query<\/strong> utilizzando il seguente codice:<\/span><\/p>\n<pre class=\"lang:java decode:true\">String sql =   \"SELECT * FROM persone\";\r\n\r\ntry(Connection con = sql2o.open()) {\r\n     List&lt;Persona&gt; persone = con.createQuery(sql)\r\n\t\t\t         .executeAndFetch(Persona.class);\r\n}\r\n<\/pre>\n<p>Il codice usato \u00e8 estremamente breve soprattutto in considerazione della quantit\u00e0 di lavoro che svolge. Infatti non solo saranno recuperati i record ma verranno tradotti ognuno in un oggetto Java e tutti insieme saranno restituiti come una lista di oggetti da utilizzare nel prosieguo delle operazioni.<\/p>\n<p>Per le operazione di <strong>selezione dei record<\/strong>, si potr\u00e0 evitare di concatenare stringhe alla query SQL mediante l&#8217;uso di parametri. Supponiamo di voler selezionare tutti record in cui il campo <em>eta<\/em> corrisponda almeno a quanto indicato nella variabile <em>etaMinima<\/em> e quello nel campo <em>citta<\/em> corrisponda a quanto riportato nella stringa <em>cittaResidenza<\/em>:<\/p>\n<pre class=\"lang:java decode:true \">String selezione = \"SELECT * FROM persone WHERE eta&gt;=:sogliaEta AND citta=:citta\";\r\ntry(Connection con = sql2o.open()) {\r\n\tList&lt;Persona&gt; persone = con.createQuery(selezione)\r\n\t\t.addParameter(\"sogliaEta\", etaMinima)\r\n\t\t.addParameter(\"citta\", cittaResidenza)\r\n\t        .executeAndFetch(Persona.class);\r\n\t\t\t\t    \r\n<\/pre>\n<p>L&#8217;utilizzo parametrico dei valori ricorda quello dei punti interrogativi nei PreparedStatement di JDBC ma la loro sostituzione con nomi simbolici preceduti dal simbolo due punti conferisce sicuramente pi\u00f9 leggibilit\u00e0 al tutto.<\/p>\n<p>Anche la sintassi dei <strong>comandi di modifica<\/strong> non si discosta molto da quanto abbiamo visto. Prendiamo, ad esempio, un&#8217;operazione di <em>insert<\/em>:<\/p>\n<pre class=\"lang:java decode:true\">String sqlInsert = \"INSERT INTO persone ( nome, cognome, eta, citta ) \"\r\n\t\t\t\t\t\t+ \"values ( :nome, :cognome, :eta, :citta )\";\r\n\r\ntry (Connection con = sql2o.open()) {\r\n   int insertedId = (int) con.createQuery(sqlInsert, true)\r\n        .addParameter(\"nome\", \"Saverio\")\r\n        .addParameter(\"cognome\", \"Rossi\")\r\n        .addParameter(\"eta\", 48)\r\n        .addParameter(\"citta\", \"Livorno\")\r\n        .executeUpdate()\r\n        .getKey();\r\n\t\t\t\t   \r\n<\/pre>\n<p>In questo caso, ci siamo fatti anche restituire l&#8217;id assegnato in autoincremento al nuovo record creato.<\/p>\n<p>Inoltre per l&#8217;insert \u00e8 disponibile anche il metodo <em>bind<\/em> che sar\u00e0 in grado di\u00a0mappare le propriet\u00e0 di un oggetto Java con i campi del record da creare:<\/p>\n<pre class=\"lang:java decode:true\">Persona nuovaPersona=new Persona();\r\n\/*\r\n *   impsotazione delle propriet\u00f2 nell'oggetto.\r\n *   Sono i valori che andranno salvati nel nuovo record\r\n *\/\r\n\r\nString sqlInsert = \"INSERT INTO persone ( nome, cognome, eta, citta ) \"\r\n\t\t\t\t\t\t+ \"values ( :nome, :cognome, :eta, :citta )\";\r\n\r\ntry (Connection con = sql2o.open()) {\r\n    con.createQuery(sql).bind(nuovaPersona).executeUpdate();\r\n}<\/pre>\n<p>I parametri passati nel comando SQL corrispondono con le propriet\u00e0 della classe Persona: si occuper\u00e0 direttamente Sql2o di prelevarli dai vari membri dell&#8217;oggetto e di passarli nella direttiva <em>insert<\/em>.<\/p>\n<h2>Conclusioni<\/h2>\n<p>Da quanto abbiamo visto, Sql2o appare come un progetto utile in quanto produttivo ed essenziale. Ha diverse altre funzionalit\u00e0 che possono essere scoperte nella <a href=\"http:\/\/www.sql2o.org\/docs\/configuration\/\" target=\"_blank\" rel=\"noopener\">documentazione ufficiale<\/a>. Noi, dopo questa introduzione, lo affronteremo ancora per vederlo al lavoro. Lo immaginate nella produzione di un servizio web con API REST in accoppiata con un altro prodotto snello come <a href=\"http:\/\/www.devapp.it\/wordpress\/creare-api-rest-velocemente-con-spark-java\/\" target=\"_blank\" rel=\"noopener\">Spark Java<\/a>?<\/p>\n<p>Efficienza e sinteticit\u00e0 al vostro servizio!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&#8217;accesso ad un database relazionale da un&#8217;applicazione Java viene solitamente condotto con\u00a0il protocollo JDBC &#8211; elastico ma&#8230;<\/p>\n","protected":false},"author":561,"featured_media":13616,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1530,1526,1923,543,1924],"class_list":["post-12944","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-database","tag-java","tag-jdbc","tag-sql","tag-sql2o"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12944","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=12944"}],"version-history":[{"count":6,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12944\/revisions"}],"predecessor-version":[{"id":13618,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12944\/revisions\/13618"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/13616"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=12944"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=12944"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=12944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}