欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ActiveRecord-1

程序员文章站 2022-06-14 20:21:19
...

概述

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

  1. 常用方法常量
	// 创建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);

  1. 常见错误

    有不少用户经常在使用 model.find(…) 这类方法时碰到 NullPointerException 异常,通常是由于该 model 没有使用 ActionRecordPlugin.addMapping(…) 进行过映射。 建议通过生成器自动化生成映射,无需手工添加这类代码,生成器在本站首页下载 jfinal demo,里面有提供。

相关标签: JFinal

推荐阅读