MyBatis分页和动态标签

MyBatis分页

内存分页

MyBatis提供了RowBounds类实现内存分页功能。其原理是首先根据sql语句查询出全部结果集,然后再根据RowBounds对象设置的参数截取子结果集返回。因此只适用于数据量较小的环境。

使用步骤:
在Dao接口定义分页查询方法,传入RowBounds对象参数

public List<User> selectAll(RowBounds rowBounds);

在sql语句中不用对rowBounds任何操作。mybatis的拦截器自动操作rowBounds进行分页。

调用方法,获取查询结果

List<User> users = userDao.selectAll(new RowBounds(0,3));

第1个参数为起始索引,第2个参数为返回记录数

物理分页

在Dao接口定义分页查询方法

public List<User> selectAll(int offset, int limit);

编写分页查询语句

<select id="selectAll" parameterType="int" resultType="User">
    SELECT * FROM
    (
       SELECT ROWNUM AS NO,T1.* FROM 
       (
           SELECT * FROM USERS ORDER BY ID
       )T1
    )T2
    WHERE NO>=${param1} AND ${param1} + ${param2} > NO   
</select>

MyBatis动态标签

if标签

<select id="selectBy" parameterType="com.model.UserQuery" 
        resultType="User">
    SELECT * FROM USERS WHERE 1=1
    <if test="name!=null">
        AND NAME LIKE '%'||#{name}||'%'
    </if>
    <if test="minAge!=null">
        AND AGE >= ${minAge}
    </if>
    <if test="maxAge!=null">
        AND ${maxAge}>=AGE
    </if>
</select>

trim标签

​ trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀;可以把包含内容的首部或尾部某些内容覆盖,即忽略

trim标签主要属性:

  • prefix:增加前缀
  • suffix:增加后缀
  • prefixOverrides:前部覆盖
  • suffixOverrides:尾部覆盖
<insert id="insert" parameterType="User" >
    INSERT INTO  USERS
    <trim prefix="(" suffix=")" suffixOverrides="," >
        <if test="id != null" >ID,</if>
        <if test="name != null" >NAME,</if>
        <if test="age != null" >AGE,</if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
        <if test="id != null" >#{id},</if>
        <if test="name != null" >#{name},</if>
        <if test="age != null" >${age},</if>
    </trim>
</insert>

choose标签

<choose>
    <when test="条件1">
        语句1
    </when>
    <when test="条件2">
        语句2      
    </when>
    <otherwise>
        语句3
    </otherwise>
</choose>

where标签

当where元素内部至少有一个if满足时,则会生成where语句插入sql。并且sql语句开头的AND或OR会自动删除。

<select id="selectBy" parameterType="com.model.UserQuery"  
        resultType="User">
    SELECT * FROM USERS
    <where>
        <if test="name!=null">
            NAME LIKE '%'||#{name}||'%'
        </if>
        <if test="minAge!=null">
            AND AGE >= ${minAge}
        </if>
        <if test="maxAge!=null">
            AND ${maxAge} >= AGE
        </if>
    </where>
</select>

foreach标签

<foreach item="" index="" collection="list|array|map" open="" separator="" close="">        
</foreach>

属性说明:

  • item:循环遍历对象。支持属性的点路径访问,如item.age,item.info.details。在list和数组中是其中的元素,在map中是value。该参数为必选。
  • index:在list和数组中,index是元素的索引,在map中,index是元素的key,该参数可选。
  • collection: 被遍历的对象类型,List<?>对象用list表示,数组用array表示,Map对象用map表示。
  • open: foreach开始时的符号,一般是"(",和close=")"合用。该参数可选。
  • separator: 被遍历元素之间的分隔符,例如在in子句中separator","会自动在元素中间用", "隔开,如in(1,2)。
  • close: foreach的关闭符号,一般是")",和open="("合用。该参数可选。
<select id="selectBy"  resultType="User">
    SELECT * FROM USERS WHERE ID IN
    <foreach item="item" index="i" collection="array" open="(" separator="," close=")">
         #{item}
    </foreach>
</select>

set标签

set元素用于update语句,可以动态的配置SET关键字,同时剔除追加到条件末尾的任何不相关的逗号

<update id="update" parameterType="User">
    UPDATE USERS
    <set>
        <if test="name!= null">NAME=#{name},</if>
        <if test="age!= null">AGE=${age}</if>
    </set>
    WHERE ID=#{id}
</update>

bind标签

bind标签用于模糊查询,实现sql查询参数拼接。

<select id="selectByName" parameterType="String" 
        resultType="User">
    <bind name="param_name" value="'%'+name+'%' " />
    SELECT * FROM USERS WHERE NAME=#{param_name}
</select>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,571评论 0 4
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    梦殇_fccd阅读 994评论 0 5
  • MyBatis 动态SQL 内容 Mybatis动态SQL在XML中支持的几种标签: if chose trim、...
    lihongyan阅读 8,395评论 1 10
  • 1、#{}和${}的区别是什么?注:这道题是面试官面试我同事的。 答:${}是Properties文件中的变量占位...
    小沙鹰168阅读 2,236评论 2 64
  • 使用MyBatis实现条件查询 1.SQL映射文件: MyBatis真正的强大之处就在于SQL映射语句,MyBat...
    Java小生阅读 1,826评论 0 0