ActiveRecord(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。ActiveRecord一直广受动态语言(PHP、Ruby等)的喜爱,而Java作为准静态语言,对于ActiveRecord往往只能感叹其优雅,所以MP也在AR道路上进行了一定的探索,仅仅需要让实体类继承Model类且实现主键指定方法,即可开启AR之旅。接下来看具体代码:
1、entity:
2、mapper:
3、使用AR:
(1)、AR插入操作:
(2)、AR更新操作:
@TestpublicvoidtestArUpdate(){Useruser=newUser();user.setId(1);user.setName("刘亦菲");booleanresult=user.updateById();System.out.println(result);}注:user调用updateById方法,将id为1的用户进行更新。
(3)、AR查询操作:
(4)、AR删除操作:
(5)、AR分页操作:
MP提供了很多好用的插件,而且配置简单,使用方便。接下来一起看看MP的插件如何使用。
之前就有说到,BaseMapper的selectPage方法和AR提供的selectPage方法都不是物理分页,需要配置分页插件后才是物理分页,那么现在就来看看如何配置这个插件。
在plugin的list中添加如下bean即可开启性能分析插件:
MyBatis的代码生成器基于xml文件进行生成,可生成:实体类、Mapper接口、Mapper映射文件。MP的代码生成器基于Java代码进行生成,可生成:实体类(可以选择是否支持AR)、Mapper接口、Mapper映射文件、Service层、Controller层。
BaseMapper提供了17个常用方法,但是有些需求这些方法还是不能很好的实现,那么怎么办呢?大家肯定会想到是在xml文件中写sql语句解决。这样确实可以,因为MP是只做增强不做改变,我们完全可以按照mybatis的原来的方式来解决。不过MP也提供了另一种解决办法,那就是自定义全局操作。所谓自定义全局操作,也就是我们可以在mapper中自定义一些方法,然后通过某些操作,让自定义的这个方法也能像BaseMapper的内置方法,供全局调用。接下来就看看如何实现(以deleteAll方法为例)。
@TestpublicvoidtestMySqlInjector(){Integerresult=userDao.deleteAll();System.out.println(result);}@TestpublicvoidtestMySqlInjector2(){Integerresult=emplopyeeDao.deleteAll();System.out.println(result);}注:经测试,当userDao调用deleteAll方法时,会删除tb_user表的所有数据,employeeDao调用deleteAll方法时,会删除tb_employee表的所有数据。说明deleteAll方法是有效的。不过在运行这两个测试时,由于是全表删除操作,所有要先把执行分析插件关了。
其实数据并不会轻易的删除掉,毕竟数据收集不易,所以就有了逻辑删除。逻辑删除:并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据中的一个逻辑删除字段置为删除状态,比如该数据有一个字段logic_flag,当其值为1表示未删除,值为-1表示删除,那么逻辑删除就是将1变成-1。
@DatapublicclassUser{privateIntegerid;privateStringname;privateIntegerage;privateIntegergender;@TableLogic//标记逻辑删除属性privateIntegerlogicFlag;}注:数据库中逻辑删除字段是logic_flag,所以实体类中的logicFlag需要用@TableLogic注解标记。
@TestpublicvoidtestLogicDelete(){Integerresult=userDao.deleteById(1);System.out.println(result);//Useruser=userDao.selectById(1);//System.out.println(user);}注:运行该测试,执行删除操作的时候,真正执行的sql语句是UPDATEtb_userSETlogic_flag=-1WHEREid=,就是把逻辑删除字段的值设置为-1;当逻辑删除字段的值是-1时再执行查询操作,sql是SELECT...FROMtb_userWHEREid=ANDlogic_flag=1,所以查询结果是null。
我们知道,当我们进行插入或者更新操作时,没有设置值的属性,那么在数据表中要么是为null,要么是保留原来的值。有的时候我们我们没有赋值但是却不想让其为空,比如name属性,我们插入时会默认赋上“林志玲”,更新时会默认赋值上“朱茵”,那么就可以用公共字段自动填充。
@TableField(fill=FieldFill.INSERT_UPDATE)//插入和更新时填充privateStringname;2、编写公共字段填充处理器类:publicclassMyMetaObjectHandlerextendsMetaObjectHandler{@OverridepublicvoidinsertFill(MetaObjectmetaObject){ObjectfieldValue=getFieldValByName("name",metaObject);//获取需要填充的字段if(fieldValue==null){//如果该字段没有设置值setFieldValByName("name","林志玲",metaObject);//那就将其设置为"林志玲"}}@OverridepublicvoidupdateFill(MetaObjectmetaObject){ObjectfieldValue=getFieldValByName("name",metaObject);//获取需要填充的字段if(fieldValue==null){//如果该字段没有设置值setFieldValByName("name","朱茵",metaObject);//那就将其设置为"朱茵"}}}注:该类继承了MetaObjectHandler类,重写了insertFill和updateFill方法,在这两个方法获取需要填充的字段以及默认填充的值。