• 5.3 Model
    • 1、基本用法
    • 2、常见错误

    5.3 Model

    1、基本用法

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

    1. public class User extends Model<User> {
    2. public static final User dao = new User().dao();
    3. }

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

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

    1. // 创建name属性为James,age属性为25的User对象并添加到数据库
    2. new User().set("name", "James").set("age", 25).save();
    3.  
    4. // 删除id值为25的User
    5. User.dao.deleteById(25);
    6.  
    7. // 查询id值为25的User将其name属性改为James并更新到数据库
    8. User.dao.findById(25).set("name", "James").update();
    9.  
    10. // 查询id值为25的user, 且仅仅取name与age两个字段的值
    11. User user = User.dao.findByIdLoadColumns(25, "name, age");
    12.  
    13. // 获取user的name属性
    14. String userName = user.getStr("name");
    15.  
    16. // 获取user的age属性
    17. Integer userAge = user.getInt("age");
    18.  
    19. // 查询所有年龄大于18岁的user
    20. List<User> users = User.dao.find("select * from user where age>18");
    21.  
    22. // 分页查询年龄大于18的user,当前页号为1,每页10个user
    23. Page<User> userPage = User.dao.paginate(1, 10, "select *", "from user where age > ?", 18);

    以上用法将 dao 对象声明在了 model 中仅为方便展示,在实际应用中应该将 dao 对象放在 Service 中,并且让其成为 private,这样可以保障 sql 以及数据库操作被限定在 service 层中。可以通过下载官网首页的 jfinal_demo_for_maven 来参考 dao 在 Service 层中的用法。

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

    2、常见错误

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