<?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>Linux, Java y programación &#187; sql</title>
	<atom:link href="http://casidiablo.net/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +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>La mediocridad de los ingenieros (¿reir o llorar?)</title>
		<link>http://casidiablo.net/ingenieros/</link>
		<comments>http://casidiablo.net/ingenieros/#comments</comments>
		<pubDate>Sat, 02 Aug 2008 07:37:15 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[hacking]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1211</guid>
		<description><![CDATA[Nota: este artículo te podría interesar si deseas saber cómo solucionar problemas de seguridad de manera &#8220;profesional&#8220;. De pequeño siempre quise ser Ingeniero de Sistemas&#8230; ahora, con 19 años ya llevo 6 semestres (de 10 aquí en Colombia), aún cuando no he estudiado por 2 años falta de dinero, ya no se que quiero hacer. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fingenieros%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22La%20mediocridad%20de%20los%20ingenieros%20%28%C2%BFreir%20o%20llorar%3F%29%22%20%7D);"></div>
<p style="text-align: right;"><span style="color: #808080;">Nota: este artículo te podría interesar si deseas saber cómo solucionar problemas de seguridad de manera &#8220;<em><abbr title="Lo de profesional es sarcasmo">profesional</abbr></em>&#8220;.</span></p>
<p>De pequeño siempre quise ser Ingeniero de Sistemas&#8230; ahora, con 19 años ya llevo 6 semestres (de 10 aquí en Colombia), aún cuando no he estudiado por 2 años falta de dinero, ya no se que quiero hacer.</p>
<p>Con algo que llevo de experiencia mezclándome con &#8220;ingenieros&#8221; me da algo de tristeza ver cómo de cada 20 hay 1 que vale la pena. Los demás <strong>son personas que no tienen puta idea de lo que hacen</strong>, estudiaron esto no por vocación sino porque <strong>piensan que se van a forrar en dinero</strong>, y además se creen Dioses que todo lo saben (aún cuando dedican la mayor parte de su tiempo <strong>laboral</strong> chateando con el MSN, volviéndose maestros en el uso del <strong>Facebook</strong>, o perdiendo el tiempo de cualquier otra manera).</p>
<p>La verdad es que hace tiempo quería escribir algo sobre esto, pero no lo hacía simplemente porque muy seguramente <strong>los lectores asiduos de este humilde blog no tienen nada de mediocres</strong>, y los ingenieros (a quienes iría dirigida la entrada) ni siquiera saben lo que es un puto lector de feeds, o me leerían usando IE 6.0 (no saben que existen &#8220;otros&#8221;) que a veces no carga bien esta página.</p>
<h3>La historia&#8230; (aprende a solucionar problemas de seguridad)</h3>
<p>Hace una semana entré a la página web del sistema de transportes colombiano <a href="http://www.transmilenio.gov.co/nuevapagina/">Transmilenio</a>, y descubrí que el sistema de búsquedas era vulnerable a ataques <a href="http://es.wikipedia.org/wiki/Cross_Site_Scripting">XSS</a> y al famoso <a href="http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL">SQL Injection</a>, por lo cual procedí (después de jugar un par de horas y descubrir ciertos datos interesantes) a avisar del fallo.</p>
<p>La cosa iba así para un XSS:</p>
<pre class="brush: xml; title: ; notranslate">hola%' or title like '%hola&gt; &lt;script&gt;alert(/POWNED/)&lt;/script&gt;&lt;a</pre>
<p>Y así para un SQL Injection:</p>
<pre class="brush: sql; title: ; notranslate">hola%' UNION select * from NOMBRE_TABLA where 1=1 or 1 like '%1</pre>
<p>Lo cierto es que esto es algo que <strong>se puede solucionar fácilmente</strong>, haciendo una limpieza a las variables antes de realizar una búsqueda en la base de datos, pero nuestros <em>super ingenieros</em> (que ni siquiera dieron las gracias) <em><strong>encontraron una mejor solución (la más óptima): deshabilitar las búsquedas</strong></em>.</p>
<p>Y aquí es donde no sé si reir o llorar. Poca vergüenza tiene esta gente, y lo peor es que los hay por montones. Muy triste&#8230;</p>
<p>También te podría interesar este artículo: <a href="http://jesfre.blogspot.com/2008/07/devolver-el-orgullo-al-nombre-de.html">Devolver el orgullo al nombre de &#8220;programador&#8221; para solucionar el déficit de programadores</a> publicado en <a href="http://jesfre.blogspot.com/">Punto de partida</a></p>
<h3>Bonus&#8230;</h3>
<ul>
<li><a href="http://winnetmag.com/Article/ArticleID/42216/42216.html">Protegiéndose frente a la inyección SQL</a></li>
<li><a href="http://www.dotnetpuebla.com/portal/Publicaciones/Articulos/848.aspx">Protegerse de un ataque SQL Injection</a></li>
<li><a href="http://msdn.microsoft.com/msdnmag/issues/04/09/SQLInjection/">Detén los ataques de Inyección SQL antes de que ellos te detengan a ti</a></li>
</ul>
<p>P.d. esta es una entrada programada escrita el Viernes 1 de Agosto de 2008. Solo para dejar terminar la semana y ver si lo solucionan.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ingenieros/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Enlaces recomendados</title>
		<link>http://casidiablo.net/enlaces-recomendado/</link>
		<comments>http://casidiablo.net/enlaces-recomendado/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 20:05:46 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[off-topic]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[dvd]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[juegos]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[videos]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=930</guid>
		<description><![CDATA[Algunos enlaces interesantes que me deje en el tintero gracias a mi anterior proveedor de hosting: Ahorrar tiempo y tráfico actualizando con apt-proxy: Si tienes varios equipos que utilicen apt como gestor de paquetes (Debian, Ubuntu, Knoppix, etc.), puedes utilizar apt-proxy; ésta herramienta crea un caché compartido de los paquetes DEB, con lo cual las [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fenlaces-recomendado%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Enlaces%20recomendados%22%20%7D);"></div>
<p>Algunos enlaces interesantes que me deje en el tintero <a href="http://casidiablo.net/he-vuelto/">gracias a mi anterior proveedor de hosting</a>:</p>
<ul>
<li><a href="http://www.linux.com/feature/139213"><strong>Ahorrar tiempo y tráfico actualizando con apt-proxy</strong></a>: Si tienes varios equipos que utilicen apt como gestor de paquetes (Debian, Ubuntu, Knoppix, etc.), puedes utilizar apt-proxy; ésta herramienta crea un caché compartido de los paquetes DEB, con lo cual las máquinas que necesiten instalar software no tienen que descargarlo de internet, sino que lo hacen directamente de la LAN (inglés).</li>
<li><a href="http://www.webadictos.com.mx/2008/06/25/hacer-firefox-3-mas-rapido/"><strong>Tips para hacer FireFox 3 más rápido</strong></a>: sencillos pasos de configuración de nuestro firefox para hacer que carguen más rápido las páginas.</li>
<li><a href="http://www.howtoforge.com/installing-vmware-server-on-ubuntu-8.04"><strong>How-To: Instalar VMWare server sobre Ubuntu 8.04</strong></a>: en este artículo encontrarás paso a paso cómo realizar esto, lo que te permitirá instalar virtalmente sistemas operativos sobre tu Ubuntu (inglés).</li>
<li><a href="http://belinuxmyfriend.blogspot.com/2008/07/mp3blaster-reproduce-tu-msica-desde-la.html"><strong>mp3blaster reproduce tu música, desde la consola</strong></a>: <a href="http://mp3blaster.sourceforge.net/" target="_blank"><span style="font-style: italic;">mp3blaster</span></a> es un reproductor de audio (mp3,wav, ogg) que cambia la habitual interface por otra un poco más &#8220;rudimentaria&#8221; como es la consola, con lo que eso conlleva. Creado para sistemas <span style="font-weight: bold;">UNIX</span> (ej. Linux, Free/Net/OpenBSD, etc), con<span style="font-style: italic;"> mp3blaster</span> podrás escuchar MP3 sin preocuparte por entorno gráfico que usas.</li>
<li><strong>LinuX-Gamers</strong>: Se trata de una distro basada en Arch Linux, que sólo puede descargarse <a href="http://live.linux-gamers.net/?s=download" target="_blank">vía Torrent</a> en forma de un Live DVD que incluye todo lo necesario para jugar, entre ello <a href="http://live.linux-gamers.net/?s=games" target="_blank">estos 15 juegos</a> y los drivers para ATI y Nvidia. En lo que lo he probado está bien, sobre todo por lo de incluir a World of Padman&#8230; aunque unos juegos son bastante malos (hay que decirlo).</li>
<li><strong>Listado de decompiladores Java</strong>: se trata de <a href="http://linkmingle.com/list/List-of-Free-Java-Decompilers-java" target="_blank">este listado bastante completo de decompiladores y ofuscadores</a> para Java.</li>
<li><a href="http://www.howtoforge.com/apache2-logging-to-a-mysql-database-with-mod_log_sql-on-debian-etch"><strong>Guardar logs de Apach2 en MySQL</strong></a>: se trata de un how-to (en inglés), en donde se explica cómo instalar y configurar el módulo mod_log_sql, lo que servirá para guardar los logs que genere el servidor Web Apache2 en MySQL.</li>
<li><a href="http://ayudawordpress.com/banear-comentarios-por-ip-usando-htaccess/"><strong>[Wordpress] Banear comentarios por IP usando .htaccess</strong></a>: Nuestro querido amigo <a href="http://www.tecnologiadiaria.com" target="_blank">KnxDT</a> nos explica como podemos <a href="http://www.tecnologiadiaria.com/2008/07/wordpress-banear-comentarios-por-ip-usando-htaccess.html" target="_blank">banear comentarios por IP usando el .htaccess</a>.</li>
<li><a href="http://linpodcast.com/blog/2008/06/23/instalando-software-con-pkg-get-y-blastwave-en-opensolaris/"><strong>OpenSolaris: pkg-get y blastwave</strong></a>: un artículo de JainuX en donde explica el funcionamiento del principal gestor de paquetes en OpenSolaris.</li>
<li><a href="http://www.maty1206linuxeando.com/archives/1253"><strong>Ghost for Linux, alternativa libre a Norton Ghost</strong></a>: <strong>Ghost for Linux</strong> es un proyecto libre cuya funcionalidad es igual al <strong>Norton Ghost de Symantec</strong>, nos permite crear imágenes de discos o particiones y luego recuperarlas fácilmente.</li>
<li><a href="http://ubuntulife.wordpress.com/2008/07/08/libro-implementacion-de-servidores-con-gnulinux/"><strong>[Libro] Implementacion de Servidores con GNU/Linux</strong></a>: Interesante documento escrito por <em>Joel Barrios</em> que cubre gran cantidad de temas relacionados con la <a href="http://barrapunto.com/articles/08/07/06/1536243.shtml">administracion de GNU/Linux</a>, el autor del libro emplea <em>CentOS </em>(una distribucion gratuita basada en las fuentes de Red Hat) pero no por ello no es aplicable su contenido al resto de distribuciones.</li>
<li><a href="http://tobal.cymaho.com/?p=330"><strong>La Cuarta Dimensión Con Vídeos</strong></a>: una colección de videos en donde podremos encontrar información acerca de la magnífica cuarta dimensión. <strong>Recomendado</strong>.</li>
<li><a href="http://www.linux.com/feature/141074"><strong>ext3undel, si te equivocas con el rm</strong></a>: rm, como muchos saben, es el comando que ejecutamos para eliminar archivos y directorios en <a href="http://casidiablo.net/">Linux</a>. Pero, <strong>¿qué pasa cuando nos equivocamos y borramos algo accidentalmente? Para momentos como esos, <a href="http://freshmeat.net/releases/280489/">ext3undel</a> puede ser de gran utilidad</strong>, puesto que recupera datos accidentalmente dañados en sistemas de archivos <a href="http://es.wikipedia.org/wiki/Ext3">ext3</a>.</li>
<li><a href="http://www.mimesacojea.com/2008/07/follar-gua-para-adolescentes.html"><strong>Follar, quía para adolescentes</strong></a>: un excelente artículo/reflexión del sexo de (nosotros) los adolescentes. De verdad que no sabemos tirar&#8230;</li>
<li><a href="http://www.durmiendoafuera.com/mapa-de-springfield-los-simpsons-para-quake-3/"><strong>Mapa de Springfield [Los Simpsons] para Quake 3</strong></a>: este mapa lo he probado sobre Linux, y es bastante bueno, muy divertido y detallado. Sin lugar a dudas recomendado.</li>
<li><strong><a href="http://120linux.com/10-sorprendentes-camisetas-linux/">10 sorprendentes camisetas Linux</a></strong></li>
<li><a href="http://clitec.org/?p=35"><strong>Escritorio remoto en Linux</strong></a>: una manera nativa (sin necesidad de instalar absolutamente nada) de conectarnos por escritorio remoto a una máquina con Linux.</li>
<li><a href="http://picandocodigo.net/2008/07/matando-procesos-con-expresiones-regulares/"><strong>Matando procesos con Expresiones Regulares</strong></a>.</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/enlaces-recomendado/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Crear una conexión JDBC</title>
		<link>http://casidiablo.net/java-database-connectivity/</link>
		<comments>http://casidiablo.net/java-database-connectivity/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 06:56:29 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=928</guid>
		<description><![CDATA[Lo primero que necesitaremos son los drivers JDBC en formato jar, incluir este archivo jar en el CLASSPATH de nuestro proyecto y cargarlos en memoria: Oracle: JDBC Download page Oracle Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); MySql: MySQL Connector J Class.forName("com.mysql.jdbc.Driver").newInstance(); Para crear la conexión, necesitamos una url JDBC, la cual contiene toda la información necesaria para conectarse: Oracle: necesitaremos [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fjava-database-connectivity%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Crear%20una%20conexi%C3%B3n%20JDBC%22%20%7D);"></div>
<p>Lo primero que necesitaremos son los drivers JDBC en formato jar, incluir este archivo jar en el CLASSPATH de nuestro proyecto y cargarlos en memoria:</p>
<p><strong>Oracle</strong>: <a href="http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html" target="_blank">JDBC Download page Oracle</a></p>
<pre>Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
</pre>
<p><strong>MySql</strong>: <a href="http://www.mysql.com/products/connector/j/" target="_blank">MySQL Connector J</a></p>
<pre>Class.forName("com.mysql.jdbc.Driver").newInstance();
</pre>
<p>Para crear la conexión, necesitamos una url JDBC, la cual contiene toda la información necesaria para conectarse:</p>
<p><strong>Oracle</strong>: necesitaremos saber el host (el nombre de la máquina o su IP), el puerto de escucha del listener de Oracle (1521 por ejemplo), el servicio o sid, el usuario y la clave. Diferentes formatos de la url JDBC pueden ser:</p>
<pre>jdbc:oracle:thin:@host:puerto:sid
jdbc:oracle:thin:usuario/clave@host:puerto:sid
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=puerto)))(CONNECT_DATA=(SERVICE_NAME=servicio)(SERVER=SHARED)))
jdbc:oracle:thin:usuario/clave@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=puerto)))(CONNECT_DATA=(SERVICE_NAME=servicio)(SERVER=SHARED)))
</pre>
<p>Más información en <a href="http://www.oracle.com/technology/tech/java/sqlj_jdbc/htdocs/jdbc_faq.htm#05_03" target="_blank">FAQ JDBC Oracle: Connections</a></p>
<p><strong>MySql</strong>: host (nombre de la máquina o su IP), puerto de escucha (3306 por defecto), nombre de la base de datos, usuario y clave. El formato de la url es:</p>
<pre>jdbc:mysql://host:puerto/database
jdbc:mysql://host:puerto/database?user=usuario&amp;password=clave
</pre>
<p>(Más información en <a href="http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html" target="_blank">MySql JDBC Reference</a>)</p>
<p>Una vez tengamos la url JDBC, podemos crear la conexión contra la base de datos:</p>
<pre>Connection connection = DriverManager.getConnection(ulr, usuario, clave);
</pre>
<p>Si la URL ya contiene el usuario y la clave (hay formatos que ya la llevan):</p>
<pre>Connection connection = DriverManager.getConnection(ulr);
</pre>
<p>Con el objeto connection ya podemos trabajar, sin olvidarnos de que una vez hemos acabado, hay que cerrar la conexión. Esto es muy importante hacerlo, ya que si se queda abierta, estamos desaprovechando recursos, creando lo que se llama connection leaks (conexiones perdidas) con la base de datos. La mejor forma de hacerlo es englobar todo el código en una estructura try/catch/finally y efectuando el cierre de la conexión en el finally. De esta manera nos aseguramos de que falle o no falle el código, se cerrará la conexión.</p>
<pre class="brush: java; title: ; notranslate">Connection connection;
try {
    // ...
    connection = DriverManager.getConnection(ulr);
    // ...
} finally {
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
			      e.printStackTrace();
        }
    }
}</pre>
<p>Veamos ahora un par de ejemplos completo. Para Oracle definimos una url que incluye el usuario y la clave, por lo que no necesitaremos pasarle esta información en el método getConnection():</p>
<pre class="brush: java; title: ; notranslate">import java.sql.*;

public class OracleConnection {
    public static void main(String args[]) {

        String usuario = &quot;vil&quot;;
        String password = &quot;secreta&quot;;

        String host = &quot;localhost&quot;; // tambien puede ser una ip como &quot;192.168.1.14&quot;
        String puerto = &quot;1521&quot;;
        String sid = &quot;prueba&quot;;

        String driver = &quot;oracle.jdbc.driver.OracleDriver&quot;;

        String ulrjdbc = &quot;jdbc:oracle:thin:&quot; + usuario + &quot;/&quot; + password + &quot;@&quot; + host + &quot;:&quot; + puerto + &quot;:&quot; + sid;

        Connection connection = null;
        try {
            Class.forName(driver).newInstance();
            connection = DriverManager.getConnection(ulrjdbc);

            // Ya tenemos el objeto connection creado

            ResultSet result = connection.createStatement().executeQuery(&quot;SELECT 'hola mundo' FROM DUAL&quot;);
            result.next();
            System.out.println(result.getString(1));

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                }
            }
        }
    }
}</pre>
<p>Y para MySQL (usaremos una url sin usuario y clave, por lo que pasaremos esta información al método getConnection):</p>
<pre class="brush: java; title: ; notranslate">import java.sql.*;

public class MySQLConnection {
    public static void main(String args[]) {

        String usuario = &quot;vil&quot;;
        String password = &quot;secreta&quot;;

        String host = &quot;localhost&quot;; // tambien puede ser una ip como &quot;192.168.1.14&quot;
        String puerto = &quot;3306&quot;;
        String database = &quot;prueba&quot;;

        String driver = &quot;com.mysql.jdbc.Driver&quot;;

        String ulrjdbc = &quot;jdbc:mysql://&quot; + host + &quot;:&quot; + puerto + &quot;/&quot; + database;

        Connection connection = null;
        try {
            Class.forName(driver).newInstance();
            connection = DriverManager.getConnection(ulrjdbc, usuario, password);

            // Ya tenemos el objeto connection creado

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                }
            }
        }
    }
}</pre>
<p>Resumen para crear una conexión con cualquier base de datos:</p>
<ul>
<li>Insertar en el CLASSPATH el jar con los drivers de nuestra base de datos (<a href="http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html" target="_blank">drivers Oracle</a>, <a href="http://www.mysql.com/products/connector/j/" target="_blank">drivers MySQL</a> o buscar en Google “drivers jdbc basededatos”)</li>
<li>Cargar los drivers con <code>Class.forName(sdriver).newInstance();</code>, siendo sdriver un String con la clase del driver.</li>
<li>Crear la conexión con <code>DriverManager.getConnection(ulrjdbc, usuario, password);</code>, siend urljdbc una url con el formato que define la propia base de datos (Oracle: <code>jdbc:oracle:thin:@host:puerto:sid</code>, MySQL: <code>jdbc:mysql://host:puerto/database</code> o buscar en Google “jdbc url basededatos”)</li>
<li>Cerrar siempre la conexión dentro del finally</li>
</ul>
<p>Tomado de <a href="http://albertovilches.com/crear-una-conexion-jdbc">Yo, Programador</a>, un blog de programación y tecnología escrito por Alberto Vilches.</p>
<p style="text-align: center;">Este artículo está licenciado con:<br />
<a title="Creative Commons" href="http://creativecommons.org/licenses/by-nc-sa/2.5/deed.es" target="_blank"><img src="http://albertovilches.com/wp-content/themes/img/cc.gif" alt="" width="88" height="31" /></a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/java-database-connectivity/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>E-zine #2 Comunidad DragonJAR</title>
		<link>http://casidiablo.net/e-zine-2-comunidad-dragonjar/</link>
		<comments>http://casidiablo.net/e-zine-2-comunidad-dragonjar/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 16:38:25 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[hacking]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[revistas]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/e-zine-2-comunidad-dragonjar/</guid>
		<description><![CDATA[La comunidad DragonJar a liberado el número 2 de su e-zine, que en esta ocación toca temas bastante interesantes como Blind SQL Injection, un tutorial de cómo crear un compilador para Java, administración de WordPress, entre otras. Los dejo con el enlace del anuncio oficial, donde se encuetra el link de descarga]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fe-zine-2-comunidad-dragonjar%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22E-zine%20%232%20Comunidad%20DragonJAR%22%20%7D);"></div>
<p style="text-align: center;"><img class="aligncenter" src="http://i270.photobucket.com/albums/jj96/Casidiablo/2589691368_5cd2603482.jpg" alt="tapa dje" width="386" height="500" /></p>
<p>La comunidad DragonJar a liberado el número 2 de su e-zine, que en esta ocación toca temas bastante interesantes como <a href="http://es.wikipedia.org/wiki/Blind_SQL_injection">Blind SQL Injection</a>, un tutorial de cómo crear un compilador para <a href="http://casidiablo.net/">Java</a>, administración de WordPress, entre otras.</p>
<p>Los dejo con el enlace del <a href="http://www.dragonjar.org/e-zine-2-comunidad-dragonjar.xhtml">anuncio oficial, donde se encuetra el link de descarga</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/e-zine-2-comunidad-dragonjar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo crear permalinks agradables</title>
		<link>http://casidiablo.net/permalinks-personalizados/</link>
		<comments>http://casidiablo.net/permalinks-personalizados/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 14:01:28 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/como-crear-permalinks-agradables/</guid>
		<description><![CDATA[La idea de este artículo es mostrar un sencillo ejemplo de cómo hacer que los links de nuestras aplicaciones web sean &#8220;bonitos&#8221;, algo así como los que podemos utilizar con WordPress. De tal manera no tendríamos links como estos: http://www.sitio.com/index.php?accion=consultar&#38;objetivo=personas Sino algo estéticamente más agradable como: http://www.sitio.com/personas/ ¿Qué necesito? Es necesario tener en cuenta los [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fpermalinks-personalizados%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22C%C3%B3mo%20crear%20permalinks%20agradables%22%20%7D);"></div>
<p>La idea de este artículo es mostrar un sencillo ejemplo de cómo hacer que los links de nuestras aplicaciones web sean &#8220;bonitos&#8221;, algo así como los que podemos utilizar con WordPress. De tal manera no tendríamos links como estos:</p>
<p style="padding-left: 30px;">http://www.sitio.com/index.php?accion=consultar&amp;objetivo=personas</p>
<p>Sino algo estéticamente más agradable como:</p>
<p style="padding-left: 30px;">http://www.sitio.com/personas/</p>
<h3>¿Qué necesito?</h3>
<p>Es necesario tener en cuenta los prerrequisitos para poder hacer esto. Para este ejemplo voy a suponer que la aplicación la estás haciendo sobre el servidor Apache, y que estás programando en PHP+MySQL. Necesitas:</p>
<ul>
<li>Manejar la mayor parte del trabajo con el archivo index.php. Esto más que un requisito es un consejo. Cuando estés desarrollando aplicaciones en PHP es recomendable que la mayor parte del sistema tenga que ser procesado inicialmente por este archivo, el cual se encargará de manejar todas las peticiones y utilizar los módulos que se necesiten. Esto, por supuesto, NO quiere decir que TODO el código vaya dentro del archivo index.php; una buena práctica es separar el código en módulos y llamarlos con funciones como <a href="http://www.php.net/include/">include</a> o <a href="http://www.php.net/require">require</a>.</li>
<li>Es necesario tener instalado el <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a>, el cual se utilizará desde un archivo .htaccess. El ModRewrite es un módulo para Apache que por lo general se configura (definir reglas) en el archivo httpd.conf, pero es posible poner una configuración ModRewrite en cualquier directorio de nuestro servidor web dentro del archivo .htaccess.</li>
<li>Puesto que de acuerdo al string que pasemos en la URL se debe determinar qué hacer, es necesario hacer algo de esto:
<ul>
<li>Hacer que dentro de la base de datos la llave primaria de la tabla a consultar sea una cadena de texto, ó</li>
<li>Hacer otro campo en la tabla de MySQL aparte de la llave primaria</li>
</ul>
</li>
</ul>
<h3>Ejemplo</h3>
<p>Para nuestro ejemplo necesitamos un servidor Apache con ModRewrite, PHP y MySQL. Lo primero es crear la base de datos, así:</p>
<pre class="brush: sql; title: ; notranslate">create database ejemplo;
create table contenidos(
id int(5) primary key auto_increment,
titulo varchar(50),
contenido varchar(1000),
slug varchar(50));</pre>
<p>Luego creamos una carpeta dentro del htdocs de apache, en donde pondremos los archivos de nuestro ejempo (mkdir /opt/lampp/htdocs/ejemplo). Hecho esto, lo siguiente es crear el archivo .htaccess, en el cual indicaremos las reglas del ModRewrite. En nuestro ejemplo tenemos algo como esto:</p>
<pre class="brush: xml; title: ; notranslate"># Esto es un comentario
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /ejemplo/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /ejemplo/index.php [L]
&lt;/IfModule&gt;</pre>
<p>Una explicación breve de este .htaccess:</p>
<ul>
<li>En los archivos .htaccess es posible hacer comentarios anteponiendo el simbolo numeral (almohadilla como dicen en España)</li>
<li><em>&lt;IfModule mod_rewrite.c&gt;</em>: Esta instrucción funciona como un if, que verifica si el ModRewrite está instalado.</li>
<li><em>RewriteEngine On</em>, activa el ModRewrite.</li>
<li><em><a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritebase">RewriteBase</a> /ejemplo/</em>, asigna el directorio base donde trabajará el ModRewrite</li>
<li><em>RewriteCond %{REQUEST_FILENAME} !-f</em> y <em>RewriteCond %{REQUEST_FILENAME} !-d</em>, la instrucción <em>RewriteCond</em> funciona como una condición que en caso de ser verdadera hará que se ejecute una regla (<em>RewriteRule</em>) del ModRewrite. Funciona con expresiones regulares. En este caso lo que estamos verificando es si la petición se trata de un archivo (-f) o directorio (-d) que no (!) existe, en cuyo caso ejecuta la RewriteRule de abajo. Pero ¿para qué esto? Dado que las peticiones que hacemos usando URL bonitas no existen físicamente en el servidor, podemos aprovecharlas para indicar que dichas URL las manejará el archivo index.php, es decir, si por ejemplo hacemos una consulta como:
<p>http://www.sitio.com/<strong>link-agradable</strong></p>
<p>y en dicho servidor no existe ninguna carpeta o archivo que tenga el nombre <strong>link-agradable</strong>, el control de dicha petición se enviará al archivo index.php.</li>
<li><em>RewriteRule . /ejemplo/index.php [L]</em>, ejecuta la regla que en este caso hace que el control de la aplicacion pase al archivo index.php, el cual se encargará de analizar la URL y realizar las operaciones adecuadas. La instrucción [L] hace que cualquier otra regla por debajo de esa linea no se cumpla.</li>
<li><em>&lt;/IfModule&gt;</em>, cerramos nuestro if.</li>
</ul>
<p>Vamos ahora con nuestro archivo index.php:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
   //URL base de la aplicacion
   $base = &quot;http://localhost/ejemplo/&quot;;
   //Crear la conexion a la base de datos
   $conexion = mysql_connect(&quot;localhost&quot;, &quot;root&quot;, &quot;&quot;);
   mysql_select_db(&quot;ejemplo&quot;, $conexion);
   //Si se requiere unicamente el index
   if((&quot;http://&quot;.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']) == $base ||
      basename($_SERVER['REQUEST_URI']) == &quot;index.php&quot;)
      $contenido = &quot;Lo que vaya en el index por defecto&quot;;
   else {
      $id = $_GET[&quot;id&quot;];
      //Si es una URL fea-asquerosa...
      if(!empty($id))
         $consulta = mysql_query(&quot;SELECT contenido FROM contenidos WHERE id = $id&quot;, $conexion);
      //Si es una URL bonita...
      else
      {
         //Obtener el nombre clave
         $slug = basename($_SERVER['REQUEST_URI']);
         $consulta = mysql_query(&quot;SELECT contenido FROM contenidos WHERE slug = '$slug'&quot;, $conexion);
      }
      //Si la consulta es correcta...
      if(mysql_num_rows($consulta) &gt; 0)
         $contenido = mysql_result($consulta, 0, 0);
      //Informar del terrible error
      else
         $contenido = &quot;Lo que est&amp;aacute;s buscando no existe <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  &quot;;
   }
?&gt;
&lt;html&gt;
&lt;head&gt;&lt;title&gt;Un ejemplo&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;&lt;?php echo $contenido ?&gt;&lt;/body&gt;
&lt;/html&gt;
</pre>
<ul>
<li>Línea 3: es recomendable para este tipo de aplicaciones (y para casi todas en general), que tengamos una URL fija definida para nuestra aplicación. En este caso almacenamos el string  http://localhost/ejemplo/ en la variable  $base.</li>
<li>En las líneas 5 y 6 creamos la conexión a la base de datos.</li>
<li>En el if de la línea 8 verificamos si la petición HTTP es para la raiz de nuestro proyecto (llamar simplement al index.php), de lo contrario&#8230;</li>
<li>En las líneas 12 y 14 verificamos si se trata de una petición GET normal, en la que pasamos pares variable-valor dentro de la URL. En cuyo caso se realiza una consulta a la base de datos tomando en cuenta las variables GET (línea 15).</li>
<li>Si la peticion está formada como una URL bonita, creamos una variable llamada $slug que contiene el nombre base de la URI (línea 20), es decir, si la peticion es http://www.sitio.com/<strong>link-agradable</strong>, el nombre base de la URI es <strong>link-agradable</strong>. Posteriormente, en la línea 21 hacemos una consulta en la base de datos buscando un registro que contenga dicho slug.</li>
<li>En la línea 24 verificamos si la consulta ejecutada anteriormente contiene registros, en cuyo caso pone el contenido en la variable $contenido. Sino, se mete en esa variable un mensaje que dice que no se encontró el registro.</li>
</ul>
<p>Hecho esto, nuestra aplicación tendrá el siguiente comportamiento:</p>
<p><em>La aplicación por defecto:</em></p>
<p style="text-align: center;"><img class="aligncenter" src="http://i270.photobucket.com/albums/jj96/Casidiablo/1.png" alt="por defecto" width="600" height="245" /></p>
<p><em>Una consulta a la antigua (URL fea):</em></p>
<p style="text-align: center;"><img class="aligncenter" src="http://i270.photobucket.com/albums/jj96/Casidiablo/3.png" alt="" /></p>
<p><em>Una consulta estéticamente más bonita:</em></p>
<p style="text-align: center;"><img class="aligncenter" src="http://i270.photobucket.com/albums/jj96/Casidiablo/4.png" alt="imagen permalink" width="600" height="246" /></p>
<p><em>Cuando no encuentra un registro:</em></p>
<p style="text-align: center;"><img class="aligncenter" src="http://i270.photobucket.com/albums/jj96/Casidiablo/5.png" alt="" /></p>
<h3>Enlaces</h3>
<ul>
<li>Descargar archivos del ejemplo <a class="descargacodigo tooltip" title="Descargar archivo ejemplo.tar.gz::"href="http://casidiablo.net/codigos/ejemplo.tar.gz">click aquí</a></li>
<li><a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">Documentación ModRewrite</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/permalinks-personalizados/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>¿Porqué el logo de PHP es un elefante?</title>
		<link>http://casidiablo.net/%c2%bfporque-el-logo-de-php-es-un-elefante/</link>
		<comments>http://casidiablo.net/%c2%bfporque-el-logo-de-php-es-un-elefante/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 22:33:56 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/%c2%bfporque-el-logo-de-php-es-un-elefante/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252F%2525c2%2525bfporque-el-logo-de-php-es-un-elefante%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%C2%BFPorqu%C3%A9%20el%20logo%20de%20PHP%20es%20un%20elefante%3F%22%20%7D);"></div>
<p style="text-align: center;"><a rel="lightbox" href="http://www.intergraphicdesigns.com/blog/php-mysql/2008/04/por-qu-la-mascota-de-php-es-un-elefante.html" target="_blank"><img class="aligncenter" src="http://www.anieto2k.com/wp-content/uploads/2008/06/php-logo-php-721782.gif" alt="php-logo-php-721782" /></a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/%c2%bfporque-el-logo-de-php-es-un-elefante/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Instalar Java+Eclipse+Tomcat en Ubuntu 8.04</title>
		<link>http://casidiablo.net/instalar-javaeclipsetomcat-en-ubuntu-804/</link>
		<comments>http://casidiablo.net/instalar-javaeclipsetomcat-en-ubuntu-804/#comments</comments>
		<pubDate>Mon, 12 May 2008 16:24:26 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/05/12/instalar-javaeclipsetomcat-en-ubuntu-804/</guid>
		<description><![CDATA[Hace un tiempo ya, explicaba la Instalación de un entorno Web: Tomcat + JSP + MySQL. Esta vez, quisiera recomendarles un How-To paso a paso que ha escrito José en el que explica cómo instalar Java + Eclipse + Tomcat sobre la recién salida Ubuntu Hardy Heron. Mucho muy bonito el artículo! Instalar Java + [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Finstalar-javaeclipsetomcat-en-ubuntu-804%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalar%20Java%2BEclipse%2BTomcat%20en%20Ubuntu%208.04%22%20%7D);"></div>
<p><img src="http://i270.photobucket.com/albums/jj96/Casidiablo/box_ubuntu_disc.png" width="256" align="right" height="256" />Hace un tiempo ya, explicaba la <a href="http://www.casidiablo.net/wordpress/index.php/2007/02/22/instalacion-de-un-entorno-web-tomcat-jsp-mysql/" rel="bookmark">Instalación de un entorno Web: Tomcat + JSP + MySQL</a>. Esta vez, quisiera recomendarles un How-To paso a paso que ha escrito <a href="http://ubuntulife.wordpress.com">José</a> en el que explica <a href="http://ubuntulife.wordpress.com/2008/05/06/instalar-javaeclipsetomcat-en-ubuntu-804/">cómo instalar Java + Eclipse + Tomcat</a> sobre la recién salida <a href="https://wiki.ubuntu.com/HardyHeron">Ubuntu Hardy Heron</a>.</p>
<p>Mucho muy bonito el artículo!</p>
<p><strong><a href="http://ubuntulife.wordpress.com/2008/05/06/instalar-javaeclipsetomcat-en-ubuntu-804/">Instalar Java + Eclipse + Tomcat sobre Ubuntu 8.04</a></strong></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/instalar-javaeclipsetomcat-en-ubuntu-804/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Links interesantes de la semana&#8230;</title>
		<link>http://casidiablo.net/links-interesantes-de-la-semana/</link>
		<comments>http://casidiablo.net/links-interesantes-de-la-semana/#comments</comments>
		<pubDate>Wed, 07 May 2008 21:02:29 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[noticias]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/05/07/links-interesantes-de-la-semana/</guid>
		<description><![CDATA[Y de hace ya un tiempo En orden cronológico: Como cambiar la clave de root en Mysql Compiz-check: Comprueba si puedes ejecutar Compiz en tu PC Comandos utiles para Ubuntu Consejos para optimizar bases de datos MySQL Ship it de Fedora Corre Ubuntu mobile desde tu PC de escritorio La mejor PHP Cheat Sheet El [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Flinks-interesantes-de-la-semana%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Links%20interesantes%20de%20la%20semana...%22%20%7D);"></div>
<p>Y de hace ya un tiempo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  En orden cronológico:</p>
<ul>
<li><a href="http://www.techno.mayix.net/2008/04/13/como-cambiar-la-clave-de-root-en-mysql/">Como cambiar la clave </a><a href="http://eveliotc.wordpress.com/2008/05/04/mysql-recuperar-contrasena-del-root/">de root en Mysql</a></li>
<li><a href="http://www.maty1206linuxeando.com/?p=1016">Compiz-check: Comprueba si puedes ejecutar Compiz en tu PC</a></li>
<li><a href="http://gndx.org/?p=249">Comandos utiles para Ubuntu</a></li>
<li><a href="http://www.kabytes.com/programacion/consejos-para-optimizar-bases-de-datos-mysql/">Consejos para optimizar bases de datos MySQL</a></li>
<li><a href="http://www.durmiendoafuera.com/ship-it-de-fedora/">Ship it de Fedora</a></li>
<li><a href="http://www.blux20.com/2008/05/corre-ubuntu-mobile-desde-tu-pc-de-escritorio/">Corre Ubuntu mobile desde tu PC de escritorio</a></li>
<li><a href="http://www.kabytes.com/general/la-mejor-php-cheat-sheet/">La mejor PHP Cheat Sheet</a></li>
<li><a href="http://mundogeek.net/archivos/2008/05/06/el-tutorial-de-python-en-pdf/">El tutorial de Python en PDF</a></li>
<li><a href="http://albertjh.cymaho.com/?p=409">Como conectar a Java y MySQL (NetBeans)</a></li>
<li><a href="http://picandocodigo.net/index.php/2008/05/07/el-resultado-del-proyecto-indiana-open-solaris-200805/">El resultado del Proyecto Indiana: Open Solaris 2008.05</a></li>
</ul>
<h3>Podcasts&#8230;</h3>
<ul>
<li><a href="http://www.linpodcast.emnhome.com/?p=65">Linpodcast 03 &#8211; 02</a></li>
<li><a href="http://linpodcast.com/mrcomputer1/?p=27">El podcast de mrcomputer 4</a></li>
<li><a href="http://www.linuxhispano.net/podcast/?p=34">#014 &#8211; El podcast de Linux Hispano</a></li>
<li><a href="http://javaposse.com/index.php?post_id=335433#">Java Posse #184 &#8211; Newscast for May 2nd 2008</a></li>
<li><a href="http://www.linuxactionshow.com/?p=182">Season 8, Episode 7 &#8211; Slightly Delayed</a></li>
<li><a href="http://www.pinguinos.org.mx/index.php?id=71">Pingüinos en el Alambre</a></li>
<li><a href="http://www.earthmusicnetwork.com/opsl/?p=41">OPSL 30 &#8211; Seguridad, VirtualBox, Compilando Mono y otras cosas</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/links-interesantes-de-la-semana/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Consultar DB en Java &#8211; Mostrar resultados en un JTable</title>
		<link>http://casidiablo.net/consultar-base-datos-java-mostrar-resultados-jtable/</link>
		<comments>http://casidiablo.net/consultar-base-datos-java-mostrar-resultados-jtable/#comments</comments>
		<pubDate>Fri, 02 May 2008 13:40:46 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2007/11/26/consultar-db-en-java-mostrar-resultados-en-un-jtable/</guid>
		<description><![CDATA[Siguiendo con nuestro tema de conexiones a bases de datos desde Java&#8230; Cuando estamos trabajando con bases de datos y aplicaciones que usen Swing, la manera más elegante de presentar los datos a un usuario es usando tablas usando la clase JTable. Lo que haremos será básicamente crear una clase que herede de la clase [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fconsultar-base-datos-java-mostrar-resultados-jtable%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Consultar%20DB%20en%20Java%20-%20Mostrar%20resultados%20en%20un%20JTable%22%20%7D);"></div>
<p>Siguiendo con nuestro tema de <a href="http://www.casidiablo.net/wordpress/index.php/2007/11/19/ejemplo-basico-de-programacion-con-jdbc-y-mysql/"><strong>conexiones a bases de datos desde Java</strong></a>&#8230; Cuando estamos trabajando con bases de datos y aplicaciones que usen <a href="http://es.wikipedia.org/wiki/Swing_(biblioteca_gr%C3%A1fica)" title="Leer en la wikipedia">Swing</a>, la manera más elegante de presentar los datos a un usuario es usando tablas usando la clase <a href="https://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTable.html" target="_blank">JTable</a>.</p>
<p style="text-align: center"><img src="http://img162.imageshack.us/img162/5121/tablajdbcswingvf6.png" title="tabla swing jdbc" alt="tabla swing jdbc" width="364" height="166" /></p>
<p> Lo que haremos será básicamente crear una clase que herede de la clase <a href="https://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html">AbstractTableModel</a>:</p>
<blockquote class="cita"><p>Esta clase abstracta provee la implementación por defecto de la mayoría de los métodos en la interfaz <a href="http://72.5.124.55/j2se/1.4.2/docs/api/javax/swing/table/TableModel.html"><code>TableModel</code></a>. Para crear un <code>TableModel</code> como subclase de <code>AbstractTableModel</code> necesitarás implementar únicamente los sigientes tres métodos:</p>
<pre>  public int getRowCount();  public int getColumnCount();public Object getValueAt(int row, int column);</pre>
</blockquote>
<p><span id="more-697"></span>Dicha clase administrará el contenido de nuestra tabla. Ten en cuenta que vamos a trabajar con la <a href="http://www.casidiablo.net/wordpress/index.php/2007/11/19/ejemplo-basico-de-programacion-con-jdbc-y-mysql/">base de datos que hicimos aquí</a>. Veamos entonces el código:</p>
<pre class="brush: java; title: ; notranslate">import java.sql.*;
import java.util.*;
import javax.swing.table.*;
// Las filas y columnas del objeto ResultSet se cuentan desde 1 y las filas
// y columnas del objeto JTable se cuentan desde 0. Al procesar filas
// o columnas del objeto ResultSet para usarlas en un objeto JTable, es
// necesario sumar 1 al número de fila o columnas para manipular la
// columna apropiada del objeto ResultSet (es decir, la columna 0 del objeto JTable
// es la columna 1 del objeto ResultSet y la fila 0 del objeto JTable es la fila 1 del objeto ResultSet).
public class ModeloTablaResultados extends AbstractTableModel {
    private Connection conexion;
    private Statement instruccion;
    private ResultSet conjuntoResultados;
    private ResultSetMetaData metaDatos;
    private int numeroDeFilas;
    // mantener el registro del estado de la conexión a la base de datos
    private boolean conectadoALaBaseDeDatos = false;
    // inicializar conjuntoResultados y obtener su objeto de meta datos;
    // determinar el número de filas
    public ModeloTablaResultados( String controlador, String url,
            String consulta ) throws SQLException, ClassNotFoundException {
        // cargar clase de controlador de base de datos
        Class.forName( controlador );
        // conectarse a la base de datos
        conexion = DriverManager.getConnection( url );
        // crear objeto Statement para consultar la base de datos
        instruccion = conexion.createStatement(
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY );
        // actualizar estado de conexión a la base de datos
        conectadoALaBaseDeDatos = true;
        // establecer consulta y ejecutarla
        establecerConsulta( consulta );
    }
    // obtener la clase que representa al tipo de columna
    public Class getColumnClass( int columna ) throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // determinar la clase de Java de columna
        try {
            String nombreClase = metaDatos.getColumnClassName( columna + 1 );
            // devolver objeto Class que representa a nombreClase
            return Class.forName( nombreClase );
        }
        // atrapar excepciones SQLException y ClassNotFoundException
        catch ( Exception excepcion ) {
            excepcion.printStackTrace();
        }
        // si ocurren problemas arriba, suponer que es tipo Object
        return Object.class;
    }
    // obtener el número de columnas en el objeto ResultSet
    public int getColumnCount() throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // determinar el número de columnas
        try {
            return metaDatos.getColumnCount();
        }
        // atrapar excepciones SQLException e imprimir mensaje de error
        catch ( SQLException excepcionSQL ) {
            excepcionSQL.printStackTrace();
        }
        // si ocurren problemas arriba, devolver 0 para el número de columnas
        return 0;
    }
    // obtener el nombre de una columna específica en el objeto ResultSet
    public String getColumnName( int columna ) throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // determinar el nombre de la columna
        try {
            return metaDatos.getColumnName( columna + 1 );
        }
        // atrapar excepciones SQLException e imprimir mensaje de error
        catch ( SQLException excepcionSQL ) {
            excepcionSQL.printStackTrace();
        }
        // si hay problemas, devolver cadena vacía para el nombre de la columna
        return &quot;&quot;;
    }
    // devolver el número de filas en el objeto ResultSet
    public int getRowCount() throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        return numeroDeFilas;
    }
    // obtener el valor en una fila y columna específicas
    public Object getValueAt( int fila, int columna ) throws IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // obtener un valor en una fila y columna específicas del objeto ResultSet
        try {
            conjuntoResultados.absolute( fila + 1 );
            return conjuntoResultados.getObject( columna + 1 );
        }
        // atrapar excepciones SQLExceptions e imprimir mensaje de error
        catch ( SQLException excepcionSQL ) {
            excepcionSQL.printStackTrace();
        }
        // si hay problemas, devolver objeto cadena vacía
        return &quot;&quot;;
    }
    // establecer nueva cadena de consulta para la base de datos
    public void establecerConsulta( String consulta )throws SQLException, IllegalStateException {
        // asegurar que la conexión a la base de datos esté disponible
        if ( !conectadoALaBaseDeDatos )
            throw new IllegalStateException( &quot;No hay conexion a la base de datos&quot; );
        // especificar consulta y ejecutarla
        conjuntoResultados = instruccion.executeQuery( consulta );
        // obtener meta datos para el objeto ResultSet
        metaDatos = conjuntoResultados.getMetaData();
        // determinar el número de filas en el objeto ResultSet
        conjuntoResultados.last();                   // mover a la última fila
        numeroDeFilas = conjuntoResultados.getRow();  // obtener número de fila
        // notificar al objeto JTable que el modelo ha cambiado
        fireTableStructureChanged();
    }
    // cerrar objetos Statement y Connection
    public void desconectarDeLaBaseDeDatos() {
        // cerrar objetos Statement y Connection
        try {
            instruccion.close();
            conexion.close();
        }
        // atrapar excepciones SQLException e imprimir mensaje de error
        catch ( SQLException excepcionSQL ) {
            excepcionSQL.printStackTrace();
        }
        // actualizar estado de conexión a la base de datos
        finally {
            conectadoALaBaseDeDatos = false;
        }
    }
}  // fin de la clase ResultSetTableModel</pre>
<h3>Cosas por explicar el en código anterior:</h3>
<ul>
<li>Si tienes dudas respecto a las operaciones hechas  con el API de JDBC significa que debes leer esto primero: <a href="http://www.casidiablo.net/wordpress/index.php/2007/11/19/ejemplo-basico-de-programacion-con-jdbc-y-mysql/">Ejemplo Programación con JDBC</a></li>
<li><strong>public Class getColumnClass();</strong> con este método obtendremos el tipo de dato de la columna (<a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html">Integer</a>, <a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html">String</a>, <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Float.html">Float</a>, etc).</li>
<li><strong>public int getColumnCount();</strong> este método devuelve el número de columnas que tendrá la tabla.</li>
<li><strong>public String getColumnName(int x);</strong> devuelve el nombre de la columna X de la tabla.</li>
<li><strong>public int getRowCount();</strong> este método devuelve el número de filas que tendrá la tabla.</li>
<li><strong>public Object getValueAt(int f, int c);</strong> asigna a la tabla el valor de la celda que se encuentra en la fila <em>f</em> y en la columna <em>c</em>.</li>
<li><strong>fireTableStructureChanged();</strong> esto le indica al objeto <a href="https://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html">AbstractTableModel</a> que la estructura de la tabla ha cambiado.</li>
</ul>
<p>Ahora el código del frame que contiene la tabla:</p>
<pre class="brush: java; title: ; notranslate">import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class MostrarResultadosConsulta extends JFrame {
    // controlador JDBC y URL de la base de datos
    static final String CONTROLADOR_JDBC = &quot;com.mysql.jdbc.Driver&quot;;
    static final String URL_BASEDEDATOS = &quot;jdbc:mysql://localhost/ejemplo?user=root&amp;amp;amp;password=&quot;;
    // la consulta predeterminada recupera todos los datos de la tabla autores
    static final String CONSULTA_PREDETERMINADA = &quot;SELECT * FROM datos&quot;;
    private ModeloTablaResultados modeloTabla;
    private JTextArea areaConsulta;
    // crear objeto ModeloTablaResultados y GUI
    public MostrarResultadosConsulta() {
        super( &quot;Mostrando resultados de la consulta&quot; );
        // crear objeto ModeloTablaResultados y mostrar tabla de la base de datos
        try {
            // crear objeto TableModel para los resultados del a consulta SELECT * FROM autores
            modeloTabla = new ModeloTablaResultados( CONTROLADOR_JDBC, URL_BASEDEDATOS,
                    CONSULTA_PREDETERMINADA );
            JTable tablaResultados = new JTable(modeloTabla);

            getContentPane().setLayout(new BorderLayout());
            getContentPane().add( new JScrollPane(tablaResultados) , BorderLayout.CENTER );
            // establecer tamaño de ventana y mostrarla en pantalla
            setSize( 500, 250 );
            setVisible( true );
        }  // fin de bloque try
        // atrapar la excepción ClassNotFoundException lanzada por el
        // objeto ModeloTablaResultados si no se encuentra el controlador de la base de datos
        catch ( ClassNotFoundException claseNoEncontrada ) {
            JOptionPane.showMessageDialog( null,
                    &quot;No se encontro el controlador de la base de datos&quot;, &quot;No se encontro el controlador&quot;,
                    JOptionPane.ERROR_MESSAGE );
            System.exit( 1 );   // terminar la aplicación
        } // fin de bloque catch
        // atrapar la excepción SQLException lanzada por el objeto ModeloTablaResultados
        // si ocurren problemas al establecer la conexión a la base de datos
        // y realizar la consulta en la misma
        catch ( SQLException excepcionSQL ) {
            JOptionPane.showMessageDialog( null, excepcionSQL.getMessage(),
                    &quot;Error en la base de datos&quot;, JOptionPane.ERROR_MESSAGE );
            // asegurar que la conexión a la base de datos esté cerrada
            modeloTabla.desconectarDeLaBaseDeDatos();
            System.exit( 1 );   // terminar la aplicación
        }
        // desechar la ventana cuando el usuario salga de la aplicación
        // (esta opción sobrescribe a la opción predeterminada de HIDE_ON_CLOSE)
        setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        // asegurar que la conexión a la base de datos esté cerrada cuando el usuario salga de la aplicación
        addWindowListener(
                new WindowAdapter() {
            // desconectarse de la base de datos y salir cuando se haya cerrado la ventana
            public void windowClosed( WindowEvent evento ) {
                modeloTabla.desconectarDeLaBaseDeDatos();
                System.exit( 0 );
            }
        }
        );
    }  // fin del constructor de MostrarResultadosConsulta
    // ejecutar la aplicación
    public static void main( String args[] ) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        new MostrarResultadosConsulta();
    }
}  // fin de la clase MostrarResultadosConsulta</pre>
<p>Puedes ver un ejemplo más completo, llamado TableExample, en el set de demos que proporciona el JDK (puedes descargarlo abajo).</p>
<h3>Descargas</h3>
<ul>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Tablas">Ejemplos y código fuente</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/consultar-base-datos-java-mostrar-resultados-jtable/feed/</wfw:commentRss>
		<slash:comments>57</slash:comments>
		</item>
		<item>
		<title>¿Cerrar este blog?</title>
		<link>http://casidiablo.net/%c2%bfcerrar-este-blog/</link>
		<comments>http://casidiablo.net/%c2%bfcerrar-este-blog/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 18:13:08 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/04/08/%c2%bfcerrar-este-blog/</guid>
		<description><![CDATA[Antes que nada les pido disculpas por tener tan descuidado el blog, que de una u otra forma es un espacio donde algunos aprenden cositas. Me han preguntado que si voy a cerrar o ¿qué?. Pues bien&#8230; he tenido problemas de conexión, de hosting, y personales, lo que impiden que lleve un ritmo decente de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252F%2525c2%2525bfcerrar-este-blog%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%C2%BFCerrar%20este%20blog%3F%22%20%7D);"></div>
<p><img src="http://farm2.static.flickr.com/1425/1311527517_9a7fb91501_m.jpg" width="240" align="right" height="183" />Antes que nada les pido disculpas por tener tan descuidado el blog, que de una u otra forma es un espacio donde algunos aprenden cositas. Me han preguntado que si voy a cerrar o ¿qué?. Pues bien&#8230; he tenido problemas de conexión, de hosting, y personales, lo que impiden que lleve un ritmo decente de posteo&#8230; aún así aquí estoy comentándoles las buenas nuevas. El blog no cierra de momento, pero si llego a iniciar otro proyecto quien sabe (a todas estas, <a href="http://www.elblogdemaverick.com/?p=313">El blog de Maverick ha sido cerrado</a>&#8230; una completa lástima). La verdad es que aparte de ser un pasatiempo, este blog me sirve de memoria, es decir, como aquí escribo lo que aprendo, cuando se me olvida algo vengo y lo busco acá <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Les comento entonces otras cosas, ya que necesito de su opinión&#8230; resulta que me he <a href="http://rienzie.com/ganadores-del-concurso-quiero-estar-en-tu-blogroll/">ganado un concurso</a> que realizó <a href="http://rienzie.com/">Angel Carrión</a>! El premio son 50 dolares pero aún no he recibido nada. No porque Angel sea mala-paga, el problema es más bien mio. Angel envía el dinero vía Paypal, pero para crear una cuenta en Paypal me piden tarjetas de crédito Visa, MasterCard, etc. Como colombiano <strike>pobre</strike> promedio no uso tales tarjetas, y además no tengo la suficiente paciencia como para intentarlo por otros medios (Angel no puede hacerme el giro vía Western Union, porque en españa eso no existe), ni tampoco quiero causarle mayores molestías a Angel.</p>
<p>Así que he decidido donar el dinero a algún proyecto de Software Libre (y gratuito) o que tenga que ver con Linux. Pero aún no me decido <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  No es mucho dinero, pero sería bueno aportar un granito de arena. Hasta ahora he pensado en <a href="http://www.linuxfromscratch.org/">Linux From Scracth</a>, el podcast <a href="http://www.linuxactionshow.com/">Linux Action Show</a>, <a href="http://amarok.kde.org/">Amarok</a>, <a href="http://www.mozilla.org/foundation/donate.html">Mozilla</a> (aunque estos reciben bastante pasta desde Google), y <a href="http://es.wikipedia.org">Wikipedia</a>, pero no termino de decidirme.</p>
<p>Además que es <strong>dinero sucio</strong>&#8230; ya que el sorteo lo han hecho sobre Windows Vista (es broma). En fin, si tienes alguna sugerencia o conoces algún proyecto que pueda necesitar un granito de arena, coméntalo!</p>
<p>Por último, recomendar un par links, ya que no creo que pueda publicar mucho esta semana (ya son noticias viejas, pero hay que mencionarlas):</p>
<ul>
<li><a href="http://www.linuxhispano.net/podcast/?p=29">Número #12 del podcast de Linux Hispano</a></li>
<li><a href="http://www.linuxactionshow.com/?p=178">Un podcat más de The Linux Action Show</a></li>
<li><a href="http://gndx.org/?p=209">Trasmitir Audio Con nuestro Servidor Shoutcast</a></li>
<li><a href="http://ubuntulife.net/wordpress/?p=125">SQL Developer, ideal para desarrollar con Oracle</a> (me va a servir mucho ahora que comienzo mis clases de Oracle)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/%c2%bfcerrar-este-blog/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
	</channel>
</rss>

