ActiveRecord

摘要:
1概述ActiveRecord是JFinal的核心组件之一。通过ActiveRecord操作数据库将大大减少代码量,大大提高开发效率。3ModelModel是ActiveRecord中最重要的组件之一。它在MVC模式下充当模型部分。TxByActionKeys可以拦截指定的actionKey并打开事务。TxByActionMethods可以拦截指定的方法并打开事务。7方言多数据库支持目前,ActiveRecordPlugin提供MySQL方言、OracleDialect和AnsiSqlDialect实现类。10多个数据源支持ActiveRecordPlugin,它可以同时支持多个数据来源、多个方言、多个缓存、多个事务级别和其他功能。每个ActiveRecordPlugin都可以独立配置。

1 概述 

       ActiveRecord 是 JFinal 最核心的组成部分之一,通过 ActiveRecord 来操作数据库,将极大地减少代码量,极大地提升开发效率。

2 ActiveRecordPlugin 

       ActiveRecord 是作为 JFinal 的 Plugin 而存在的,所以使用时需要在 JFinalConfig 中配置ActiveRecordPlugin。以下是 Plugin 配置示例代码:

ActiveRecord第1张

      以上代码配置了两个插件:C3p0Plugin 与 ActiveRecordPlugin,前者是 c3p0 数据源插件,后者是 ActiveRecrod 支持插件。ActiveReceord 中定义了 addMapping(String tableName, Class<? extends Model> modelClass>)方法,该方法建立了数据库表名到 Model 的映射关系。

      另外,以上代码中 arp.addMapping(“user”, User.class),表的主键名为默认为“id”,如果主键名称为 “user_id”则需要手动指定,如:arp.addMapping(“user”, “user_id”, User.class)。

3 Model 

      Model 是 ActiveRecord 中最重要的组件之一,它充当 MVC 模式中的 Model 部分。以下是Model 定义示例代码:             

             ActiveRecord第2张

      以上代码中的 User 通过继承 Model,便立即拥有的众多方便的操作数据库的方法。在 User中声明的dao静态对象是为了方便查询操作而定义的,该对象并不是必须的。基于ActiveRecord的 Model 无需定义属性,无需定义 getter、setter 方法,无需 XML 配置,无需 Annotation 配置,极大降低了代码量。

      以下为 Model 的一些常见用法: 

ActiveRecord第3张

      特别注意:User 中定义的 public static final User dao 对象是全局共享的,只能用于数据库查询,不能用于数据承载对象。数据承载需要使用 new User().set(…)来实现。

4 JFinal 独创 Db + Record 模式 

      Db 类及其配套的 Record 类,提供了在 Model 类之外更为丰富的数据库操作功能。使用Db 与 Record 类时,无需对数据库表进行映射,Record 相当于一个通用的 Model。以下为 Db + Record 模式的一些常见用法:

ActiveRecord第4张

       以下为事务处理示例: 

ActiveRecord第5张

      以上两次数据库更新操作在一个事务中执行,如果执行过程中发生异常或者 invoke()方法返回 false,则自动回滚事务。

5 声明式事务 

      ActiveRecord 支持声名式事务,声明式事务需要使用 ActiveRecordPlugin 提供的拦截器来实现,拦截器的配置方法见 Interceptor 有关章节。以下代码是声明式事务示例:

ActiveRecord第6张

      以上代码中,仅声明了一个 Tx 拦截器即为 action 添加了事务支持。除此之外 ActiveRecord还配备了TxByRegex、TxByActionKeys、TxByActionMethods,分别支持regex(正则)、actionKeys、actionMethods 声明式事务,以下是示例代码:

ActiveRecord第7张

      上例中的 TxByRegex 拦截器可通过传入正则表达式对 action 进行拦截,当 actionKey 被正则匹配上将开启事务。TxByActionKeys 可以对指定的 actionKey 进行拦截并开启事务,TxByActionMethods 可以对指定的 method 进行拦截并开启事务。

      注意:MySql 数据库表必须设置为 InnoDB 引擎时才支持事务,MyISAM 并不支持事务。 

6 Cache 

       ActiveRecord 可以使用缓存以大大提高性能,以下代码是 Cache 使用示例: 

ActiveRecord第8张

      上例 findByCache 方法中的 cacheName 需要在 ehcache.xml 中配置如:<cache name="cacheName" …> 。此外 Model.paginateByCache(…) 、 Db.findByCache(…) 、Db.paginateByCache(…)方法都提供了 cache 支持。在使用时,只需传入 cacheName、key 以及在 ehccache.xml 中配置相对应的 cacheName 就可以了。

7 Dialect 多数据库支持 

      目前 ActiveRecordPlugin 提供了 MysqlDialect、OracleDialect、AnsiSqlDialect 实现类。MysqlDialect 与 OracleDialect 分别实现对 Mysql 与 Oracle 的支持,AnsiSqlDialect 实现对遵守ANSI SQL 数据库的支持。以下是数据库 Dialect 的配置代码:

ActiveRecord第9张

8 表关联操作 

      JFinal ActiveRecord 天然支持表关联操作,并不需要学习新的东西,此为无招胜有招。表关联操作主要有两种方式:一是直接使用 sql 得到关联数据;二是在 Model 中添加获取关联数据的方法。 

      假定现有两张数据库表:user、blog,并且 user 到 blog 是一对多关系,blog 表中使用 user_id关联到 user 表。如下代码演示使用第一种方式得到 user_name:

      ActiveRecord第10张

      以下代码演示第二种方式在Blog中获取相关联的 User以及在User中获取相关联的 Blog: 

ActiveRecord第11张

9 Oracle 支持 

      Oracle 数据库具有一定的特殊性,JFinal 针对这些特殊性进行了一些额外的支持以方便广大的 Oracle 使用者。以下是一个完整的 Oracle 配置示例:

ActiveRecord第12张

      由于Oracle数据库会自动将属性名(字段名)转换成大写,所以需要手动指定主键名为大写,如:arp.addMaping(“user”, “ID”, User.class)。如果想让 ActiveRecord 对属性名(字段名)的大小写不敏感可以通过设置 CaseInsensitiveContainerFactory 来达到,有了这个设置,则arp.addMaping(“user”, “ID”, User.class)不再需要了。

      另外,Oracle 并未直接支持自增主键,JFinal 为此提供了便捷的解决方案。要让 Oracle 支持自动主键主要分为两步:一是创建序列,二是在 model 中使用这个序列,具体办法如下:

      1:通过如下办法创建序列,本例中序列名为:MY_SEQ 

      CREATE SEQUENCE MY_SEQ INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999999999999999 START WITH 1 CACHE 20;

      2:在 YourModel.set(…)中使用上面创建的序列 

ActiveRecord第13张

      序列的使用很简单,只需要 yourModel.set(主键名, 序列名 + “.nextval”)就可以了。特别注意这里的 “.nextval” 后缀一定要是小写,OracleDialect 对该值的大小写敏感。

10 多数据源支持 

      ActiveRecordPlugin 可同时支持多数据源、多方言、多缓存、多事务级别等特性,对每个 ActiveRecordPlugin 可进行彼此独立的配置。简言之 JFinal 可以同时使用多数据源,并且可以针对这多个数据源配置独立的方言、缓存、事务级别等。

      当使用多数据源时,只需要对每个 ActiveRecordPlugin 指定一个 configName 即可,如下是代码示例:

ActiveRecord第14张

      以上代码创建了创了两个 ActiveRecordPlugin 实例 arpMysql 与 arpOrace,特别注意创建实例的同时指定其 configName 分别为 mysql 与 oracle。arpMysql 与 arpOracle 分别映射了不同的Model,配置了不同的方言。

      对于 Model 的使用,不同的 Model 会自动找到其所属的 ActiveRecrodPlugin 实例以及相关配置进行数据库操作。假如希望同一个 Model 能够切换到不同的数据源上使用,也极度方便,这种用法非常适合不同数据源中的 table 拥有相同表结构的情况,开发者希望用同一个 Model来操作这些相同表结构的 table,以下是示例代码:

ActiveRecord第15张

      上例中的代码,blog.use(“backupDatabase”)方法切换数据源到 backupDatabase 并直接将数据保存起来。

      特别注意:只有在同一个 Model 希望对应到多个数据源的 table 时才需要使用 use 方法,如果同一个 Model 唯一对应一个数据源的一个 table,那么数据源的切换是自动的,无需使用 use方法。

      对于 Db + Record 的使用,数据源的切换需要使用 Db.use(cnfigName)方法得到数据库操作对象,然后就可以进行数据库操作了,以下是代码示例:

ActiveRecord第16张

      以上两行代码,分别通过 configName 为 mysql、oracle 得到各自的数据库操作对象,然后就可以如同单数据完全一样的方式来使用数据库操作 API 了。简言之,对于 Db + Record 来说,多数据源相比单数据源仅需多调用一下 Db.use(configName),随后的 API 使用方式完全一样。

      注意最先创建的 ActiveRecrodPlugin 实例将会成为主数据源,可以省略 configName。最先创建的 ActiveRecrodPlugin 实例中的配置将默认成为主配置,此外还可以通过设置 configName为 DbKit.MAIN_CONFIG_NAME 常量来设置主配置。

      

11 非 web 环境下使用 ActiveRecord     

      ActiveRecordPlugin 可以独立于 java web 环境运行在任何普通的 java 程序中,使用方式极度简单,相对于 web 项目只需要手动调用一下其 start() 方法即可立即使用。以下是代码示例:

ActiveRecord第17张

      注意:ActiveRecordPlugin 所依赖的其它插件也必须手动调用一下 start()方法,如上例中的dp.start()。

免责声明:文章转载自《ActiveRecord》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Minicom配置TP5.1 爬虫下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL Server中的锁 详解 nolock,rowlock,tablock,xlock,paglock

摘自: http://www.myexception.cn/sql-server/385562.html 高手进 锁 nolock,rowlock,tablock,xlock,paglock 锁 nolock,rowlock,tablock,xlock,paglock 请问大哥,在什么情况下用什么样的锁,小弟不太明白。 ------解决方案---...

开发者使用JasperReport——带参数查询数据库

前言 上一篇我们介绍了如何使用JasperReport来生成查询数据库的报表,今天我们在其基础上再稍进一步,那就是如何带参数查询数据库。 正题 跟上一篇一样,我们要生成报表需要以下几个步骤: 1.引入jar包,请看《静态文本报表》 。 2.新建报表模版: 由于我们这次需要带参数查询数据库(查询的是T_USER数据表),所以报表模版需要更改一下,其实只更...

根据前端时间范围-后端进行时间范围数据库查询

一、场景 从前端获取时间范围 时间范围作为参数传递给后端 后端将时间范围参数转换datetime类型 根据时间范围进行数据库查询 二、功能实现 前端获取时间范围 参考资料: https://blog.csdn.net/lianzhang861/article/details/80422513 原生HTML获取时间范围 <form act...

oracle优化的几个简单步骤

数据库优化的讨论可以说是一个永恒的主题。资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack,贴出数据库配置等等。还有的人认为要抓出执行最慢的语句来进行优化。但实际情况是,提出疑问的人很可能根本不懂执行计划,更不要说statspack了。而我认为,数据库优化,应该首先从大的方面考虑:网络、服务器硬件配置、操作系统配置、Ora...

excel文件使用navicat工具导入mysql的方法

1、在excel文件的sheet上,第1行下面插入一行,对应DB里面的字段名称,方便后面导入时做字段匹配: 2、使用Navicat ,打开工具,选择表所在的数据库,然后点击数据库名字,右键Tables,出来下拉菜单选择import wizard(中文版:导入向导).弹出一个选择界面,选择excel file文件 3、点击next(下一步),选择对应...

20个PHP开源内容管理系统

内容管理系统(CMS)广泛应用于企业网站、个人网站、博客、电子商务网站等内容更新频繁的网站,可以轻松处理大量的数据请求,实现便捷管理。 本文为你整理了一些用 PHP 编写的开源 CMS,你可以用于 PHP 学习,或根据自己的需求进行修改。 (编注:英文原文中介绍了60个开源的PHP CMS,这篇译文摘译了20个。) 1.DynPage DynPage 是...