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

5 篇文章 0 订阅
3 篇文章 0 订阅

动态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<T>

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

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

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

三、 foreach的使用

效果展示

 

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

public class IuserVo  extends  User{

   private List userIds;


    public IuserVo(List userIds) {
        this.userIds = userIds;
    }

    public IuserVo(Integer id, String name, String loginName, String pwd, Integer rid, List userIds) {
        super(id, name, loginName, pwd, rid);
        this.userIds = userIds;
    }

    public IuserVo(String name, String loginName, String pwd, Integer rid, List userIds) {
        super(name, loginName, pwd, rid);
        this.userIds = userIds;
    }

    public IuserVo() {

    }

    public List getUserIds() {
        return userIds;
    }

    public void setUserIds(List userIds) {
        this.userIds = userIds;
    }

    @Override
    public String toString() {
        return "IuserVo{" +
                "userIds=" + userIds +
                '}';
    }
}

foreach配置文件 

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

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

   /**
     * 使用resultType返回单个对象
     * @param IuserVo   用于处理多参数的集合
     * @return
     */
    List<User> list3(IuserVo IuserVo);

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

 /**
     * 使用resultType返回单个对象
     * @param IuserVo   用于处理多参数的集合
     * @return
     */
    List<User> list3(IuserVo IuserVo);
   /**
     * 使用resultType返回单个对象
     * @return
     */
    @Override
    public List<User> list3(IuserVo iuserVo) {
        return iusermapper.list3(iuserVo);
    }

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

  @Test
    public void list3() {
        List list=new ArrayList<>();
        list.add("10");
        IuserVo u=new IuserVo();
        u.setUserIds(list);
        System.out.println(userserviceimpl.list3(u));
    }

 

案例list与list2的区别:

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

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

 

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

   <resultMap id="BaseResultMap" type="com.zking.mybatis.model.User" >
        <constructor >
            <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
            <arg column="name" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="loginName" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="pwd" jdbcType="VARCHAR" javaType="java.lang.String" />
            <arg column="rid" jdbcType="INTEGER" javaType="java.lang.Integer" />
        </constructor>
    </resultMap>

效果展示

                                                list2运行结果 

 

                                                list1运行结果 

 

 mapper层

   /**
     * 使用resultMap返回自定义类型集合
     * @return
     */
    List<User> list1();

    /**
     * * 使用resultType返回指定集合
     * @return
     */
    List<User> list2();

 service层

   /**
     * 使用resultMap返回自定义类型集合
     * @return
     */
    List<User> list1();

    /**
     * * 使用resultType返回指定集合
     * @return
     */
    List<User> list2();
  /**
     * 使用resultMap返回自定义类型集合
     *
     * @return
     */
    @Override
    public List<User> list1() {
        return iusermapper.list1();
    }

    /**
     * * 使用resultType返回指定集合
     *
     * @return
     */
    @Override
    public List<User> list2() {
        return iusermapper.list2();
    }

Test测试 

    @Test
    public void list1() {
       userserviceimpl.list1().forEach(System.out::println);
    }

    @Test
    public void list2() {
        userserviceimpl.list2().forEach(System.out::println);
    }

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

三、后台分页实现

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

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

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

<plugins>
    <!-- 分页插件 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">    
    </plugin>
</plugins>

mapper层

 /**
     * 分页
     * @param u 需要的实体
     * @return
     */
    List<User> queryPage(User u);

service层

   /**
     * 分页
     * @param u
     * @param pagebean
     * @return
     */
    List<User> queryPage(User u, PageBean pagebean);

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

    /**
     * 分页
     * @param u
     * @param pagebean
     * @return
     */
    @Override
    public List<User> queryPage(User u, PageBean pagebean) {
        if (pagebean != null && pagebean.isPagination()) {
            PageHelper.startPage(pagebean.getPage(), pagebean.getRows());
        }

        List<User> list = iusermapper.queryPage(u);

        if (pagebean != null && pagebean.isPagination()) {
            PageInfo info = new PageInfo(list);
            pagebean.setTotal(Long.valueOf(info.getTotal()).intValue());
        }
        return list;
    }

效果展示:

分页实现的sql语句

 查询结果如下

 Test测试

 @Test
    public void queryPage(){
    User u=new User();
    PageBean pageBean = new PageBean();
    pageBean.setRows(4);
    List<User> list = userserviceimpl.queryPage(u, pageBean);
    list.forEach(t-> System.out.println(t));
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值