第一个ActionScript MySQL Driver:asSQL原理与实践

 熟悉Flex 的开发者都知道,在Flex中不能直接访问数据库,而是采用HTTPService/WebService/RemoteObject等方式实现。asSQL的出现多少让大家感到意外(抛开这两种方式的优劣不提),也可见它的威力。

1.
简介

大型软件系统都采取了分层设计的原则,将其分为大致表现(UI)、业务逻辑以及EIS三部分。在Java语言,直接与数据库打交道曾是家常便饭。HibernateO/R Mapping工具流行,直接使用JDBC编程变得少见了,但有时这种方式更加简便、速度更快。

ActionScript
用于在Flash实现动画设计,访问数据库自然不是它的强项,甚至大家都觉得没有必要。asSQL的出现使许多Flash的开发 者感到惊喜(也许在Java开发人员看来这实在算不了什么)。asSQL现在是alpha版本,还很稚嫩有一些问题。但基本工作正常。

2. asSQL
驱动

a
Connection

asSQL
也提供了类似Java语言的Connection,确切的说asSQL中的Connection是类,而JavaConnectio是接口。 Connection负责与mySQL Server通讯(通过socket建立连接,握手,接收/发送数据包),并按照mySQL协议解析、加密数据包(此处略去协议处理细节,感兴趣的请访问 http://www.redferni.uklinux.net/mysql/MySQL-Protocol.html)。

b
MysqlService

虽然ConnectionasSQL的核心对象,但与客户打交道仅有一个UI组件MysqlService。该组件需要用户输入hostport database等信息,在内部创建Connection,这避免了用户直接操作Connection可能引发的错误。<o:p></o:p> 

xml 代码
 
  1. <controls:MysqlService id="sqlService" host="localhost" port="3306" user="root" scrambler="{new PlainTextScrambler('sa')}"  database="jpetstore" response="onResponse(event)" error="onError(event)" />  

 将操作结果保存到lastResult中,因此它可作为数据源(data provider)供其它组件(如DataGrid)使用,如下所示:<o:p></o:p>  

xml 代码
 
  1. <mx:DataGrid x="55" y="137" dataProvider="{sqlService.lastResult}">  
  2.     <mx:columns>  
  3.         <mx:DataGridColumn headerText="UserId" dataField="userid"/>  
  4.         <mx:DataGridColumn headerText="Email" dataField="email"/>  
  5.         <mx:DataGridColumn headerText="First Name" dataField="firstname"/>  
  6.     mx:columns>  
  7. mx:DataGrid>  

在一个按钮click事件中,调用myService.send('SELECT userid,email,firstname FROM account;')即可触发上述DataGrid加载数据。

MysqlService支持3个事件,分别是resultsresponseerrors,供调用者定制操作结果。

errors
:显然是发生错误
results
response的区别是前者针对SELECT操作,后者针对UPDATEDELETE......


遗憾的是,MysqlService设计的不够完美,Connection的创建和释放可能被分离到类内部和外部实现。如果用户提供上述事件的响应函数,就必须在该函数中显示关闭connection。如下所示: 

<o:p></o:p>

ActionScript 代码
 
  1. private function onResults(e:ResultsEvent):void{   
  2.       var st:Statement = Statement(e.target);   
  3.       var con:Connection = st.getConnection();   
  4.       var rs:ResultSet = e.resultSet;   
  5.   
  6.       while ( rs.next() ) {   
  7.           var userid = rs.getString("userid");   
  8.           //var email = rs.getString(2);   
  9.           trace(userid);   
  10.       }   
  11.   
  12.       con.disconnect();   
  13. }   
  14.   
  15. private function onResponse(e:ResponseEvent):void{     
  16.      var st:Statement = Statement(e.target);   
  17.      var con:Connection = st.getConnection();   
  18.         
  19.      var affectedRows:int = e.affectedRows;   
  20.      var insertID:int = e.insertID;   
  21.   
  22.      con.disconnect();   
  23. }   
  24.   
  25. private function onError(e:SQLErrorEvent):void{   
  26.      var st:Statement = Statement(e.target);   
  27.      var con:Connection = st.getConnection();   
  28.         
  29.      var message:String = e.msg;   
  30.      var errorNo:int = e.id;   
  31.      var text:String = e.text; // Equals SQLError #{id}: {msg}   
  32.   
  33.      con.disconnect();   
  34. }   

3. 示例

    asSQL
目前仅支持mySQL,它以UI组件的形式供用户调用,并以数据源的形式把数据和UI组件绑定。

   
开发环境:Flex Builder 2,以及MySql 5,还有Spring <st1:chsdate month="12" islunardate="False" day="30" year="1899" w:st="on" isrocdate="False">1.2.8</st1:chsdate>中实例JPetStoreSchema

步骤1MySQL中建立一个叫做JPetStoreDatabase。并把JPetStoreSchema导入其中。
步骤2:从http://maclema.com/assql/downloads/asSQL-0.1alpha.swc下载asSQL SWC
步骤3:新建Flex Project项目,然后选中项目根目录,右键Properties->Flex Build Path->Library Path;点击右侧按钮Add SWC,在浏览窗口找到刚下载的SWC文件。
步骤4:编辑Flex的界面元素,增加1ComboBox1DataGrid,以及2个按钮。然后编辑MXML文件。

附件是运行界面和源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值