上一章节讲述了 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 上。
在Apple watch中,我们依然可以去使用输入框 struct ContentView: Vie...
延续上篇 customize tooltips with data attribute 後,另外也来...
伪类与伪元素差别 如果你只在伪元素前加一个冒号,你有时会发现也可以正常运行,但在CSS3之後伪元素改...
在前一篇文里提到,VoK希望开发者专注於 Kotlin code 的开发,所以Karibu-DSL ...
os.walk() !ls import os PATH = '/content/kaggle/in...