ActiveRecord-1
ActiveRecord-1
概述
ActiveRecord是JFinal最核心的组成部分之一,用它来操作数据库,极大地减少了代码量,提升了开发的效率。
而ActiveRecord 模式的核心是:一个对象(Model)唯一对应数据库表中的一条记录,而对应关系靠的是数据库表的主键值。
因此,ActiveRecord 模式要求数据库表必须要有主键。
当数据库表没有主键时,只能使用 Db + Record 模式来操作数据库。
ActiveRecordPlugin
ActiveRecord是作为JFinal的Plugin而存在的,所以在使用时需要在JFinalConfig中配置ActiveRecordPlugin。配置如下:
public void configPlugin(Plugins me) {
// 配置 druid 数据库连接池插件
DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password").trim());
me.add(druidPlugin);
// 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
// 所有映射在 MappingKit 中自动化搞定
_MappingKit.mapping(arp);
me.add(arp);
}
以上代码配置了两个插件,DruidPlugin和ActiveRecordPlugin。
_MappingKit类提供映射信息,代码如下:
public class _MappingKit {
public static void mapping(ActiveRecordPlugin arp) {
arp.addMapping("user", "id", User.class);
arp.addMapping("role", "id", Role.class);
arp.addMapping("permission", "id", Permission.class);
}
}
ActiveReceord中定义了addMapping(String tableName, Class<? extends Model> modelClass>)方法,该方法建立了数据库表名到Model的映射关系。
arp.addMapping(“user”, User.class),表的主键名为默认为 “id”,如果主键名称为 “user_id” 则需要手动指定,如:arp.addMapping(“user”, “user_id”, User.class)。以上配置都可以通过JFinal自动生成。
Model
基本用法
Model是ActiveRecord中最重要组件之一,充当的是MVC中M的角色,代码示例如下:
public abstract class BaseUser<M extends BaseUser<M>> extends Model<M> implements IBean {
public M setId(String id){
set("id", id);
return (M) this;
}
public String getId(){
return getStr("id");
}
public M setName(String name){
set("name", name);
return (M) this;
}
public String getName(){
return getStr("name");
}
public M setRoleId(String roleId){
set("roleId", roleId);
return (M) this;
}
public String getRoleId(){
return getStr("roleId");
}
}
public class User extends BaseUser<User> {
public static final User dao = new User().dao();
}
BaseUser类继承了Model类,所以它拥有了一系列操作数据库的方法。
在User中声明的dao静态对象是为了方便查询操作而定义的,该对象并不是必须的。
基于ActiveRecord的Model无需定义属性,无需定义getter、setter方法,无需XML配置,无需Annotation配置,极大降低了代码量。
Model
- 常用方法常量
// 创建name属性为James,age属性为25的User对象并添加到数据库
new User().set("name", "James").set("age", 25).save();
// 删除id值为25的User
User.dao.deleteById(25);
// 查询id值为25的User将其name属性改为James并更新到数据库
User.dao.findById(25).set("name", "James").update();
// 查询id值为25的user, 且仅仅取name与age两个字段的值
User user = User.dao.findByIdLoadColumns(25, "name, age");
// 获取user的name属性
String userName = user.getStr("name");
// 获取user的age属性
Integer userAge = user.getInt("age");
// 查询所有年龄大于18岁的user
List<User> users = User.dao.find("select * from user where age>18");
// 分页查询年龄大于18的user,当前页号为1,每页10个user
Page<User> userPage = User.dao.paginate(1, 10, "select *", "from user where age > ?", 18);
-
常见错误
有不少用户经常在使用 model.find(…) 这类方法时碰到 NullPointerException 异常,通常是由于该 model 没有使用 ActionRecordPlugin.addMapping(…) 进行过映射。 建议通过生成器自动化生成映射,无需手工添加这类代码,生成器在本站首页下载 jfinal demo,里面有提供。
上一篇: yii2.0使用Plupload实现带缩放功能的多图上传_PHP
下一篇: JS常用技巧有哪些
推荐阅读