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='" + name + '\'' + ", email='" + email + '\'' + '}'; } }
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; } }
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!