iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Software Development

一個新鮮人如何完轉Spring boot與DevOps從0到101系列 第 12

PostgreSQL 資料儲存與 mybatis

PostgreSQL是一個開源的框架,關聯式資料庫資管理系統。PostgreSQL 的操作過程相似於 MySQL,不論是建表或是建使用者都滿類似的。MyBatis 算是常用的開源框架,在 Spring boot 中可實現對資料庫訪問。

Maven 中引用

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${VERSION}</version>
</dependency>
@Configuration // 用來設定 Spring 中的環境配置
@MapperScan(basePackages = { DataBaseConfig.PACKAGE }, sqlSessionFactoryRef = "sqlSessionFactory") // 掃描定義的包並使用任何映射器註釋(@Select 、@Delete)並自動選取接口
public class DataBaseConfig {

    static final String PACKAGE = "cch.com.example.demo.mapper";

    @Value("${db_classname}") // 可以想成是讀取環境變數,並將其賦值給 classname
    private String classname;

    @Value("${db_url}")
    private String url;

    @Value("${db_username}")
    private String username;

    @Value("${db_password}")
    private String password;

    @Value("${db_maximum_pool_size}")
    private String maximumPoolSize;

    @Bean(name = "dataSource") // 宣告 Bean 並將其註冊到 Spring 中
    @Primary
    public DataSource dataSource() {
        // 設定 DB 的環境
        Properties props = new Properties();
        props.setProperty("stringtype", "unspecified");
        final HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(this.classname);
        hikariConfig.setJdbcUrl(this.url);
        hikariConfig.setDataSourceProperties(props);
        hikariConfig.setUsername(this.username);
        hikariConfig.setPassword(this.password);
        hikariConfig.setMaximumPoolSize(Integer.valueOf(this.maximumPoolSize));
        hikariConfig.setConnectionTestQuery("SELECT 1");
        hikariConfig.setPoolName("springHikariCP");
        return new HikariDataSource(hikariConfig);
    }
    
    @Bean(name = "transactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager((dataSource()));
    }
    // 定義 data source、事務管理或實體之間的映射
    @Bean(name = "sqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);

        return sessionFactoryBean.getObject();
    }
}

以上是 mybatis 對資料庫訪問的配置和定義要被 mybatis 所掃描的 Package。下面簡單的在 PostgreSQL 建表吧,這邊我們透過 sql 語法建立一連串的事件,建立使用者、建立 DB、建立資料表等。

// init.sql
CREATE USER itachi WITH ENCRYPTED PASSWORD '12345678'; // 建立使用者

CREATE DATABASE employee // 建立資料表
    WITH
    OWNER = itachi
    ENCODING = 'UTF8'
    TABLESPACE = pg_default
    CONNECTION LIMIT = -1;

ALTER USER itachi WITH SUPERUSER; // 讓使用者有 SUPERUSER 權限
grant all privileges on database employee  to itachi;  // 賦予權限(像是 SELECT、DELETE 等操作)

\c employee // 切換資料庫

DROP TABLE IF EXISTS public.user; // 如果資料表 user 存在就將其刪除
CREATE TABLE IF NOT EXISTS public.user ( // 建立資料表,NOT NULL 表示不能為空
    id      serial,
    name    varchar(20) NOT NULL,
    age     integer,
    email   varchar(100) NULL,
    tel     varchar NOT NULL,
    primary key (id) // 設定主鍵
);
ALTER TABLE public.user OWNER TO itachi;

透過 docker-compose 進行 PostgreSQL 鍵置

version: '3.7'
services:
  postgres:
    container_name: postgres
    image: postgres
    restart: always
    ports:
      - "5432:5432"
    hostname: postgres
    environment:
      - POSTGRES_PASSWORD=123456
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql // 把上面建立的 SQL 過程掛載置容器中,此容器就會幫我們執行我們定義的過程
      - postgresql-data:/var/lib/postgresql/data
    healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres"]
        interval: 30s
        timeout: 10s
        retries: 5


volumes:
  postgresql-data:

今天就到這邊,打完疫苗身體非常不舒服


上一篇
少不了 Nginx 反向代理和 SSL
下一篇
mybatis 使用
系列文
一個新鮮人如何完轉Spring boot與DevOps從0到10130

尚未有邦友留言

立即登入留言