一 : 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
<PAAS平台>
基于Slick的数据库应用开发手册
版本 <1.0>
1
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
修订历史
2
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册................................................................................................. 4
1 概述 .............................................................................................................................................. 4
1.1 前言 ............................................................................................................................... 4
1.2 目的 ............................................................................................................................... 4
1.3 范围 ............................................................................................................................... 4
1.4 术语和缩写语 ............................................................................................................... 4
2 Slick(Lifted)数据库表映射 ...................................................................................................... 5
2.1 orders和orderItems ..................................................................................................... 5
2.2 Slick数据类型 ............................................................................................................. 6
2.3 Slick约束 ..................................................................................................................... 6
3 Slick(Lifted)数据库插入 .......................................................................................................... 8
4 Slick(Lifted)数据库查询 .......................................................................................................... 9
4.1 单表查询 ....................................................................................................................... 9
4.2 多表查询 ....................................................................................................................... 9
4.3 连接类型 ....................................................................................................................... 9
4.4 组合查询 ..................................................................................................................... 10
4.5 分页查询 ..................................................................................................................... 10
4.6 分组查询 ..................................................................................................................... 10
4.7 查询排序 ..................................................................................................................... 10
4.8 查询函数 ..................................................................................................................... 10
5 Slick(Lifted)数据库修改 ........................................................................................................ 12
6 Slick(Lifted)数据库删除 ........................................................................................................ 13
7 Slick和PAAS平台的集成 ......................................................................................................... 14
7.1 Slick的功能和作用 ................................................................................................... 14
7.2 基于Slick的Service和DAO类 .............................................................................. 14
7.3 基于数据库事务的消息机制 ..................................................................................... 15
8 总结和展望 ................................................................................................................................. 16
9 附件代码..................................................................................................................................... 17
10 参考资料 ................................................................................................................................... 20
3
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
1 概述
1.1 前言
Slick 是 TypeSafe 推出的 Scala 数据库访问库,开发者可以使用 Scala 语言风格来编写数据查询,而不是直接使用SQL。(www.61k.com]这样的好处是在编译期就可以发现数据库操作的语法错误,而不是传统SQL要在运行期才能发现数据库操作的语法错误;Slick使用统一的数据库操作API,屏蔽了多种数据库之间的语法差别;SCALA可以运行在JVM上,并且可以完全使用JAVA的类库,这样Slick也拥有了JAVA跨平台的能力。
1.2 目的
本文档的目的是帮助PAAS平台开发人员快速使用Slick,开发数据库相关的应用程序。本文第二、三、四、五、六章介绍Slick(Lifted)的基本使用方法。然后通过第七章介绍Slick和消息总线的集成。最后,第八、九、十章给出附件代码、总结及展望和参考资料。
1.3 范围
本文档适用于PAAS系统整个项目周期中对Slick数据库应用程序开发的指导和约束。要了解Slick和SCALA的使用详情,参考Slick 1.0.1官方文档和SCALA 2.10官方文档。
1.4 术语和缩写语
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
2 Slick(Lifted)数据库表映射
本章首先通过orders和order_items表的例子快速简单的介绍Slick是如何实现数据对象和数据库表的映射,然后进一步介绍Slick的数据类型、约束等内容。(www.61k.com)
2.1 orders和orderItems
orders和orderItems的表结构定义如下表2-1、2-2所示,包括了数据库表的大部分基本定义。
表 2-1 orders
表
2-2 order_items
orders和orderItems的映射对象如下代码2-1所示,Orders和OrderItems都继承Table抽象类,并且必须实现Table类的抽象方法‘*’,‘*’返回Projection类型的对象,该对象的参数类型必须和Table类的参数类型匹配,如果Table的类的参数类型是case class,则需要采用<>方法进行转换,本例中定义了Order和OrderItem两个case class类型,Table的构造参数对应数据库表名。通过column方法创建表中字段的映射关系,column方法通过类型参数对应表中字段数据类型,第一个参数为表的字段名,后面的参数设置对应表中字段的属性,比如主健(O.PrimaryKey)、自增长(O.AutoInc)、可以为空(O.Nullable,不设置该属性,该字段为必须非空项)、默认值(O.Default)和原始字段类型(O.DBType)。通过index和foreignKey方法对应数据库表的约束:唯一健和外键。表中可以为空的字段在Table参数表中对应Option类型,在‘*’方法中对应字段需要使用Column类型的‘?’方法,表示该属性可以为空,目前Slick没有支持类似一些
5
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
ORM 中间件(hibernate)的级联操作(删除级联,更新级联)映射。(www.61k.com]在完成Table对象的定义后,可以调用该对象的dll方法返回DLL类型对象,通过DLL类型对象的create和drop方法以代码的方式创建和删除数据库表。
代码 2-1
注意:
?
?
?
? 尽量避免使用O.DBType方法,该方法依赖于数据库字段类型,降低了代码对不同数据库的兼容性,增加了和数据库的耦合。 Table的类型参数除了case class以外,也可以使用Tupler类型,但是建议使用case class来封装一组相关的属性到一个类中,而不是使用Tupler类型,case class能更好的反映业务数据。 ‘*’方法中字段的连接顺序决定了insert和upate的参数类型。 DLL类型的create和drop方法无法加入事务,这两个方法永远是独立的原子操作,无法和其它数据
库操作在一个事务中组成原子操作。
2.2 Slick数据类型
Slick数据类型和数据库字段类型对应关系如下所示:
? 数字类型::Byte, Short, Int, Long, BigDecimal, Float, Double
? 大数据类型: java.sql.Blob, java.sql.Clob, Array[Byte]
? 日期类型: java.sql.Date, java.sql.Time, java.sql.Timestamp
? 布尔类型: true, false
? 字符类型:java.lang.String
? 唯一值类型:java.util.UUID
2.3 Slick约束
Slick通过如下方式映射数据库约束:
? 外键约束如上代码2-1所示;
? 主键约束如上代码2-1所示;
6
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
? 唯一键约束如上代码2-1所示; ? 组合主键约束如下代码2-2所示;
代码 2-2
? 组合唯一键约束如下代码2-3所示;
代码 2-3
7
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
3 Slick(Lifted)数据库插入
插入数据如下代码3-1所示。[www.61k.com]第一种插入方式使用Order类型(case class)作为insert方法的参数,这时对于自增长主键或可以为空的字段可以使用None对象来表示该字段不插入数据。第二种方式可以自由连接Orders对象的Column类型属性来组成Projection类型对象,然后使用变参来作为insert方法的参数,参数类型对应Projection类型对象中Column类型对象的顺序。
Insert方法的返回内容默认情况为0或1,表示失败或成功。如果调用returning方法,则返回指定字段的数据。
代码 3-1
批量插入数据如下代码3-2所示,用insertAll方法替代insert方法,返回成功的数量。
代码 3-2
注意:
? 只有属性为自增长,并且是主键的字段才可以在insert后作为返回结果,目前只有Int支持自增长,
java.util.UUID虽然也可以作为主键,但不能自增长,所以无法在insert后作为返回结果,该问题产生的原因是受限于数据库insert命令的返回结果。
61阅读请您转载分享:
8
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
4 Slick(Lifted)数据库查询
4.1 单表查询
单表查询数据如下代码4-1所示,查询条件使用for中的门卫来控制,通过yield语句获取Query类型对象,通过该对象list方法获取查询结果集。(www.61k.com)
代码 4-1
注意:
? Slick中使用===来比较数据,而不是==。
4.2 多表查询
多表查询如下代码4-2所示,通过for中的门卫来连接表。
代码 4-2
4.3 连接类型
Slick连接类型如下代码4-3所示,有叉乘、内连接、左连接、右连接和全外连接。
代码
4-3
9
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
4.4 组合查询
组合查询如下代码4-4所示,两个Query对象的字段类型和顺序必须相同,第二种过滤相同的数据。[www.61k.com]
代码 4-4
4.5 分页查询
分页查询如下代码4-5所示,通过组合Query类型的take和drop来实现。
代码 4-5
4.6 分组查询
分组查询如下代码4-6所示。
代码 4-6
4.7 查询排序
查询结果排序如下代码4-7所示。
代码 4-7
4.8 查询函数
Slick查询函数如下代码4-8所示。
10
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
代码 4-8
11
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
5 Slick(Lifted)数据库修改
更新数据如下代码5-1所示。(www.61k.com)
代码 5-1
12
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
6 Slick(Lifted)数据库删除
删除数据如下代码6-1所示。(www.61k.com)
代码 6-1
13
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
7 Slick和PAAS平台的集成
7.1 Slick的功能和作用
Slick提供了PAAS平台Serive层数据库事务功能和支持DAO层实现数据库操作的功能。(www.61k.com)Slick作用类似于JDBC,但是具有一定ORM特性。
7.2 基于Slick的Service和DAO类
基于Slick的Service和DAO类如下图7-1所示,ModelActorImplAkka、ModelServServiceImplSlick和ModelDaoImplSlick抽象类依赖于Slick API,实现了Service层数据库事务机制。Service层中的类通过继承ModelServServiceImplSlick抽象类实现业务逻辑, Service依赖于DAO层中的类来实现数据库访问,DAO层中的类依赖于Slick API,完成底层数据库操作,这样Service层中的类可以与SlickAPI无关,不需要在Service层中加入任何和数据库事务和数据库底层操作相关的代码,获取类似EJB容器性的事务服务。
图 7-1基于Slick的Service和DAO层类
Service和DAO层序列图如图7-2所示,通过ModelActorImplAkka对象调用Slick API开启/提交事务(可以不开启/不提交事务)。开启事务后所有数据库操作视为原子操作,只有成功提交事务后所有操作才会在数据库中生效,如果发生异常,则撤销所有数据库操作;如果没有开启事务,每次数据库操作都是一个独立的事务,在完成后立刻在数据库中生效;ServiceImpl1服务对象可以调用DAOImpl DAO对象,也可以调用ServiceImpl2其他服务对象,DAOImpl调用
14
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
Slick API实现底层数据库操作。[www.61k.com]
7.3 基于数据库事务的消息机制
在PAAS平台中所有需要事务功能的消息都要继承com.beyond.paas.message.ModelWithTransactionMessage。
15
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
8 总结和展望
目前PAAS平台只实现了Slick Lifted API。[www.61k.com)接下来可以通过实现Slick Plain SQL Queries API来提供需要比较复杂查询的业务功能,例如:报表;接下来待Slick Direct Embedding API正式提供后,来实现和slick API无关的底层数据库操作。目前PAAS平台只提供同一JVM中的事务机制,不提供跨JVM的事务机制。
16
61阅读请您转载分享:
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
9 附件代码
BeyoPaasMessage.scala //(c) Copyright Beyond PAAS contributors and others 2013 package com.beyond.paas.message
/**
* All Beyond Paas's parent message
* @Author
* @CreateDate 2013-7-18
*/
trait Message
/**
* All System's parent message
*/
trait SystemMessage extends Message
/**
* All Model's parent message
*/
trait ModelMessage extends Message
/**
* All Model with transaction parent message
*/
trait ModelWithTransactionMessage extends ModelMessage
ModelActorImplAkka.scala
//(c) Copyright Beyond PAAS contributors and others 2013
package com.beyond.paas.model
import akka.actor.Actor
import akka.actor.ActorLogging
import akka.actor.ActorRef
import com.beyond.paas.exception.messagecenter.RestartException
import com.beyond.paas.message.messagecenter.MessCentModelMessage import com.beyond.paas.message.ModelMessage
import com.beyond.paas.message.ModelWithTransactionMessage import com.beyond.paas.tool.db.DataSourceImplDBCP
import scala.slick.driver.MySQLDriver.simple._
17
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
/**
* All child model actor need to implement ModelActorImplAkka
* @Author xiaohui su
* @CreateDate 2013-7-18
*/
abstract class ModelActorImplAkka extends Actor with ActorLogging{
//Session is implicit object that is passed to ModelService and ModelDao and used by ModelDao.
implicit var session : Session = null
def receive = {
case _ : MessCentModelMessage => sender ! self //Return self (model actor)
case message : ModelWithTransactionMessage => // do business logic with transaction try{
Database.forDataSource(DataSourceImplDBCP.datasource) withTransaction {session : Session =>
this.session = session
doBusiness(message, sender)
}
}catch{
case ex : Throwable => log.error(ex, ex.getMessage()); throw new RestartException() }finally{
session = null
}
case message : ModelMessage => // do business logic with out transaction
try{
Database.forDataSource(DataSourceImplDBCP.datasource) withSession {session : Session =>
this.session = session
doBusiness(message, sender)
}
}catch{
case ex : Throwable => log.error(ex, ex.getMessage()); throw new RestartException() }finally{
session = null
}
}
/**
* To handle model message, a child class need to implement this method with itself's logic.
18
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
* This is a only entrance for every model, whatever you develop your own program with traditional type or
* actor design pattern type.
*/
def doBusiness(message: ModelMessage, sender: ActorRef)
}
ModelServiceImplSlick.scala
//(c) Copyright Beyond PAAS contributors and others 2013
package com.beyond.paas.model
import scala.slick.driver.MySQLDriver.simple._
/**
* All child services need to implement ModelDaoImplSlick
* @Author
* @CreateDate 2013-7-31
*/
abstract class ModelServiceImplSlick(implicit val session: Session)
ModelDaoImplSlick.scala
//(c) Copyright Beyond PAAS contributors and others 2013
package com.beyond.paas.model
import scala.slick.driver.MySQLDriver.simple._
/**
* All child DAOs need to implement ModelDaoImplSlick
* @Author
* @CreateDate 2013-7-31
*/
abstract class ModelDaoImplSlick(implicit val session: Session)
19
slick 基于Slick的数据库应用开发手册
基于Slick的数据库应用开发手册
10 参考资料
? Slick 2.10官方开发文档 ? Slick 2.10 官方API文档
20
61阅读请您转载分享:
二 : ios开发之使用CoreData的轻量级自动数据迁
使用IOS的CoreData进行存储很方便,CoreData已经帮我们做了很多基础的工作,一般情况下没必要自己操作数据库了。[www.61k.com]
在开发中修改了实体模型,可能会遇到schema incompatibility的错误,这是因为修改了数据结构,要进行数据迁移。
其实很多简单的情况,不用这么麻烦,Coredata提供了轻量级的自动数据迁移,比如以下三个情况会自动进行:
1.简单的增加一个字段
2.把一个必填字段改为可选字段
3.把可选字段改为必填字段(但一定要定义默认值)
怎样开启自动迁移的功能?分三步
1.在App delegate类里修改persistentStoreCoordinator方法
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"WorkXP.sqlite"];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
// handle db upgrade
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
// Handle error
}
return __persistentStoreCoordinator;
}
2.增加一个新版本
选择上你的xcdatamodel文件 Design -> Data Model -> Add Model Version (expand your xcdatamodeld item) 选择 “2〃 (或者最新的) 文件, Design -> Data Model -> Set Current Version (然后编辑这个版本的文件)
3.在App delegate中指定momd资源
- (NSManagedObjectModel *)managedObjectModel {
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"WorkXP" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
文档来自:《千锋网》
http://tieba.baidu.com/f?kz=1341014863
三 : IOS应用开发-数据库创建
一、前言
数据库作为一种数据载体被我们频繁地使用。一般情况下我们会在程序的入口方法处完成数据库的创建。下面通过实例简单介绍两种创建数据库的方法。
二、需求
在documents目录下创建一个test.sqlite数据库,里面包含表User。User表含username和password两个varchar类型的字段。
方法一:使用SQLiteManager创建数据库和表,并将创建好的数据库文件拖入项目中,最后调用以下代码将数据库复制到documents目录;
/** * 将数据库文件复制进沙盒 */-(void)createEditableCopyOfDatabaseIfNeeded{ // 先判断 sandbox 下面的 documents 子文件夹里面有没有数据库文件 test.sqlite NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"test.sqlite"]; BOOL ifFind = [fileManager fileExistsAtPath:writableDBPath]; if (ifFind) { // NSLog(@"数据库已存在"); return; } else{ NSLog(@"数据库不存在,需要复制"); } // 如果不存在数据库文件,则复制数据库文件 NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"sqlite"]; BOOL ifSuccess = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; if (!ifSuccess) { NSLog(@"Failed to create writable database file with message '%@'.", [error localizedDescription]); }else { NSLog(@"createEditableCopyOfDatabaseIfNeeded 初始化成功"); } return;}
方法二:利用开源的FMDB库代码创建数据库;
/** * 代码创建数据库 */- (void)createDatabaseIfNeeded{ // 数据库路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *doc = [paths objectAtIndex:0]; NSString *path = [doc stringByAppendingPathComponent:@"test.sqlite"]; NSFileManager * fileManager = [NSFileManager defaultManager]; if ([fileManager fileExistsAtPath:path] == NO) { // create it FMDatabase * db = [FMDatabase databaseWithPath:path]; if ([db open]) { // 建立User表 NSMutableString *sql = [NSMutableString stringWithFormat:@"%@",@"CREATE TABLE User"]; [sql appendString:@"("]; [sql appendString:@"username varchar,"]; [sql appendString:@"password varchar"]; [sql appendString:@")"]; BOOL res = [db executeUpdate:sql]; if (!res) { debugLog(@"error when creating table User"); } else { debugLog(@"succ to creating table User"); } [db close]; } else { debugLog(@"error when open db"); } }}
注:FMDB库使用教程http://blog.devtang.com/blog/2012/04/22/use-fmdb/
三、总结1、第一种方法创建数据库在需求变动的情况下(如增加几张表)容错率稍高,推荐使用第一种方法;
2、两种方法均是先判断数据库是否存在然后再决定要不要创建/复制数据库。在一种特殊情况下-应用更新版本,其实原来的数据库文件是会从老的版本中拷贝到新版本中(参考:http://blog.csdn.net/zyx586/article/details/18989199),所以更新版本后数据库文件是不会做任何改变的,就算你在新的版本中完全改变数据库的结构。所以如果存在数据库变动的需要在应用版本升级后重新创建一个全新的数据库并备份旧的数据;
扩展:ios开发者创建应用 / 安卓开发创建数据库 / ios fmdb创建数据库
本文标题:数据库应用开发-基于Slick的数据库应用开发手册61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1