在Spring中使用嵌入式數據庫-H2

  • Spring3之後開始支持嵌入式數據庫,嵌入式數據庫目前在市面上有好多種,HSQL,DERBY,H2...今天就主要講一下h2的使用
    對於一個數據庫產品來講,主要就是如何存儲數據和讀取數據了。所謂嵌入式就是直接運行在項目中,不須要安裝額外的產品。說白了就是一個jar包,能夠隨項目啓動和結束而結束,它主要有如下特色:

優勢:html

  • 小而簡,可是能夠存儲的數據仍是很大,大概有512G左右;
  • 不用多餘的安裝,用來作測試和一些小工具最好不過了
  • 一些常見的關係型數據庫,如mysql的大多數功能它全都支持,如事務,搭建集羣等
  • 它是由Java開發的jar包,因此和其餘的Jar應用同樣,高可移植性

缺點:java

  • 因爲它是內存型的,因此並不會持久化數據

這的運行方式主要有兩種:

  1. 和MySql很類似的服務器模式,運行起來後,能夠鏈接多個實例,下載地址http://www.h2database.com/html/main.html
  2. 使用內嵌入到應用程序中,由於它是一個jar包,因此放應用程序中就能夠了,可是它只能鏈接一個實例,也就是隻能在當前應用程序中鏈接,不能在其餘應用中操做(主要講解這種模式)mysql

    接下來咱們就使用SpringJdbc鏈接數據庫進行操做,固然其餘orm框架也能夠,使用SpringJdbc是爲了簡化代碼git

運行環境:

JDK1.8+Spring4以上
  • maven引入依賴(固然Spring相關的依賴是必須,)
<dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.172</version>
        </dependency>
    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.1.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.1.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.10.RELEASE</version>
        </dependency>
        <!-- 2.Spring dao依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.10.RELEASE</version>
        </dependency>
  • 配置Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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">


    <!--固然是配置datasource了-->
    <jdbc:embedded-database id="dataSource" type="H2">
        <!--必定要是先DDL,即數據庫定義語言-->
        <jdbc:script location="classpath:sql/h2-schema.sql"/>
        <!--而後纔是DML,數據庫操做語言-->
        <jdbc:script location="classpath:sql/h2-data.sql" encoding="UTF-8"/>
    </jdbc:embedded-database>

    <!--定義springjdbctemplate-->
    <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);

這裏的datasource是經過jdbc命名空間定義的,由於咱們選擇模式是內嵌式運行。一個最簡單的事情要明白,只有在這個應用運行中,纔會訪問到數據庫,其餘時間是不能使用外部工具鏈接的,好比idea的datasource工具github

spring

  • 實體類
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的信息
spring
咱們給程序一個不退出的代碼,讓它一直運行(若是是一個web應用,只要啓動,就會一直運行),使用idea鏈接一下這個數據庫web

spring

可是你經過這個工具是不能看見teahcer表的,一樣,你經過這個工具添加的表和數據也不會使用程序取到的,由於它自己就是鏈接實例之間是分開的,這樣作是很安全的。spring

若是是使用SpringBoot的話:

運行環境:SpirngBoot+SpringJdbcsql

這裏並不建立一個新的SpringBoot項目,而是使用Java註解的方式來註冊bean(在SpirngBoot的環境就能夠這樣用)數據庫

  • 配置類
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));
    }

Spring系列學習筆記安全

相關文章
相關標籤/搜索