Maison  >  Article  >  Java  >  Explication détaillée d'exemples d'utilisation de JdbcTemplate

Explication détaillée d'exemples d'utilisation de JdbcTemplate

Y2J
Y2Joriginal
2017-05-10 10:15:111612parcourir

JdbcTemplate fournit une encapsulation plus abstraite basée sur l'API JDBC et fournit des capacités de gestion des transactions basées sur des annotations de méthode. En utilisant la fonction de configuration automatique de SpringBoot et en remplaçant notre configuration automatique des beans, permettez-moi de vous présenter les connaissances pertinentes sur l'utilisation de JdbcTemplate dans Spring Boot. Jetons un coup d'œil

Cet article présentera comment utiliser Spring Boot et. JdbcTemplate pour travailler ensemble.

Les opérations de Spring sur la base de données sont profondément encapsulées dans jdbc. À l'aide de la fonction d'injection de Spring, vous pouvez enregistrer DataSource dans JdbcTemplate. JdbcTemplate fournit une encapsulation plus abstraite basée sur l'API JDBC et fournit des fonctionnalités de gestion des transactions basées sur des annotations de méthode. En utilisant la fonction de configuration automatique SpringBoot et en configurant automatiquement les beans en notre nom.

Configuration de la source de données

Dans maven, nous devons ajouter spring -boot -starter-jdbc module

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

Ce module fait les choses suivantes pour nous

Tomcat-jdbc-{version}.jar configure automatiquement DataSource pour nous.

Si vous ne définissez aucune DataSource, SpringBoot configurera automatiquement un paramètre de ressource de base de données en mémoire
Si aucun beans n'est défini, SpringBoot l'enregistrera automatiquement
Initialiser la base de données
Si nous la définissons dans le chemin de classe Fichiers schema.sql et data.sql, springBoot utilisera ces fichiers pour initialiser automatiquement la base de données (mais vous devez choisir de construire la bibliothèque)
En plus de charger schema.sql et data.sql, SpringBoot chargera également schema.sql et data.sql. ${ platform}.sql et data-${platform}.sql, s'ils existent dans votre chemin de classe.

  spring.datasource.schema=xxxx-db.sql 可以定义你的建库文件
  spring.datasource.data=xxxx-data.sql 可以定义你的数据文件
  spring.datasource.initialize=true|false 可以决定是不是要初始化这些数据库文件
  spring.datasource.continueOnError=true|false 有了错误是否继续运行

Prise en charge des bases de données intégrées

Les bases de données intégrées sont généralement utilisées dans les environnements de développement et de test et ne sont pas recommandées pour les environnements de production. Spring Boot fournit des bases de données intégrées automatiquement configurées telles que H2, HSQL et Derby. Vous n'avez pas besoin de fournir de configuration de connexion pour les utiliser.

Par exemple, nous pouvons introduire la configuration suivante dans pom.xml pour utiliser HSQL

<dependency>
 <groupId>org.hsqldb</groupId>
 <artifactId>hsqldb</artifactId>
 <scope>runtime</scope>
</dependency>

pour se connecter à la configuration de la source de données de production

Prenons la Base de données MySQL comme exemple. Présentez d'abord le package de dépendances de la connexion MySQL et ajoutez pom.xml :

<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.21</version>
</dependency>

Configurez dans src/main/. resources/application.properties Informations sur la source de données

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Configuration de la source de données JNDI de connexion

Quelle source de données souhaitez-vous lorsque vous déployez le application sur le serveur d'applications ? Gérée par le serveur d'applications, vous pouvez utiliser la méthode de configuration suivante pour introduire la source de données JNDI.

spring.datasource.jndi-name=java:jboss/datasources/customers

Configuration personnalisée de la source de données

Si vous ne souhaitez pas utiliser la source de données de configuration par défaut, par exemple, vous souhaitez pour utiliser la source de données de gestion du pool de données d'Alibaba, vous pouvez également la configurer vous-même

Excluez d'abord la source de données de configuration par défaut de tomcat-jdbc

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-jdbc</artifactId>
 <exclusions>
  <exclusion>
   <groupId>org.apache.tomcat</groupId>
   <artifactId>tomcat-jdbc</artifactId>
  </exclusion>
 </exclusions>
</dependency>

Définissez vos propres ressources de gestion du pool de données d'Alibaba. est utilisé ici. Vous Vous pouvez également utiliser BasicDataSource

<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid</artifactId>
 <version>1.0.19</version>
</dependency>

package com.example;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.web.servlet.DispatcherServlet;
import com.alibaba.druid.pool.DruidDataSource;
import com.example.Listener.IndexListener;
import com.example.filter.IndexFilter;
import com.example.servlet.MyServlet;
@SpringBootApplication
public class SpringBootSimpleApplication {
 @Autowired
 private Environment env;
 @Bean
 public DataSource dataSource() {
  DruidDataSource dataSource = new DruidDataSource();
  dataSource.setUrl(env.getProperty("spring.datasource.url"));
  dataSource.setUsername(env.getProperty("spring.datasource.username"));//用户名
  dataSource.setPassword(env.getProperty("spring.datasource.password"));//密码
  dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
  dataSource.setInitialSize(2);
  dataSource.setMaxActive(20);
  dataSource.setMinIdle(0);
  dataSource.setMaxWait(60000);
  dataSource.setValidationQuery("SELECT 1");
  dataSource.setTestOnBorrow(false);
  dataSource.setTestWhileIdle(true);
  dataSource.setPoolPreparedStatements(false);
  return dataSource;
 }
 public static void main(String[] args) {
  SpringApplication.run(SpringBootSimpleApplication.class, args);
 }
}

Vous pouvez également utiliser autres :

<dependency>
 <groupId>commons-dbcp</groupId>
 <artifactId>commons-dbcp</artifactId>
 <version>1.4</version>
</dependency>
@Bean
public DataSource dataSource() {
 BasicDataSource dataSource = new BasicDataSource();
 dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
 dataSource.setUrl(env.getProperty("spring.datasource.url"));
 dataSource.setUsername(env.getProperty("spring.datasource.username"));
 dataSource.setPassword(env.getProperty("spring.datasource.password"));
 return dataSource;
}

Exemple de code

Créer un objet entité

/src/main/java/com/example /domain/User. java

package com.example.domain;
public class User
{
 private Integer id;
 private String name;
 private String email;
 public User()
 {
 }
 public User(Integer id, String name, String email)
 {
  this.id = id;
  this.name = name;
  this.email = email;
 }
 public Integer getId()
 {
  return id;
 }
 public void setId(Integer id)
 {
  this.id = id;
 }
 public String getName()
 {
  return name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
 public String getEmail()
 {
  return email;
 }
 public void setEmail(String email)
 {
  this.email = email;
 }
 @Override
 public String toString() {
  return "User{" +
    "id=" + id +
    ", name=&#39;" + name + &#39;\&#39;&#39; +
    ", email=&#39;" + email + &#39;\&#39;&#39; +
    &#39;}&#39;;
 }
}

Créer une couche de persistance

Avec la configuration de la source de données ci-dessus, nous pouvons injecter JdbcTemplate dans les données Accéder au composant et communiquer avec la base de données Interaction.

/src/main/java/com/example/repositories/UserRepository.java

package com.example.repositories;
import com.example.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.sql.*;
import java.util.List;
@Repository
public class UserRepository {
 @Autowired
 private JdbcTemplate jdbcTemplate;
 @Transactional(readOnly = true)
 public List<User> findAll() {
  return jdbcTemplate.query("select * from users", new UserRowMapper());
 }
 @Transactional(readOnly = true)
 public User findUserById(int id) {
  return jdbcTemplate.queryForObject("select * from users where id=?", new Object[]{id}, new UserRowMapper());
 }
 public User create(final User user) {
  final String sql = "insert into users(name,email) values(?,?)";
  KeyHolder holder = new GeneratedKeyHolder();
  jdbcTemplate.update(new PreparedStatementCreator() {
   @Override
   public PreparedStatement createPreparedStatement(Connection connection)
     throws SQLException {
    PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    ps.setString(1, user.getName());
    ps.setString(2, user.getEmail());
    return ps;
   }
  }, holder);
  int newUserId = holder.getKey().intValue();
  user.setId(newUserId);
  return user;
 }
 public void delete(final Integer id) {
  final String sql = "delete from users where id=?";
  jdbcTemplate.update(sql,
    new Object[]{id},
    new int[]{java.sql.Types.INTEGER});
 }
 public void update(final User user) {
  jdbcTemplate.update(
    "update users set name=?,email=? where id=?",
    new Object[]{user.getName(), user.getEmail(), user.getId()});
 }
}
class UserRowMapper implements RowMapper<User> {
 @Override
 public User mapRow(ResultSet rs, int rowNum) throws SQLException {
  User user = new User();
  user.setId(rs.getInt("id"));
  user.setName(rs.getString("name"));
  user.setEmail(rs.getString("email"));
  return user;
 }
}

Test unitaire

Vous avez peut-être remarqué que la plupart du temps, nous effectuons ces opérations de configuration dans l'application.

Créer des tests unitaires pour tester nos méthodes de couche de persistance

/src/test/java/SpringBootJdbcDemoApplicationTests.java

import com.example.SpringBootJdbcDemoApplication;
import com.example.domain.User;
import com.example.repositories.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SpringBootJdbcDemoApplication.class)
public class SpringBootJdbcDemoApplicationTests
{
  Logger logger= LoggerFactory.getLogger(SpringBootJdbcDemoApplicationTests.class);
 @Autowired
 private UserRepository userRepository;
 @Test public void testAll(){
  findAllUsers();
  findUserById();
  createUser();
 }
 @Test
 public void findAllUsers() {
  List<User> users = userRepository.findAll();
  assertNotNull(users);
  assertTrue(!users.isEmpty());
 }
 @Test
 public void findUserById() {
  User user = userRepository.findUserById(1);
  assertNotNull(user);
 }
 private void updateById(Integer id) {
  User newUser = new User(id, "JackChen", "JackChen@qq.com");
  userRepository.update(newUser);
  User newUser2 = userRepository.findUserById(newUser.getId());
  assertEquals(newUser.getName(), newUser2.getName());
  assertEquals(newUser.getEmail(), newUser2.getEmail());
 }
 @Test
 public void createUser() {
  User user = new User(0, "tom", "tom@gmail.com");
  User savedUser = userRepository.create(user);
  logger.debug("{}",savedUser);
  User newUser = userRepository.findUserById(savedUser.getId());
  assertEquals("tom", newUser.getName());
  assertEquals("tom@gmail.com", newUser.getEmail());
  updateById(newUser.getId());
  userRepository.delete(newUser.getId());
 }
}

[Recommandations associées]

1. Tutoriels vidéo gratuits Java

2 Analyse complète des annotations Java

3 Manuel de développement Java Alibaba

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn