Home / Programmazione / Java / Connessione a MySQL con Java Spring e JDBC
Mattepuffo

Connessione a MySQL con Java Spring e JDBC

Connessione a MySQL con Java Spring e JDBC

Oggi vediamo come effettuare una connessione a MySQL con Java Spring e JDBC.

La tabella (ricerche) è composta da soli due campi:

  • ID PRIMARY KEY AUTO INCREMENT
  • TITOLO VARCHAR(255)

Durante le verie operazioni il vostro IDE vi darà vari errori; ma non preccupatevi, li elimineremo strada facendo.

Cominciamo quindi con aggiungere il driver JDBC al progetto e poi con la creazione della prima classe, che rappresenta la nostra tabella:

public class Ricerche {

    private Integer id;
    private String titolo;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitolo() {
        return titolo;
    }

    public void setTitolo(String titolo) {
        this.titolo = titolo;
    }
}

Passiamo a questo punto passiamo alla creazione di una interfaccia che registra le varie operazioni CRUD:

import java.util.List;
import javax.sql.DataSource;

public interface RicercheDAO {

    public void setDataSource(DataSource ds);

    public void create(String titolo);

    public Ricerche getRicerca(Integer id);

    public List listRicerche();

    public void delete(Integer id);

    public void update(Integer id, String titolo);
}

Questa interfaccia ha tutte le operazioni che possiamo eseguire su db.

Questa classe che implementerà l'interfaccia:

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

public class RicercheTemplate implements RicercheDAO {

    private DataSource dataSource;
    private JdbcTemplate jdbcTemplate;

    @Override
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void create(String titolo) {
        String sql = "INSERT INTO ricerche (titolo) VALUES (?)";
        jdbcTemplate.update(sql, titolo);
    }

    @Override
    public Ricerche getRicerca(Integer id) {
        String sql = "SELECT * FROM ricerche WHERE id = ?";
        Ricerche ricerche = jdbcTemplate.queryForObject(sql, new Object[]{id}, new RicercheMapper());
        return ricerche;
    }

    @Override
    public List listRicerche() {
        String sql = "SELECT * FROM ricerche";
        List list = jdbcTemplate.query(sql, new RicercheMapper());
        return list;
    }

    @Override
    public void delete(Integer id) {
        String SQL = "DELETE FROM ricerche WHERE id = ?";
        jdbcTemplate.update(SQL, id);
    }

    @Override
    public void update(Integer id, String titolo) {
        String SQL = "UPDATE ricerche SET titolo = ? WHERE id = ?";
        jdbcTemplate.update(SQL, titolo, id);
    }

}

Questa la classe RicercheMapper che fa da mapper per la tabella:

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;

public class RicercheMapper implements RowMapper {

    @Override
    public Ricerche mapRow(ResultSet rs, int rowNum) throws SQLException {
        Ricerche ricerche = new Ricerche();
        ricerche.setId(rs.getInt("id"));
        ricerche.setTitolo(rs.getString("titolo"));
        return ricerche;
    }
}

In pratica RowMapper è una interfaccia, usata da JdbcTemplate, che serve per mappare un ResultSet.

Bene, a questo punto ci mancano solo il controller, la pagina web e il file XML per la connessione.

Partiamo dal controller:

import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MysqlController {

    @RequestMapping(value = "/mysql")
    public String home(Model model) {
        ApplicationContext context = new ClassPathXmlApplicationContext("com/mp/imdb/bean-connection.xml");
        RicercheTemplate ricercheTemplate = (RicercheTemplate) context.getBean("ricercheTemplate");

        for (int i = 0; i < 4; i++) {
            ricercheTemplate.create("PROVA " + i);
        }

        List ricerche = ricercheTemplate.listRicerche();
        model.addAttribute("ricerca", new Ricerche());
        model.addAttribute("ricerche", ricerche);
        return "mysql";
    }
}

Prima creaimo la connessione prendendo dai parametri dal file XML, che deve stare nello stesso package del controller.

Nel ciclo for creaimo alcuni record, e sotto eseguiamo la query per estrarre i dati dal db; così facendo abbiamo mostrato l'uso di due operazioni CRUD.

Questo il file XML di configurazione:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://ferrons.no-ip.org:3306/spring_test"/>
        <property name="username" value="root"/>
        <property name="password" value="9211"/>
    </bean>
    
    <bean id="ricercheTemplate"
          class="com.mp.imdb.RicercheTemplate">
        <property name="dataSource" ref="dataSource" />    
    </bean>
    
</beans>

E infine la pagine web mysql.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Ricerche test</title>
    </head>
    <body>
        <h1>Search IMDB</h1>
        <ul>
            <c:if test="${!empty ricerche}">
                <c:forEach items="${ricerche}" var="ric">
                    <li>${ric.titolo}</li>
                    </c:forEach>
                </c:if>
        </ul>
    </body>
</html>

Ovviamente, così facendo, i record verranno creati ogni volta che riachiemerete la pagina; per finire il lavoro dovreste aggiungere un form per aggiungere i dati, una pagina per la modifica di un record e una per l'eliminazione.

Ve li lascio come compiti natalizi laughing!

Enjoy!