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 !
Enjoy!
java java spring xml jdbc mysql database rowmapper jdbctemplate resultset controller
Commentami!