# 增删改
# 插入语句
使用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均不同。