你的位置:首页 > Java教程

[Java教程]spring boot 与 JdbcTemplate 一起工作


           spring boot 与 JdbcTemplate 一起工作

本文将介绍如何将spring boot 与 JdbcTemplate一起工作。


Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。 JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力。 通过使用SpringBoot自动配置功能并代替我们自动配置beans. 在maven中,我们需要增加spring-boot-starter-jdbc模块


定义数据库驱动信息

/src/main/resources/application.yml


logging: level:  org.springframework: INFO  com.example: DEBUG################### DataSource Configuration ##########################spring: datasource:  driver-class-name: com.mysql.jdbc.Driver  url: jdbc:mysql://localhost:3306/gs-jdbc  username: root  password:  initialize: trueinit-db: true


其中


spring: datasource:  driver-class-name: com.mysql.jdbc.Driver  url: jdbc:mysql://localhost:3306/gs-jdbc  username: root  password:


我是用的mysql,你也可以定义其它或者不定义,如果不定义,springBoot会自动为我们配置一个嵌入的数据库( Embedded database)




自定义数据源

如果你不想用默认的配置数据源,如你想用阿里巴巴的数据池管理数据源,你也可以自己配置


先排除tomcat-jdbc的默认配置dataSource


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


/src/main/java/com/example/SpringBootJdbcDemoApplication.java


package com.example;import com.alibaba.druid.pool.DruidDataSource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.core.env.Environment;import javax.sql.DataSource;/** * Created by tom on 2016/5/21. */@SpringBootApplicationpublic class SpringBootJdbcDemoApplication {  public static void main(String[] args) {    SpringApplication.run(SpringBootJdbcDemoApplication.class, args);  }  @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.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;  }}


你也可以用别的:


  @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;/** * Created by tom on 2016/5/21. */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;/** * Created by tom on 2016/5/21. */@Repositorypublic 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;/** * Created by tom on 2016/5/21. */@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());  }}


源代码请访问: https://github.com/tomlxq/best-practice/tree/master/gs-jdbc