[JAVA] Accédez à la base de données en utilisant le référentiel avec Spring Data.

Interface pratique pour créer automatiquement l'accès à la base de données

Le référentiel JPA est une interface pratique qui implémente automatiquement CRUD dans DB. Une fois l'environnement défini, la fonction d'accès à la base de données peut être implémentée avec une quantité de code considérablement réduite, mais il est assez difficile de définir l'environnement, je l'ai donc résumé.

Présentez la bibliothèque de données Spring

Reportez-vous à l'article ci-dessous jusqu'à ce que le modèle JDBC fonctionne pour le moment.

SpringDataJPA Access 1 SpringDataJPA Access 2

Créer une interface de référentiel

Créez le corps du référentiel.

MyPesononalDataDaoRepository.java


package com.tsugaruinfo.repository;

@Repository
public interface MyPesononalDataDaoRepository
	extends JpaRepository<Mypersonaldata, Integer> {

}

C'est juste une interface. Il n'est pas nécessaire de mettre en œuvre le contenu.

Enregistrer le référentiel dans DI

Enregistrez le référentiel dans le fichier de configuration du bean.

appllicatio-config.xml


<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">



		<!--Paramètres du référentiel JPA-->
	<jpa:repositories base-package="com.tsugaruinfo.repository" />
	
     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>


Deux points

1. Ajouter un espace de noms

Ajout de tx et jpa à l'espace de noms

application-config.xml


	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"

Dans le schéma

application-config.xml


		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"

Pour rendre disponibles les beans JPA et Transaction. En effet, JPA utilise Transaction sans autorisation lors de la création d'un référentiel.

2. Ajouter le package de référentiel et le gestionnaire de transactions

Ceci est l'enregistrement DI principal Enregistrez le package de référentiel jpa et un bean appelé transactionManager.

appliction-config.xml


		<!--Paramètres du référentiel JPA-->
	<jpa:repositories base-package="com.tsugaruinfo.repository" />
	
     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>

Veuillez remplacer "com.tsugaruinfo.repository" par votre propre paquet lorsque vous l'utilisez réellement. Le référentiel est maintenant enregistré dans le conteneur DI.

Injecter avec @Autowired

Cette fois, il est implémenté dans Servlet. (Eh bien, comme dans le manuel ...)

BeanAutowiredFilterServlet.java


public class BeanAutowiringFilterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	@Override
	public void init() throws ServletException {
		super.init();
		SpringBeanAutowiringSupport
			.processInjectionBasedOnCurrentContext(this);
	}

Cette commande ** SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this); ** est la clé pour utiliser l'annotation @Autowired. Au moment où cette commande est exécutée, le Bean enregistré dans DI est injecté dans la variable annotée.

Je pense que la variable à injecter est un champ de la classe, donc il peut être bon de l'exécuter dans le constructeur. Cette fois, configurez une classe parente et exécutez-la avec la méthode d'initialisation du servlet.

Avec Spring Boot Il semble s'exécuter automatiquement avec l'annotation @SpringBootApplication

Injecter et matérialiser

MyPersonalDataServlet.java


@WebServlet("/person")
public class MyPersonalDataServlet extends BeanAutowiringFilterServlet {
	private static final long serialVersionUID = 1L;
       

	@Autowired
	MyPesononalDataDaoRepository repository;

Injecté dans les champs du servlet. Les conteneurs JPA et DI se matérialiseront sans nouveau.

Exécutez immédiatement

Exécutons-le dans un servlet. Obtenez tout le contenu de DB

MyPersonalDataServlet.java


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		List<Mypersonaldata> list = repository.findAll();

		request.setAttribute("entities", list);

		response.getWriter().append("Served at: ").append(request.getContextPath());

		request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
	}

index.jsp


<!DOCTYPE html>

<%@ page import="java.util.List" %>
<%@ page import="com.tsugaruinfo.model.Mypersonaldata" %>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<html>
	<head>
		<meta charset="utf-8">
		<title>JPA Sample1</title>
	</head> 
	<body>
		<h1>Welcome to JPA Sample!</h1>
		
		<form method="post" action="person">
		<table>
			<tr><td>Name:Input<input type ="text" name="name"></td></tr>
			<tr><td>Mail:Input<input type ="text" name="mail"></td></tr>
			<tr><td>Age:Input<input type ="text" name="age"></td></tr>
			<tr><td><input type ="submit" value="ajouter à"></td></tr>
		</table>
		</form>
		<c:url value="/showMessage.html" var="messageUrl" />
		<a href="${messageUrl}">Click to enter</a>
		<ol>
		 
			<% for(Object entity : (List)request.getAttribute("entities")){ %>
				<li><%=entity %></li>
			<% } %>
		</ol>
	</body>
</html>

résultat

image.png

J'ai pu confirmer que le référentiel fonctionne correctement.

Recommended Posts

Accédez à la base de données en utilisant le référentiel avec Spring Data.
Accès à la base de données avec Exposed
Utiliser la paire avec OpenJDK
Essayez la connexion DB avec Java
Spring with Kotorin --- 8. Couche de référentiel
Programmation DB avec EclipseLink part1
Accédez à Apache Kafka avec Micronaut
Connectez-vous à DB avec Java
Utilisation de Mapper avec Java (Spring)
Erreur dans la base de données: migrate: reset
Utilisation de PlantUml avec Honkit [Docker]