> Java > java지도 시간 > 본문

JdbcTemplate 사용 예제에 대한 자세한 설명

Y2J
풀어 주다: 2017-05-10 10:15:11
원래의
1614명이 탐색했습니다.

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=&#39;" + name + &#39;\&#39;&#39; +
    ", email=&#39;" + email + &#39;\&#39;&#39; +
    &#39;}&#39;;
 }
}
로그인 후 복사

지속성 레이어 생성

위의 데이터 소스 구성을 사용하면 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());
 }
}
로그인 후 복사

[관련 권장 사항]

1. Java 무료 동영상 튜토리얼

2. Java 주석 종합 분석

Alibaba Java 개발 매뉴얼

위 내용은 JdbcTemplate 사용 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿