Integración de JDBC con Spring

Integración de JDBC con Spring 

En este ejemplo, usted aprenderá cómo el JDBCTemplate de Spring simplifica el código que tiene que escribir para realizar las operaciones relacionadas con bases de datos. El método insertForum () muestra la cantidad de código que necesita para insertar datos usando JDBC.

package com.amalakaky.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.sql.DataSource;

import com.amalakaky.dominio.Forum;

public
class JDBCForumDAOImpl implements ForumDAO {

    private DataSource dataSource;

    

    public
void setDataSource(DataSource dataSource) {

        this.dataSource = dataSource;

    }

    public
void insertForum(Forum forum) {

        /**

         *
Especifique
la
instrucción

         */

        String query = “INSERT INTO FORUMS (FORUM_ID, FORUM_NAME, FORUM_DESC) VALUES (?,?,?)”;

        /**

         *
Definir
los
parámetros
de
conexión
y
PreparedStatement

         */

        Connection connection = null;

        PreparedStatement preparedStatement = null;

        try {

            /**

             *
Abre
la
conexión

             */

            connection = dataSource.getConnection();

            /**

             *
Prepare
el
instrucción

             */

            preparedStatement = connection.prepareStatement(query);

            /**

             *
Enlazar
los
parámetros
de
la
PreparedStatement

             */

            preparedStatement.setInt(1, forum.getForumId());

            preparedStatement.setString(2, forum.getForumName());

            preparedStatement.setString(3, forum.getForumDesc());

            /**

             *
Ejecute
la
instrucción

             */

            preparedStatement.execute();

        } catch (SQLException e) {

            /**

             *
Manejar
cualquier
excepción

             */

            e.printStackTrace();

        } finally {

            try {

                /**

                 *
Cerrar
el
PreparedStatement

                 */

                if (preparedStatement != null) {

                    preparedStatement.close();

                }

                /**

                 *
Cierra
la
conexión

                 */

                if (connection != null) {

                    connection.close();

                }

            } catch (SQLException e) {

                /**

                 *
Manejar
cualquier
excepción

                 */

                e.printStackTrace();

            }

        }

    }

    

    public Forum selectForum(int forumId) {

        /**

         *
Especifique
la
instrucción

         */

        String query = “SELECT * FROM FORUMS WHERE FORUM_ID=?”;

        /**

         *
Defina
los
parámetros
de
conexión,
PreparedStatement
y
ResultSet

         */

        Connection connection = null;

        PreparedStatement preparedStatement = null;

        ResultSet resultSet = null;

        try {

            /**

             *
Abre
la
conexión

             */

            connection = dataSource.getConnection();

            /**

             *
Prepare
el
instrucción

             */

            preparedStatement = connection.prepareStatement(query);

            /**

             *
Enlazar
los
parámetros
de
la
PreparedStatement

             */

            preparedStatement.setInt(1, forumId);

            /**

             *
Ejecute
la
instrucción

             */

            resultSet = preparedStatement.executeQuery();

            Forum forum = null;

            /**

             *
Extraer
datos
del
conjunto
de
resultados

             */

            if(resultSet.next())

            {

                forum = new Forum(resultSet.getInt(“FORUM_ID”),resultSet.getString(“FORUM_NAME”),resultSet.getString(“FORUM_DESC”));

            }

            return forum;

        } catch (SQLException e) {

            /**

             *
Manejar
cualquier
excepción

             */

            e.printStackTrace();

        } finally {

            try {

                /**

                 *
Cierra
el
conjunto
de
resultados

                 */

                if (resultSet != null) {

                    resultSet.close();

                }

                /**

                 *
Cerrar
el
PreparedStatement

                 */

                if (preparedStatement != null) {

                    preparedStatement.close();

                }

                /**

                 *
Cierra
la
conexión

                 */

                if (connection != null) {

                    connection.close();

                }

            } catch (SQLException e) {

                /**

                 *
Manejar
cualquier
excepción

                 */

                e.printStackTrace();

            }

        }

        return
null;

    }

}

Como se puede ver en su mayoría es código repetitivo necesario para gestionar los recursos y manejar las excepciones. El código siguiente muestra cómo la JDBCTemplate de Spring puede simplificar esta tarea por usted.

package com.amalakaky.dao;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.RowMapper;

import com.amalakaky.dominio.Forum;

public
class ForumDAOImpl implements ForumDAO {

    private JdbcTemplate jdbcTemplate;

    public
void setDataSource(DataSource dataSource) {

        this.jdbcTemplate = new JdbcTemplate(dataSource);

    }

    public
void insertForum(Forum forum) {

        /**

         *
Especifique
la
instrucción

         */

        String query = “INSERT INTO FORUMS (FORUM_ID, FORUM_NAME, FORUM_DESC) VALUES (?,?,?)”;

        /**

         *
Especifique
los
valores

         */

        jdbcTemplate.update(query, new Object[] { Integer.valueOf(forum.getForumId()),

                forum.getForumName(), forum.getForumDesc() });

    }

    

    @SuppressWarnings(“unchecked”)

    public Forum selectForum(int forumId) {

        /**

         *
Especifique
la
instrucción

         */

        String query = “SELECT * FROM FORUMS WHERE FORUM_ID=?”;

        /**

         *
Implementar
la
interfaz
de
devolución
de
llamada
RowMapper

         */

        return (Forum) jdbcTemplate.queryForObject(query, new Object[] { Integer.valueOf(forumId) },

                new RowMapper() {

                    public Object mapRow(ResultSet resultSet, int rowNum) throws SQLException {

                        return
new Forum(resultSet.getInt(“FORUM_ID”), resultSet.getString(“FORUM_NAME”),

                                resultSet.getString(“FORUM_DESC”));

                    }

                });

    }

}

Usando JDBCTemplate escribir el código sólo se relaciona con la inserción de los datos y todo el código repetitivo es atendido por la propia plantilla. update () es un métodos disponibles, se puede implementar lo que es sencillo y se adapte a sus necesidad. La llevamos a cabo aquí toma una consulta SQL y una serie de

Objeto que contiene los valores que unidos a los parámetros indexados de la consulta. JDBCTemplate es adecuado con JDK 1,6 y superior.

El método selectForum () muestra la cantidad de código que necesita para escribir los datos usando JDBC.

package com.amalakaky.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.sql.DataSource;

import com.amalakaky.dominio.Forum;

public
class JDBCForumDAOImpl implements ForumDAO {

    private DataSource dataSource;

    

    public
void setDataSource(DataSource dataSource) {

        this.dataSource = dataSource;

    }

    public
void insertForum(Forum forum) {

        /**

         *
Especifique
la
instrucción

         */

        String query = “INSERT INTO FORUMS (FORUM_ID, FORUM_NAME, FORUM_DESC) VALUES (?,?,?)”;

        /**

         *
Definir
los
parámetros
de
conexión
y
PreparedStatement

         */

        Connection connection = null;

        PreparedStatement preparedStatement = null;

        try {

            /**

             *
Abre
la
conexión

             */

            connection = dataSource.getConnection();

            /**

             *
Prepare
el
instrucción

             */

            preparedStatement = connection.prepareStatement(query);

            /**

             *
Enlazar
los
parámetros
de
la
PreparedStatement

             */

            preparedStatement.setInt(1, forum.getForumId());

            preparedStatement.setString(2, forum.getForumName());

            preparedStatement.setString(3, forum.getForumDesc());

            /**

             *
Ejecute
la
instrucción

             */

            preparedStatement.execute();

        } catch (SQLException e) {

            /**

             *
Manejar
cualquier
excepción

             */

            e.printStackTrace();

        } finally {

            try {

                /**

                 *
Cerrar
el
PreparedStatement

                 */

                if (preparedStatement != null) {

                    preparedStatement.close();

                }

                /**

                 *
Cierra
la
conexión

                 */

                if (connection != null) {

                    connection.close();

                }

            } catch (SQLException e) {

                /**

                 *
Manejar
cualquier
excepción

                 */

                e.printStackTrace();

            }

        }

    }

    

    public Forum selectForum(int forumId) {

        /**

         *
Especifique
la
instrucción

         */

        String query = “SELECT * FROM FORUMS WHERE FORUM_ID=?”;

        /**

         *
Defina
los
parámetros
de
conexión,
PreparedStatement
y
ResultSet

         */

        Connection connection = null;

        PreparedStatement preparedStatement = null;

        ResultSet resultSet = null;

        try {

            /**

             *
Abre
la
conexión

             */

            connection = dataSource.getConnection();

            /**

             *
Prepare
el
instrucción

             */

            preparedStatement = connection.prepareStatement(query);

            /**

             *
Enlazar
los
parámetros
de
la
PreparedStatement

             */

            preparedStatement.setInt(1, forumId);

            /**

             *
Ejecute
la
instrucción

             */

            resultSet = preparedStatement.executeQuery();

            Forum forum = null;

            /**

             *
Extraer
datos
del
conjunto
de
resultados

             */

            if(resultSet.next())

            {

                forum = new Forum(resultSet.getInt(“FORUM_ID”),resultSet.getString(“FORUM_NAME”),resultSet.getString(“FORUM_DESC”));

            }

            return forum;

        } catch (SQLException e) {

            /**

             *
Manejar
cualquier
excepción

             */

            e.printStackTrace();

        } finally {

            try {

                /**

                 *
Cierra
el
conjunto
de
resultados

                 */

                if (resultSet != null) {

                    resultSet.close();

                }

                /**

                 *
Cerrar
el
PreparedStatement

                 */

                if (preparedStatement != null) {

                    preparedStatement.close();

                }

                /**

                 *
Cierra
la
conexión

                 */

                if (connection != null) {

                    connection.close();

                }

            } catch (SQLException e) {

                /**

                 *
Manejar
cualquier
excepción

                 */

                e.printStackTrace();

            }

        }

        return
null;

    }

}

Ahora veamos cómo se puede eliminar el código repetitivo utilizando el JDBCTemplate de Spring.

package com.amalakaky.dao;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.RowMapper;

import com.amalakaky.dominio.Forum;

public
class ForumDAOImpl implements ForumDAO {

    private JdbcTemplate jdbcTemplate;

    public
void setDataSource(DataSource dataSource) {

        this.jdbcTemplate = new JdbcTemplate(dataSource);

    }

    public
void insertForum(Forum forum) {

        /**

         *
Especifique
la
instrucción

         */

        String query = “INSERT INTO FORUMS (FORUM_ID, FORUM_NAME, FORUM_DESC) VALUES (?,?,?)”;

        /**

         *
Especifique
los
valores

         */

        jdbcTemplate.update(query, new Object[] { Integer.valueOf(forum.getForumId()),

                forum.getForumName(), forum.getForumDesc() });

    }

    

    @SuppressWarnings(“unchecked”)

    public Forum selectForum(int forumId) {

        /**

         *
Especifique
la
instrucción

         */

        String query = “SELECT * FROM FORUMS WHERE FORUM_ID=?”;

        /**

         *
Implementar
la
interfaz
de
devolución
de
llamada
RowMapper

         */

        return (Forum) jdbcTemplate.queryForObject(query, new Object[] { Integer.valueOf(forumId) },

                new RowMapper() {

                    public Object mapRow(ResultSet resultSet, int rowNum) throws SQLException {

                        return
new Forum(resultSet.getInt(“FORUM_ID”), resultSet.getString(“FORUM_NAME”),

                                resultSet.getString(“FORUM_DESC”));

                    }

                });

    }

}

Aquí es necesario poner en práctica el mapRow () de la interfaz de devolución de llamada RowMapper. En el método mapRow (), que devuelve el conjunto de resultados con el objeto Forum. El queryForObject () toma una consulta SQL, un conjunto de Objeto que contiene los valores que unidos a los parámetros indexados de la consulta y un objeto RowMapper.

No es necesario manejar las excepciones relacionadas con la base de datos de forma explícita en lugar de eso Spring JDBC lo hará por ti. Todas las excepciones producidas por el framework Spring JDBC son subclases de DataAccessException.

La DataAccessException es un tipo de RuntimeException, por lo que no se ven obligados a manejar la situación. El SQLException es una excepción comprobada, cuando se saque el SQLException Spring JDBC concluirá esta excepción comprobada dentro de una de las subclases de DataAccessException y volver a producir, esto elimina la necesidad de gestionar de forma explícita.

<?xml
version=“1.0”
encoding=“UTF-8”?>

<beans
xmlns=http://www.springframework.org/schema/beans&#8221;

    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance&#8221;

    xsi:schemaLocation=http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&#8221;>

    

    <bean
id=“dataSource”
destroy-method=“close”
class=“org.apache.commons.dbcp.BasicDataSource”>


<!– Vamos a utilizar el driver de Mysql –>


<!– <property name=”driverClassName” value=”org.hsqldb.jdbcDriver”/>–>


<!– <property name=”url” value=”jdbc:hsqldb:hsql://localhost/integracionSpring”/>–>


<!– <property name=”username” value=”root”/>–>


<!– <property name=”password” value=””/>–>     


<property
name=“driverClassName”>


<value>org.gjt.mm.mysql.Driver</value>


</property>    


<property
name=“url”>


<value>jdbc:mysql://localhost/integracionSpring</value>


</property>


<property
name=“username”>


<value>root</value>


</property>

        <property
name=“password”>


<value></value>


</property>    


</bean>

        

    <bean
id=“forumDAO”
class=“com.amalakaky.dao.ForumDAOImpl”>

        <property
name=“dataSource”
ref=“dataSource”/>

    </bean>

    

</beans>

Nosotros como podéis comprobar hemos utilizado el Driver de Mysql

Para ejecutar el ejemplo de ejecutar la clase principal siguiente.

package com.amalakaky.dao;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.amalakaky.dominio.Forum;

public
class Main {

    public
static
void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);

        ForumDAO forumDAO = (ForumDAO) context.getBean(“forumDAO”);

        Forum springForum = new Forum(1,“Spring Foro”, “Discusiones relacionadas con Spring”);

        forumDAO.insertForum(springForum);        

        System.out.println(forumDAO.selectForum(1));

        

    }    

}

Script para crear la base de datos y la tabla

create database integracionSpring;

create table Forums(FORUM_IDint(4),FORUM_NAME VARCHAR(20),FORUM_DESC VARCHAR(40))

Puedes descargar desde aqui:Descargar

Anuncios
Minientrada | Esta entrada fue publicada en Spring. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s