美文网首页
MyBatis分页和动态标签

MyBatis分页和动态标签

作者: Mr_J316 | 来源:发表于2019-06-18 14:46 被阅读0次

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>

相关文章

网友评论

      本文标题:MyBatis分页和动态标签

      本文链接:https://www.haomeiwen.com/subject/zdsfqctx.html