Spring整合嵌入式数据库H2

前言

Spring3以后开始支持嵌入式数据库,嵌入式数据库目前在市面上有好多种,HSQL,DERBY,H2

今天就主要讲一下h2的使用 对于一个数据库产品来说,主要就是如何存储数据和读取数据了。

所谓嵌入式就是直接运行在项目中,不需要安装额外的产品。说白了就是一个jar包,可以随项目启动和结束而结束, 比如使用IDEA直接连接:

Spring整合嵌入式数据库H2_第1张图片

它主要有以下特点:

优点:

  • 小而简,但是可以存储的数据还是很大,大概有512G左右;
  • 不用多余的安装,用来做测试和一些小工具最好不过了
  • 一些常见的关系型数据库,如mysql的大多数功能它全都支持,如事务,搭建集群等
  • 它是由Java开发的jar包,所以和其他的Jar应用一样,高可移植性

缺点:

  • 由于它是内存型的,所以并不会持久化数据

这的运行方式主要有两种:

  1. MySql很相似的服务器模式,运行起来后,可以连接多个实例,下载地址http://www.h2database.com/html/main.html
  2. 使用内嵌入到应用程序中,因为它是一个jar包,所以放应用程序中就可以了,但是它只能连接一个实例,也就是只能在当前应用程序中连接,不能在其他应用中操作

接下来我们就使用SpringJdbc连接数据库进行操作,当然其他orm框架也可以,使用SpringJdbc是为了简化代码

运行环境:

  • maven引入依赖(当然Spring相关的依赖是必须,)
    <dependency>
            <groupId>com.h2databasegroupId>
            <artifactId>h2artifactId>
            <version>1.3.172version>
        dependency>
    <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-coreartifactId>
            <version>5.1.10.RELEASEversion>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-beansartifactId>
            <version>5.1.10.RELEASEversion>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>5.1.10.RELEASEversion>
        dependency>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>5.1.10.RELEASEversion>
        dependency>
  • 配置Spring的配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">


    
    <jdbc:embedded-database id="dataSource" type="H2">
        
        <jdbc:script location="classpath:sql/h2-schema.sql"/>
        
        <jdbc:script location="classpath:sql/h2-data.sql" encoding="UTF-8"/>
    jdbc:embedded-database>

    
    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    bean>
beans>
  • 注意这里的这两个sql,一个是用来初始化数据库,另一个就是用来添加数据,一定要注意顺序,当然,写在一个sql文件中也可以
--    h2-schame.sql
drop table if exists teacher ;

-- 创建表
create table teacher(
    id int  primary key auto_increment,
    name varchar(20),
  age int
);
 -- 插入表数据 h2-data.sql
insert into teacher(name,age) values('张老师',23);
insert into teacher(name,age) values('李老师',24);
  • 实体类
public class Teacher {
    private int id;
    private String name;
    private int age;

//省略set和get
}
  • 测试代码
public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
        JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);

        String selectSql = "select * from teacher";

        List query = jdbcTemplate.query(selectSql, new RowMapper() {
            @Nullable
            @Override
            public Object mapRow(ResultSet resultSet, int i) throws SQLException {
                Teacher teacher = new Teacher();
                teacher.setId(resultSet.getInt(1));
                teacher.setName(resultSet.getString(2));
                teacher.setAge(resultSet.getInt(3));
                return teacher;
            }
        });

        query.forEach(o -> System.out.println(o));
    }

这里的datasource是通过jdbc命名空间定义的,因为我们选择模式是内嵌式运行。一个最简单的事情要明白,只有在这个应用运行中,才会访问到数据库,其他时间是不能使用外部工具连接的,比如idea的datasource工具, 即使从日志中找到连接地址也无法成功访问表
Spring整合嵌入式数据库H2_第2张图片
此时teacher表是无法访问和操作的(即使代码断点处表是存在的)
Spring整合嵌入式数据库H2_第3张图片

如果是使用JavaConfig方式的话:

  • 配置类
package cn.lyn4ever.bean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;

import javax.sql.DataSource;

@Configuration
public class BeanConfig {

    @Bean
    public DataSource dataSource() {
        try {
            EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder();
            return dbBuilder.setType(EmbeddedDatabaseType.H2)
                    .addScripts("classpath:sql/h2-schema.sql", "classpath:sql/h2-data.sql")
                    .build();
        } catch (Exception e) {
            System.out.println("创建数据库连接失败");
            return null;
        }
    }

    @Bean
    public JdbcTemplate jdbcTemplate(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource());
        return jdbcTemplate;
    }
}
  • 测试类
 public static void main(String[] args) {

        ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);

        JdbcTemplate jdbcTemplate = context.getBean("jdbcTemplate", JdbcTemplate.class);

        String selectSql = "select * from teacher";

        List query = jdbcTemplate.query(selectSql, new RowMapper() {
            @Nullable
            @Override
            public Object mapRow(ResultSet resultSet, int i) throws SQLException {
                Teacher teacher = new Teacher();
                teacher.setId(resultSet.getInt(1));
                teacher.setName(resultSet.getString(2));
                teacher.setAge(resultSet.getInt(3));
                return teacher;
            }
        });

        query.forEach(o -> System.out.println(o));
    }

您可以在Gitee上找到本文的源代码。

你可能感兴趣的:(Spring)