# 增删改

# 插入语句

使用insert方法来创建insert语句:

import easysql.dsl.*
import easysql.database.*

given DB = DB.MYSQL

val i = insert into user(user.id, user.name) values((1, "x"), (2, "y"))

val sql = i.toSql

values中的每个元组的类型必须与传入的字段列表一致,否则会编译错误。

我们可以使用实体对象或实体对象的List来插入数据:

import easysql.dsl.*
import easysql.database.*

given DB = DB.MYSQL

val userRow = User(1, "x")
val i = insert(userRow)
val sql = i.toSql

使用IncrKey标记的字段会在生成sql时跳过。

insert语句也可以使用子查询:

import easysql.dsl.*

val s = select (user.id, user.name) from user

val i = insert into user(user.id, user.name) select s

select方法中子查询的返回类型也需要与字段列表一致。

# 更新语句

我们可以使用update table的组合创建更新语句,设置值使用:=

import easysql.dsl.*
import easysql.database.*

given DB = DB.MYSQL

val u = update table user set (user.name := "x") where user.id === 1
val sql = u.toSql

由于:=是对非主键类型的扩展,所以更新主键将不会通过编译。

:=跟正常的sql一样,右侧不止可以是值,也可以是其他表达式,比如我们这样实现某字段自增的需求:

import easysql.dsl.*

val u = update table a set (a.x := a.x + 1)

另外,更新也支持参数为Option类型:

import easysql.dsl.*

val u = update table a set (a.x := None)

与insert类似,可以按主键更新其他字段:

import easysql.dsl.*
import easysql.database.*

given DB = DB.MYSQL

val user = User(1, "x")
val u = update(user, skipNone = true)
val sql = u.toSql

使用实体类更新时,可以传入一个skipNone参数,如果此参数为true,那么值为None的字段会跳过:

// 省略元数据配置代码
case class Entity(a: Int, b: Int, c: Option[Int])

val e = Entity(1, 2, None)

// UPDATE entity SET b = 2 WHERE a = 1
val u1 = update(e, skipNone = true)

// UPDATE entity SET b = 2, c = null WHERE a = 1
val u2 = update(e, skipNone = false)

# 删除语句

import easysql.dsl.*
import easysql.database.*

given DB = DB.MYSQL

val d = delete from user where user.id === 1
val sql = d.toSql

写好元数据配置后,便可以通过主键生成删除sql:

import easysql.dsl.*
import easysql.database.*

given DB = DB.MYSQL

val d = delete[User](1)
val sql = d.toSql

如果参数类型与实体类注解定义的主键类型不一致,则会产生编译错误,如果是联合主键的表,此处依次传入多个参数或者一个对应类型的元组即可。

# 插入或更新

使用实体类生成按主键插入或更新的sql:

import easysql.dsl.*
import easysql.database.*

given DB = DB.MYSQL

val user = User(1, "x")
val s = save(user)
val sql = s.toSql

每一种数据库生成的sql均不同。