• mybatis的分页&&查询返回结果集的处理


    动态sql简述

    mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类:

    • if 语句 (简单的条件判断)
    • choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似
    • trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
    • where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
    • set (主要用于更新时)
    • foreach (在实现 mybatis in 语句查询时特别有用)

     一、choose代码实现

    二、查询返回结果集的处理

    resultMap:适合使用返回值是自定义实体类的情况

    resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型

    3.1 使用resultMap返回自定义类型集合

    3.2 使用resultType返回List

    3.3 使用resultType返回单个对象(foreach)

    3.4 使用resultType返回List,适用于多表查询返回结果集

    3.5 使用resultType返回Map,适用于多表查询返回单个结果集

    三、 foreach的使用

    效果展示

     

    创建IuserVo,作用:为了储存集合数据

    1. public class IuserVo extends User{
    2. private List userIds;
    3. public IuserVo(List userIds) {
    4. this.userIds = userIds;
    5. }
    6. public IuserVo(Integer id, String name, String loginName, String pwd, Integer rid, List userIds) {
    7. super(id, name, loginName, pwd, rid);
    8. this.userIds = userIds;
    9. }
    10. public IuserVo(String name, String loginName, String pwd, Integer rid, List userIds) {
    11. super(name, loginName, pwd, rid);
    12. this.userIds = userIds;
    13. }
    14. public IuserVo() {
    15. }
    16. public List getUserIds() {
    17. return userIds;
    18. }
    19. public void setUserIds(List userIds) {
    20. this.userIds = userIds;
    21. }
    22. @Override
    23. public String toString() {
    24. return "IuserVo{" +
    25. "userIds=" + userIds +
    26. '}';
    27. }
    28. }

    foreach配置文件 

    1. <select id="list3" resultType="com.zking.mybatis.model.User" parameterType="com.zking.mybatis.model.IuserVo">
    2. select id,name,loginName,pwd,rid from t_oa_user where id in
    3. <foreach collection="userIds" open="(" close=")" item="id">
    4. #{id}
    5. foreach>
    6. select>

     mapper层(需要修改参数类型)

    1. /**
    2. * 使用resultType返回单个对象
    3. * @param IuserVo 用于处理多参数的集合
    4. * @return
    5. */
    6. List list3(IuserVo IuserVo);

    service层(需要修改参数类型)

    1. /**
    2. * 使用resultType返回单个对象
    3. * @param IuserVo 用于处理多参数的集合
    4. * @return
    5. */
    6. List list3(IuserVo IuserVo);
    1. /**
    2. * 使用resultType返回单个对象
    3. * @return
    4. */
    5. @Override
    6. public List list3(IuserVo iuserVo) {
    7. return iusermapper.list3(iuserVo);
    8. }

    Test测试:使用resultType返回单个对象

    1. @Test
    2. public void list3() {
    3. List list=new ArrayList<>();
    4. list.add("10");
    5. IuserVo u=new IuserVo();
    6. u.setUserIds(list);
    7. System.out.println(userserviceimpl.list3(u));
    8. }

     

    案例list与list2的区别:

    list1返回的resultMap返回自定义类型集合

    list2返回的resultType返回list类型集合

     

    定义一个BaseResultMap,为了实现自定义类型集合

    1. <resultMap id="BaseResultMap" type="com.zking.mybatis.model.User" >
    2. <constructor >
    3. <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
    4. <arg column="name" jdbcType="VARCHAR" javaType="java.lang.String" />
    5. <arg column="loginName" jdbcType="VARCHAR" javaType="java.lang.String" />
    6. <arg column="pwd" jdbcType="VARCHAR" javaType="java.lang.String" />
    7. <arg column="rid" jdbcType="INTEGER" javaType="java.lang.Integer" />
    8. constructor>
    9. resultMap>

    效果展示

                                                    list2运行结果 

     

                                                    list1运行结果 

     

     mapper层

    1. /**
    2. * 使用resultMap返回自定义类型集合
    3. * @return
    4. */
    5. List list1();
    6. /**
    7. * * 使用resultType返回指定集合
    8. * @return
    9. */
    10. List list2();

     service层

    1. /**
    2. * 使用resultMap返回自定义类型集合
    3. * @return
    4. */
    5. List list1();
    6. /**
    7. * * 使用resultType返回指定集合
    8. * @return
    9. */
    10. List list2();
    1. /**
    2. * 使用resultMap返回自定义类型集合
    3. *
    4. * @return
    5. */
    6. @Override
    7. public List list1() {
    8. return iusermapper.list1();
    9. }
    10. /**
    11. * * 使用resultType返回指定集合
    12. *
    13. * @return
    14. */
    15. @Override
    16. public List list2() {
    17. return iusermapper.list2();
    18. }

    Test测试 

    1. @Test
    2. public void list1() {
    3. userserviceimpl.list1().forEach(System.out::println);
    4. }
    5. @Test
    6. public void list2() {
    7. userserviceimpl.list2().forEach(System.out::println);
    8. }

     总结:resultMap与resultType都能实现查询

    三、后台分页实现

    在大数据量查询时,往往需要数据库端分页,mybatis的分页功能是基于内存的,可以使用pagehelper来实现后端分页。
    1) 导入依赖的包

    1. <dependency>
    2. <groupId>com.github.pagehelpergroupId>
    3. <artifactId>pagehelperartifactId>
    4. <version>5.1.2version>
    5. dependency>

    2)将插件配置到mybatis.cfg.xml 中(Mybatis.cfg.xml配置拦截器)

    1. <plugins>
    2. <plugin interceptor="com.github.pagehelper.PageInterceptor">   
    3. plugin>
    4. plugins>

    mapper层

    1. /**
    2. * 分页
    3. * @param u 需要的实体
    4. * @return
    5. */
    6. List queryPage(User u);

    service层

    1. /**
    2. * 分页
    3. * @param u
    4. * @param pagebean
    5. * @return
    6. */
    7. List queryPage(User u, PageBean pagebean);

     Total需要转换因为它是long类型,必须转换为String类型

    1. /**
    2. * 分页
    3. * @param u
    4. * @param pagebean
    5. * @return
    6. */
    7. @Override
    8. public List queryPage(User u, PageBean pagebean) {
    9. if (pagebean != null && pagebean.isPagination()) {
    10. PageHelper.startPage(pagebean.getPage(), pagebean.getRows());
    11. }
    12. List list = iusermapper.queryPage(u);
    13. if (pagebean != null && pagebean.isPagination()) {
    14. PageInfo info = new PageInfo(list);
    15. pagebean.setTotal(Long.valueOf(info.getTotal()).intValue());
    16. }
    17. return list;
    18. }

    效果展示:

    分页实现的sql语句

     查询结果如下

     Test测试

    1. @Test
    2. public void queryPage(){
    3. User u=new User();
    4. PageBean pageBean = new PageBean();
    5. pageBean.setRows(4);
    6. List list = userserviceimpl.queryPage(u, pageBean);
    7. list.forEach(t-> System.out.println(t));
    8. }

     

  • 相关阅读:
    四、【React-Router6】高亮 NavLink
    8.1 矢量图层符号化整体说明
    又一个千亿市场,冰淇淋也成了创新试验田
    通信行业专业术语
    Redis入门完整教程:客户端通信协议
    C++ 【new,delete内存管理】
    真全!阿里最新Redis全栈小册涵盖了所有操作
    用HTML、CSS技术设计的个人网页与实现制作(web前端期末大作业)
    【Giflow】什么是Giflow、常用分支、典型图例、指令示例
    服务端修改Cookie——跨域cookie发送机——通信加密——异或加密
  • 原文地址:https://blog.csdn.net/Bugxiu_fu/article/details/126531149