mybatis 使用

上一章节讲述了 PostgreSQL 的键置和 mybatis 连线到 DB 的配置,那今天就来实际用 mybatis 的方式来撰写 SQL。

今天补充一下,虽然讲了如何配置连线到 DB 的配置,但没描述到其相关的环境变数设置(db_classname、db_username 等),这些环境变数配置一般来说都会在 resources 下的 application.properties 进行配置,如下

db_classname=org.postgresql.Driver
db_username=itachi
db_url=jdbc:postgresql://172.17.10.105:5432/employee
db_password=12345678
db_maximum_pool_size=3

在 mapper 目录下定义一个 UserMapper.java 档案,其内容会是对 DB 的相关操作定义,像是 add 方法就是用来新增一个使用者。

在 mybatis 提供@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider 注解来实现 CRUD。其中注解里的 type 表示表示实现 SQL 操作的类,method 表示 type(实现 SQL 操作的类)中的对应方法。通常 Insert、Delete 和 Update 都是返回笔数所以是回传一个 Integer 类型。

@Mapper
public interface UserMapper {
    @SelectProvider(type = UserProvider.class, method = "addUser")
    public UserResponseVO add(UserRequestVO user);
    
    @DeleteProvider(type = UserProvider.class, method = "delete")
    public Integer delete(@Param("id") String id);
    
    @SelectProvider(type = UserProvider.class, method = "update")
    public UserResponseVO update(UserRequestVO user);
    
    // List<UserResponseVO> get(@Param("id") String id);
    @SelectProvider(type = UserProvider.class, method = "getById")
    public UserResponseVO getById(@Param("id") String id);

    @SelectProvider(type = UserProvider.class, method = "isExistUser")
    public Boolean isExistUser(@Param("name") String name);

}

上述定义了 CRUD 对应的 SQL 操作,接下来我们来实现其 SQL 的语法,在 provider 目录下我们定义了 UserProvider.java 档案,这档案会是定义 SQL 语法的实现,RETURNING 是 PostgreSQL 的特殊用法,可以说我想要回传那些字段,这个用法可以使用在 Insert、Update 或 Delete 上。

public class UserProvider {
    private final String TABLE = "public.user"; // 对应 SQL 中的表
    // 实现 Insert
    public final String addUser(UserRequestVO user) {
        return new SQL().INSERT_INTO(TABLE)
                .VALUES("name", "#{name}")
                .VALUES("age", "#{age}")
                .VALUES("email", "#{email}")
                .VALUES("tel", "#{tel}")
                .toString() + " RETURNING * ";
    }

    // 实现查询
    public final String getById(@Param("id") String id) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT * " +
                "FROM public.user " +
                "WHERE id = #{id}");

        return sql.toString();
    }
    
    public final String isExistUser(@Param("name") String name) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT ")
        .append("EXISTS ( SELECT 1 FROM ")
        .append(TABLE)
        .append(" WHERE name = #{name} )");

        return sql.toString();
    }
    // 实现 Delete
    public final String delete(@Param("id") String id) {
        return new SQL().DELETE_FROM(TABLE).WHERE("id = #{id}").toString();
    }
    // 实现 Update
    public final String update(UserRequestVO user) {
        SQL sql = new SQL()
            .UPDATE(TABLE)
            .SET("name = #{name}")
            .SET("age = #{age}")
            .SET("email = #{email}")
            .SET("tel = #{tel}")
            .WHERE("id = #{id}");
            return sql.toString() + " RETURNING * ";
    }

}

上述的范例都在 github 上。


<<:  html icon

>>:  DAY 1『 Xcode 如何建专案 』

Day 26 - Watch os 开发学习3(输入框、Picker)

在Apple watch中,我们依然可以去使用输入框 struct ContentView: Vie...

冒险村16 - customize breadcurmb

延续上篇 customize tooltips with data attribute 後,另外也来...

[13th-铁人赛]Day 8:Modern CSS 超详细新手攻略 - 伪元素 Pseudo Element

伪类与伪元素差别 如果你只在伪元素前加一个冒号,你有时会发现也可以正常运行,但在CSS3之後伪元素改...

开始写CRUD的 C 吧! - day04

在前一篇文里提到,VoK希望开发者专注於 Kotlin code 的开发,所以Karibu-DSL ...

[Python] os.walk()

os.walk() !ls import os PATH = '/content/kaggle/in...