Frodez
Frodez
有没有可以指定返回类型的通用select系列方法,诸如selectOne,selectByExample,selectByPrimaryKey等等凡是select方法都能用的。每次都用stream来转换类型太麻烦了。 比如现在我的mapper对应类A,但是我有个相仿的只包括了A中部分字段的类B,然后我现在希望只查询B中的字段,要么只能自己写sql单独匹配,要么只能用Amapper.selectAll().stream.map(xxxxxx).collect(Collectors.toList())这样的办法,而且后者每次查询会查出所有数据,查询效率低,stream.map也有不小的开销。 可以给这些方法一个重载参数ClassresultType,或者取个selectOneFor,selectByExampleFor之类的名字,返回值类型直接就变成T了。
> 有没有测试数据? > > 个人感觉简单易读比提升不大的性能更重要。 呃暂时没有写测试,我只是根据运行流程推断如此。 另外这样写其实可以去掉mybatis原本的@Intercepts注解,相当于减少了一些理解的成本。因为实际上 ```java return Plugin.wrap(target, this); ``` 这句代码就是去获取@Intercepts注解及里面的@Signature注解,如果不使用这句代码,就不需要这两个注解,等于没有了理解这两个注解的成本。 而Plugin.wrap的逻辑是,如果根据以上两个注解判明,目标对象存在想要被代理的方法,就会生成一个Plugin对象,在里面存储上面这两个注解配置的信息,然后放入代理中——因为Plugin对象继承了InvocationHandler接口。最后,在目标对象的方法运行的时候,再进入刚刚生成的Plugin对象,根据里面存储的配置信息,判断运行的方法是否为需要被代理的方法,如果是则代理,不是则不代理。 这个流程其实很繁琐,而且需要反复运用反射,还需要一个比较重的Plugin对象来包装。实际上如果确定只需要代理其中某些方法,完全不必用注解来配置是否代理的规则,就不需要这个看似简单实则复杂的流程了。 Plugin对象的源代码见链接:https://github.com/mybatis/mybatis-3/blob/master/src/main/java/org/apache/ibatis/plugin/Plugin.java 最后我觉得修改的代码理解起来也很简单的,两个if的逻辑很简单,很容易就能让人知道这段代码想干什么了。如果担心可能会有Execuator的实现类加入了别的名为query的方法,导致简单的逻辑可能出现问题的话,再用方法参数来约束也不迟,那样也就再多一个if的事情。
> 有没有测试数据? > > 个人感觉简单易读比提升不大的性能更重要。 刚刚写了个用例,大致结果是,在mysql数据库下,用您的测试用例数据,测试selectAll方法,共获取183条数据中的前10条。在预热结束后,性能提升4%。将每页从10条改为100条,结果不变。 另外我在改之后跑了一遍所有的测试用例,没有错误。 测试用例代码如下: ```java package com.github.pagehelper.test.basic; import com.github.pagehelper.PageHelper; import com.github.pagehelper.mapper.UserMapper; import com.github.pagehelper.util.MybatisHelper; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class PluginWrapperTest { @Test public void test() {...
今天申奥成功了都,大家都知道了,只有可怜的大雄不知道