当前位置: 首页 > news >正文

网站开发培训设计企业数字化管理

网站开发培训设计,企业数字化管理,做网站维护的是什么公司,关于加强门户网站建设转载自 MyBatis中的RowBounds 一、如何分页查询 Mybatis如何分页查询#xff1f;Mysql中可以使用limit语句#xff0c;但limit并不是标准SQL中的#xff0c;如果是其它的数据库#xff0c;则需要使用其它语句。MyBatis提供了RowBounds类#xff0c;用于实现分页查询。R…转载自  MyBatis中的RowBounds 一、如何分页查询 Mybatis如何分页查询Mysql中可以使用limit语句但limit并不是标准SQL中的如果是其它的数据库则需要使用其它语句。MyBatis提供了RowBounds类用于实现分页查询。RowBounds中有两个数字offset和limit。 二、MyBatis如何利用RowBounds实现通用分页 在查询数据库时如果没有limit语句则ResultSet中会包含所有满足条件的数据 RowBounds在处理分页时只是简单的把offset之前的数据都skip掉超过limit之后的数据不取出上图中的代码取自MyBatis中的DefaultResultSetHandler类。跳过offset之前的数据是由方法skipRows处理判断数据是否超过了limit则是由shouldProcessMoreRows方法进行判断。简单点说道就是先把数据全部查询到ResultSet然后从ResultSet中取出offset和limit之间的数据这就实现了分页查询。 从两种场景下说明RowBounds的使用 SqlSession使用SqlSession时selectList有一个重载的方法带有RowBounds参数这种情况下DAO层的实现了可以对外界隐藏RowBounds类。如下图Page是自定义的一个接口用于表示分页信息不直接使用RowBounds源于自己的一个习惯不喜欢在Service层中侵入持久层所使用的持久化技术的类或接口。如果在Service中使用了RowBoundsService与MyBatis就耦合了当然如果不要求这一点直接要Service里写RowBounds对象也是可以的。 1.映射接口MyBatis提供了映射接口的形式这种情况下可以不写DAO接口的实现即可完成DAO层这种情况下DAO接口写成ListUser vip(RowBounds page)这种情况下mybatis会完成分页查询。 回到Page接口如果类与接口之间的关系如右类图DAO中的方法还是vip(Page page)而调用的时候工厂返回了一个MyBatisPage类的对象给DAO因为MyBatisPage类继承自RowBounds类所以此时传给DAO的Page对象也是一个RowBounds类的对象但这种情况下却不会有分页查询的效果。 MyBatisPage类相当于一个适配器用于适配Page接口与RowBounds但为何给DAO一个RowBounds对象时却没有实现分页效果原因是MyBatis判断方法的参数中有没有RowBounds参数是在产生接口的代理时而不是在方法调用的时候。根据DefaultSqlSession类的getMapper方法可以很快找到MapperProxyFactory类此类的作用就是创建接口的动态代理所以方法的调用逻辑应该要看代理的InvocationHandler对象它是MapperProxy类这里的处理调用比较深在MapperProxy类中可以发现每一个DAO接口上的方法都会对应一个MapperMethod类的对象MapperMethod类中有一个内部类MethodSignature这是关键的地方每一个MapperMethod对象都依赖于一个MethodSignature对象看看此类的构造器 rowBoundsIndex这个属性是用于记录MapperMthod对应的方法的参数中RowBounds是第几个参数getUniqueParamIndex方法的实现中如果发现没有Rowbounds参数则返回null由此可见如果DAO的方法签名为vip(Page page)则rowBoundsIndex为null所以在调用的时候即使Page接口的实例也是一个RowBounds的实例也不会有分页效果。 如果想要解决这个限制付出的代价有点大。与Spring框架不同的是Spring中类与类之间依赖的是接口而不是具体类。而MyBatis从DefaultSqlSesison到MethodProx全部依赖的是具体类这些类没有接口如果要想解决这个限制需要子类化DefaultSqlSessionConfigurationMapperRegistryMapperProxyFactoryMapperProxyMapperMethod和MethodSignature这些类都没有实现某个可扩展的接口甚至没有实现接口全部是依赖具体的类无法从其中某个点进行扩展。至于MapperProxyFactory它无法替换成其它工厂类它仅仅只是隐藏了接口的代理的创建方式。 RowBounds没有覆盖equals和hashCode方法 如果RowBounds在Service中直接new了则在测试Service时在mock时使用了when这样的方法如when(userDao.vip(rowBounds)).xxx那么就会发生错误因为在Service中也会new一个RowBounds即使Service中new的那个RowBounds和单元测试中的RowBoumds的offset和limit两个数都一样rowBounds.equals(row)也不会返回true当然可以使用when(userDao.vip(anyObject()))。 如何解决这个问题有两种方式一种是RowBounds作为参数传入Service另一种是使用适配器这个适配器很简单写个RowBounds的子类在子类中覆盖hashCodeequals方法在Service中使用新的类。
http://wiki.neutronadmin.com/news/172937/

相关文章:

  • 博客推广那个网站列好做优秀企业网站
  • 资讯类网站源码wordpress 配置ftp
  • 自学网站建设要看什么书农资网络销售平台
  • 玉溪市网站建设如何学习wordpress
  • 微信网站开发用什么语言怎样建设企业网站 用于宣传
  • 网站开发技术岗位职责wordpress 忘记用户名密码破解
  • 咨询网站公司建设计划书如何做某网站的移动客户端开发
  • 信息可视化网站提供免费建网站的网
  • 网站建设的功能特点有哪些网站开发学什么数据库
  • 灵璧做网站的公司安徽省建设安全协会网站
  • 什么是网站开发山西建设工程执业注册中心网站
  • 宣城网站建设公司软件项目流程八个阶段
  • 企业网站开发技术公众号开发教程零基础
  • 动易网站系统qq空间个人网站
  • 东莞市做网站的公司哪家好企业建站程序哪个好
  • 永泰县住房和城乡建设局网站做源码网站赚钱吗
  • 网页设计与网站建设课程设计h5动态页面怎么做的
  • c2c网站类型祁阳县住房和城乡规划建设局网站
  • 做男装比较好的网站有哪些做货代在哪些网站能找到客户
  • 网站编辑的工作职能有哪些大邯郸网站
  • 那个网站可以兼职做效果图wordpress 自建主题
  • 网站建设参考网站的说明三亚发布最新消息
  • 新吴区网站建设温州网站设计力推亿企帮
  • 高密哪里做网站好网站后台别人制作
  • an网站建设网站建设方案 市场分析
  • 做设计做网站义乌专业做网站的
  • 各网站收录做淘宝首页初学ps视频网站
  • 我们做网站 老公弟弟也跟着做怎么找网红合作卖东西
  • 昭通做网站公司阿里云服务器建立网站吗
  • 做视频网站用什么格式大英做网站