`
langgufu
  • 浏览: 2307438 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring boot 与 JdbcTemplate 一起工作(转)

 
阅读更多

原文地址 http://www.cnblogs.com/tomlxq/p/5514658.html

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

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

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

通过这个模块为我们做了以下几件事

  • tomcat-jdbc-{version}.jar为我们自动配置DataSource.

  • 如果你没有定义任何DataSource,SpringBoot将会自动配置一个内存的数据库资源设置

  • 如果没有设置任一个beans,SpringBoot会自动注册它

  • 初始化数据库

    如果我们在classpath里定义了schema.sql和data.sql文件,springBoot将会使用这些文件自动初始化数据库(但你必须选建库)
    除了载入schema.sql和data.sql外,SpringBoot也会载入schema-${platform}.sql和data-${platform}.sql,如果在你的classpath下存在的话。
    spring.datasource.schema=xxxx-db.sql 可以定义你的建库文件
    spring.datasource.data=xxxx-data.sql  可以定义你的数据文件
    spring.datasource.initialize=true|false 可以决定是不是要初始化这些数据库文件
    spring.datasource.continueOnError=true|false 有了错误是否继续运行

定义数据库驱动信息

/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: true
init-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>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
        </exclusion>
    </exclusions>
</dependency>

定义自己的数据资源 这里使用了阿里巴巴的数据池管理,你也可以使用BasicDataSource

<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.
 */
@SpringBootApplication
public 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;
    }
}

你也可以用别的:

<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;

/**
 * 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.
 */
@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;

/**
 * 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());
    }
}
分享到:
评论

相关推荐

    Spring boot +jdbctemplate

    综上所述,Spring Boot与JdbcTemplate的结合,为开发高效、简洁的Java Web应用提供了强大支持。通过自动配置、内嵌Web服务器、JdbcTemplate的简单操作、声明式事务管理、拦截器以及数据源的配置,开发者可以更专注于...

    简单介绍如何使用Spring Boot使用JdbcTemplate与MySQL进行数据库操作

    在本文中,我们将深入探讨如何使用Spring Boot集成JdbcTemplate与MySQL数据库进行数据操作。Spring Boot以其简化配置和快速启动的特点,已经成为Java开发者的首选框架。而JdbcTemplate是Spring框架的一部分,它提供...

    Spring Boot多数据源(JdbcTemplate)配置与使用

    在本教程中,我们将深入探讨如何在Spring Boot项目中配置和使用多数据源以及JdbcTemplate。 首先,让我们了解什么是`JdbcTemplate`。它是Spring提供的一种模板类,用于执行SQL语句,通过回调机制将结果转换为Java...

    配制Spring事务和JdbcTemplate使用

    配制Spring事务和JdbcTemplate使用 配制Spring事务和JdbcTemplate使用

    Spring boot连接oracle数据库JDBC配置步骤

    例如,可以使用 Spring Boot 的 `JdbcTemplate` 来执行一个简单的查询操作: ```java @RestController public class DatabaseController { @Autowired private JdbcTemplate jdbcTemplate; @GetMapping("/test...

    Spring Boot中的JdbcTemplate与MySQL集成

    本文将深入探讨如何在Spring Boot项目中配置和使用JdbcTemplate以及与MySQL数据库的整合。 首先,我们需要在项目的`pom.xml`或`build.gradle`文件中添加相应的依赖。对于Maven用户,添加如下依赖: ```xml ...

    使用Spring的JdbcTemplate调用Oracle的存储过程

    使用Spring的JdbcTemplate调用Oracle的存储过程

    Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL数据库的方法

    总结一下,通过Spring Boot、Kotlin和JdbcTemplate,我们可以高效地实现与MySQL数据库的交互。配置数据源,引入依赖,创建配置类注入JdbcTemplate,然后在业务服务类中编写数据访问方法,就能完成基本的CRUD操作。...

    5分钟快速学会spring boot整合JdbcTemplate的方法

    二、Spring Boot 整合 JdbcTemplate 的目的与优势 JdbcTemplate 是 Spring 框架的一部分,它提供了一种简单而安全的方式来操作数据库,避免了 SQL 注入等风险。Spring Boot 整合 JdbcTemplate 可以实现以下几点: 1....

    Spring Boot实战与原理分析视频课程包含14-18

    Spring Boot实战与原理分析视频课程包含14-18,本视频教程为网络整理,如有侵权,请联系删除。谢谢 Spring Boot实战与原理分析视频课程 课程目录: 1 Spring Boot概述与课程概要介绍20:33 2 Spring4 快速入门59:56...

    Spring Boot 学习笔记完整教程.pdf

    - Spring Boot Starter:Starter是一组相关的依赖描述符,这些依赖可以一起使用。文档中介绍了Starter的概念和如何使用它们。 - 自定义属性和配置文件:Spring Boot允许开发者定义自定义的属性文件,并通过@Value...

    Spring Boot2企业应用实战

    5. **Spring Cloud集成**:Spring Boot与Spring Cloud的结合使得构建分布式系统(如配置中心、服务注册与发现、熔断器、负载均衡、API网关等)变得简单。例如,通过Spring Cloud Config可以实现配置的集中管理和动态...

    Spring boot 使用JdbcTemplate访问数据库

    在 Spring Boot 中使用 JdbcTemplate 访问数据库,是一种常见且简便的方式,特别适合那些需要对数据库进行基础操作的应用。 JdbcTemplate 是 Spring Framework 提供的一个模板类,它对 JDBC API 进行了封装,使得...

    从零开始学Spring Boot

    1.3 spring boot起步之Hello World 1.4 Spring Boot返回json数据 1.5 Spring Boot热部署 1.6 Spring Boot使用别的json解析框架 1.7 全局异常捕捉 1.8 Spring Boot datasource - mysql 1.9 JPA - Hibernate 1.10 使用...

    JavaEE颠覆者spring-boot实战源码.zip

    例如,如果你的项目包含了JDBC的依赖,Spring Boot就会自动配置DataSource和JdbcTemplate。 3. **起步依赖(Starters)**: Starters是一系列的Maven或Gradle模块,用于简化构建过程。例如,`spring-boot-starter-...

    9. 使用JdbcTemplate【从零开始学Spring Boot】

    在本节中,我们将深入探讨如何在Spring Boot项目中使用JdbcTemplate进行数据库操作。JdbcTemplate是Spring框架提供的一种简化数据库访问的工具,它通过提供一套模板方法,使得开发者可以更安全、更方便地执行SQL语句...

    spring-boot源码

    下面,我们将深入探讨Spring Boot的源码,揭示其内部工作原理。 1. **自动配置**:Spring Boot的自动配置是其核心特性之一。在`spring-boot-autoconfigure`模块中,通过条件注解(如`@ConditionalOnClass`, `@...

    spring-boot 1.2.4.release

    通过这些示例,你可以深入理解Spring Boot如何与Spring框架的其他组件集成,以及如何利用其特性快速开发应用程序。对于初学者来说,这是一个很好的实践平台,可以学习到如何构建、配置和运行Spring Boot应用,同时也...

Global site tag (gtag.js) - Google Analytics