Spring Boot嵌入式数据库与JdbcTemplate的自动配置

前言
在现代的Java开发中,Spring Boot以其强大的自动配置功能极大地简化了开发流程。其中,嵌入式数据库和JdbcTemplate的自动配置是Spring Boot的亮点之一。通过简单的依赖配置,Spring Boot能够自动完成数据库的初始化以及JdbcTemplate的注入,极大地提高了开发效率。本文将通过一个完整的示例,详细介绍Spring Boot如何实现嵌入式数据库和JdbcTemplate的自动配置。
Spring Boot的嵌入式数据库自动配置
Spring Boot支持自动配置嵌入式数据库,如H2、HSQL和Derby。开发者无需手动提供数据库连接URL或注册DataSource Bean,只需在项目中引入相应的依赖即可。Spring Boot会自动检测类路径中的嵌入式数据库驱动,并根据默认配置初始化数据库。
此外,Spring Boot还支持自动创建数据库表结构(DDL脚本)和初始化数据。它会从类路径的根目录加载schema.sql和data.sql文件,分别用于数据库表结构的创建和数据的初始化。
JdbcTemplate的自动配置
在Spring Boot中,JdbcTemplate和NamedParameterJdbcTemplate类会被自动配置,开发者可以直接通过@Autowired注解注入这些Bean,而无需手动创建其实例。例如,在传统的Spring JDBC应用中,我们需要手动注入DataSource并创建JdbcTemplate实例,但在Spring Boot中,这一切都变得异常简单。
示例:使用H2嵌入式数据库和JdbcTemplate
以下是一个完整的示例,展示如何使用H2嵌入式数据库和JdbcTemplate。

  1. 添加依赖
    在pom.xml中添加以下依赖:
    xml复制

    org.springframework.boot
    spring-boot-starter-jdbc


    com.h2database
    h2

  2. 创建数据访问层
    创建一个使用JdbcTemplate的DAO类:
    java复制
    @Repository
    public class JdbcTemplatePersonDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void save(Person person) {
    String sql = “insert into Person (first_Name, Last_Name, Address) values (?, ?, ?)”;
    jdbcTemplate.update(sql, person.getFirstName(), person.getLastName(), person.getAddress());
    }

    public List loadAll() {
    return jdbcTemplate.query(“select * from Person”, (resultSet, i) -> {
    return toPerson(resultSet);
    });
    }

    private Person toPerson(ResultSet resultSet) throws SQLException {
    Person person = new Person();
    person.setId(resultSet.getLong(“ID”));
    person.setFirstName(resultSet.getString(“FIRST_NAME”));
    person.setLastName(resultSet.getString(“LAST_NAME”));
    person.setAddress(resultSet.getString(“ADDRESS”));
    return person;
    }
    }

  3. 定义实体类
    java复制
    public class Person {
    private long id;
    private String firstName;
    private String lastName;
    private String address;

    // 省略构造函数、getter和setter方法
    }

  4. 创建数据库初始化脚本
    在src/main/resources目录下创建schema.sql和data.sql文件。
    schema.sql:
    sql复制
    CREATE TABLE PERSON(
    ID BIGINT PRIMARY KEY AUTO_INCREMENT,
    FIRST_NAME VARCHAR(255),
    LAST_NAME VARCHAR(255),
    ADDRESS VARCHAR(255)
    );
    data.sql:
    sql复制
    insert into PERSON (first_Name, Last_Name, Address) values (‘Tom’, ‘Syke’, ‘Green Valley’);

  5. 创建示例客户端
    java复制
    @Component
    public class ExampleClient {
    @Autowired
    private JdbcTemplatePersonDao dao;

    public void run() {
    Person person = new Person();
    person.setFirstName(“Dana”);
    person.setLastName(“Whitley”);
    person.setAddress(“464 Yellow Drive”);
    System.out.println("saving person: " + person);
    dao.save(person);

     person = new Person();
     person.setFirstName("Robin");
     person.setLastName("Cash");
     person.setAddress("64 Logic Park");
     System.out.println("saving person: " + person);
     dao.save(person);
    
     System.out.println("-- loading all --");
     List<Person> persons = dao.loadAll();
     persons.forEach(System.out::println);
    

    }
    }

  6. 主类
    java复制
    @SpringBootApplication
    public class SpringBootJdbcH2ExampleMain implements CommandLineRunner {
    @Autowired
    private ExampleClient exampleClient;

    public static void main(String[] args) {
    SpringApplication sa = new SpringApplication(SpringBootJdbcH2ExampleMain.class);
    sa.setBannerMode(Banner.Mode.OFF);
    sa.run(args);
    }

    @Override
    public void run(String… args) {
    exampleClient.run();
    }
    }

  7. 运行结果
    运行主类后,控制台输出如下:
    复制
    saving person: Person{id=0, firstName=‘Dana’, lastName=‘Whitley’, address=‘464 Yellow Drive’}
    saving person: Person{id=0, firstName=‘Robin’, lastName=‘Cash’, address=‘64 Logic Park’}
    – loading all –
    Person{id=1, firstName=‘Tom’, lastName=‘Syke’, address=‘Green Valley’}
    Person{id=2, firstName=‘Dana’, lastName=‘Whitley’, address=‘464 Yellow Drive’}
    Person{id=3, firstName=‘Robin’, lastName=‘Cash’, address=‘64 Logic Park’}
    嵌入式数据库自动配置原理
    DataSourceAutoConfiguration类负责自动配置数据源。当DataSource和EmbeddedDatabaseType类在类路径中时,它会启用DataSourceProperties。EmbeddedDatabaseConnection枚举会检测类路径中的驱动类,并返回第一个对应的枚举常量。例如,H2数据库的配置如下:
    java复制
    package org.springframework.boot.jdbc;
    public enum EmbeddedDatabaseConnection {
    H2(EmbeddedDatabaseType.H2, “org.h2.Driver”, “jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE”);
    }
    总结
    通过上述示例,我们可以看到Spring Boot的自动配置功能极大地简化了嵌入式数据库和JdbcTemplate的使用。开发者只需关注业务逻辑的实现,而无需过多关注底层的配置细节。这不仅提高了开发效率,还减少了出错的可能性。希望本文能帮助你更好地理解和使用Spring Boot的自动配置功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值