JdbcTemplate은 JDBC API를 기반으로 보다 추상적인 캡슐화를 제공하고 메서드 주석을 기반으로 트랜잭션 관리 기능을 제공합니다. SpringBoot 자동 구성 기능을 사용하고 Bean 자동 구성을 대체하여 Spring Boot에서 JdbcTemplate 사용에 대한 관련 지식을 소개하겠습니다.
이 기사에서는 Spring Boot 및 Bean 사용 방법을 소개합니다. 함께 작동하는 JdbcTemplate입니다.
Spring의 데이터베이스 작업은 jdbc에 깊이 캡슐화되어 있습니다. Spring의 주입 기능을 사용하면 DataSource를 JdbcTemplate에 등록할 수 있습니다. JdbcTemplate은 JDBC API를 기반으로 보다 추상적인 캡슐화를 제공하고 메소드 주석을 기반으로 트랜잭션 관리 기능을 제공합니다. SpringBoot 자동 구성 기능을 사용하여 자동으로 Bean을 구성합니다.
데이터 소스 구성
maven에서는 spring을 추가해야 합니다. -boot -starter-jdbc 모듈
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
이 모듈은 다음 작업을 수행합니다
Tomcat-jdbc-{version}.jar는 자동으로 DataSource를 구성합니다.
If DataSource를 정의하지 않으면 SpringBoot가 자동으로 메모리 내 데이터베이스 리소스 설정을 구성합니다.
Bean이 설정되지 않은 경우 SpringBoot가 자동으로 이를 등록합니다.
데이터베이스 초기화
클래스 경로에 스키마를 정의하는 경우. sql 및 data.sql 파일을 로드하면 springBoot는 이 파일을 사용하여 데이터베이스를 자동으로 초기화합니다(단, 라이브러리를 빌드하도록 선택해야 함).
Schema.sql 및 data.sql을 로드하는 것 외에도 SpringBoot는 Schema-${도 로드합니다. platform} .sql 및 data-${platform}.sql(클래스 경로에 존재하는 경우)
spring.datasource.schema=xxxx-db.sql 可以定义你的建库文件 spring.datasource.data=xxxx-data.sql 可以定义你的数据文件 spring.datasource.initialize=true|false 可以决定是不是要初始化这些数据库文件 spring.datasource.continueOnError=true|false 有了错误是否继续运行
내장형 데이터베이스 지원
내장형 데이터베이스는 일반적으로 개발 및 테스트 환경에서 사용되며 프로덕션 환경에는 권장되지 않습니다. Spring Boot는 H2, HSQL, Derby와 같이 자동으로 구성된 임베디드 데이터베이스를 제공하므로 이를 사용하기 위해 연결 구성을 제공할 필요가 없습니다.
예를 들어 pom.xml에 다음 구성을 도입하여 HSQL
<dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope> </dependency>
를 사용하여 프로덕션 데이터 소스 구성에 연결할 수 있습니다
MySQL 데이터베이스를 예로 들어 먼저 MySQL 연결의 종속성 패키지를 소개하고 pom.xml에 추가합니다.
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency>
src/main/resources에 데이터 소스 정보를 구성합니다. /application.properties
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
JNDI 데이터 소스 구성 연결
애플리케이션 서버에 애플리케이션을 배포하고 데이터 소스를 애플리케이션 서버에서 관리하는 경우 다음 구성 방법을 사용하여 JNDI 데이터 소스를 도입할 수 있습니다.
spring.datasource.jndi-name=java:jboss/datasources/customers
사용자 정의 데이터 소스 구성
기본 구성 데이터 소스를 사용하지 않으려는 경우, 예를 들어 다음을 사용하고 싶습니다. Alibaba의 데이터 풀 관리 데이터 소스, 직접 구성할 수도 있습니다
먼저 tomcat-jdbc dataSource의 기본 구성을 제외합니다
<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>
여기에서는 Alibaba의 데이터 풀 관리가 사용됩니다. 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); } }
다른 항목도 사용할 수 있습니다.
<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; }
코드 예제
엔티티 객체 생성
/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 + '\'' + '}'; } }
지속성 레이어 생성
위의 데이터 소스 구성을 사용하면 JdbcTemplate을 데이터 액세스 구성 요소에 삽입하고 데이터베이스와 상호 작용할 수 있습니다.
/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; } }
대부분의 경우 이러한 구성 작업은 애플리케이션에서 수행된다는 점을 눈치채셨을 것입니다.
지속성 계층 메서드를 테스트하기 위한 단위 테스트 만들기
/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()); } }
[관련 권장 사항]
위 내용은 JdbcTemplate 사용 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!