[Day 07] 透过 DAO 和资料库进行互动

除了使用 DSL 的方式和资料库进行互动之外,我们还可以透过更加物件导向的方式,来和资料库进行沟通。

以下我们介绍使用 DAO 的方式,来和资料库进行沟通。

什麽是 DAO

DAO(Data Access Object),类似於其他资料库框架所说的 ORM(Object Relational Mapping),是用物件导向的方式,来和资料库进行互动。

由於 DAO 使用的方式,是多数开发者已经很熟悉的物件操作。和需要思考背後 SQL 语法的 DSL 或者 Query Builder 比较,如果开发者对 Query 语法没有这麽熟悉的话,使用 DAO 进行资料库存取,会更加的直观一些。

下面我们来介绍怎麽使用 DAO 来进行资料库的 CRUD 操作。

建立 DAO 类别

首先,除了建立资料表以外,我们也要建立和表互动的类别。

我们在下面定义 User 类别,来做为我们存取 Users 资料表的 DAO

class User(id: EntityID<Int>) : IntEntity(id) {  
    companion object : IntEntityClass<User>(Users)  
    var cityId by Users.cityId  
 	var name by Users.name  
}

新增和读取

建立好 DAO 类别之後,我们就可以透过物件的方式来存取资料库。

比方说,我们可以建立新资料

transaction {  
 	SchemaUtils.create(Users)  
    User.new {  
		cityId = 1
 		name = "Alice"  
 	}  
 	User.new {  
		cityId = 2
 		name = "Bob"  
	} 
}

和 DSL 时一样,我们建立好资料之後,如果没有读取的话,无法知道我们的资料是不是成功建立了。

我们一样可以透过 DAO 物件来读取资料

User  
    .all()  
    .forEach {  
        println("name: ${it.name}")  
    }

运行程序之後,我们就可以看到

name: Alice
name: Bob

修改

修改资料的方式也一样可以透过 DAO 的做法,以物件的方式,我们只要修改 DAO 物件的 attribute,就可以修改资料

SchemaUtils.create(Users)  
User.new {  
	cityId = 1  
	name = "Alice"  
}  
val user = User.new {  
	cityId = 2  
	name = "Bob"  
}  
user.name = "Carol"  
User  
    .all()  
    .forEach{  
		println("name: ${it.name}")  
    }

这样可以看到资料是

name: Alice
name: Carol

如果我们没有储存写入资料一开始的 DAO 物件,我们可以透过 id 取出我们想要的资料

SchemaUtils.create(Users)  
User.new {
 	cityId = 1  
 	name = "Alice"  
}  
User.new {  
 	cityId = 2  
 	name = "Bob"  
}  
val user = User[1]  
user.name = "Carol"  
User  
    .all()  
    .forEach{  
 		println("name: ${it.name}")  
    }

这样输出就变成了

name: Carol
name: Bob

删除

删除的方式可以透过 delete() 函数进行操作。

SchemaUtils.create(Users)  
User.new {
 	cityId = 1  
 	name = "Alice"  
}  
User.new {  
 	cityId = 2  
 	name = "Bob"  
}  
User[1].delete()
User  
    .all()  
    .forEach{  
 		println("name: ${it.name}")  
    }

运作这段程序之後,我们就会看到 Alice 的资料消失了

name: Bob

介绍完 DAO 的 CRUD 之後,我们来介绍一下上面程序内用到的 kotlin 语法。

什麽是 companion object

根据 kotlin 官方文件的 companion object 说明

An object declaration inside a class can be marked with the companion keyword

DAO 的做法里面,透过宣告

companion object : IntEntityClass<User>(Users)

我们可以让 User 类别能存取 IntEntityClass 内的函数,进而执行 EntityClass 所定义的 new()all()delete() 等函数。

以上我们简单的介绍了 kotlin Exposed 透过 DAO 执行 CRUD 的做法,我们下回见!


<<:  今天学习flask怎麽做一个blog

>>:  D6 allauth 采坑日记 Extending & Substituting User model (1)

[Day6]-基础for回圈

基本for回圈 基本格式如下: for 变数 in sequences: 要执行的程序码 for回...

自动化 End-End 测试 Nightwatch.js 之踩雷笔记:iframe

<iframe> <iframe> 是在 HTML 用来内嵌另外一个 HTM...

Amazon Linux 2 上将 Django 与 Nginx 整合 -Day 08

Amazon Linux 2 上将 Django 与 Nginx 整合 -Day 08 先前我们都是...

Day 19: Security Hub 单一帐号/启用Org.後的布建

在布建Security Hub前必须注意的事项 因为Security Hub是一项汇集所有资安服务调...

实施入侵检测系统以应对安全事件和基於生物识别的存取控制-纵深防御(Defense-in-depth)

纵深防御是一种“整合人员、技术和运营能力的资讯安全战略,以在组织的多个层次和维度之间建立可变的屏障”...