mybatis动态sql

mybatis中静态sql语句有时不足以满足用户的需求,因此其提供了动态sql标签。

IF标签

if标签通过条件测试,动态插入sql片段,例如:

<select id="searchCourses" parameterType="hashmap" resultMap="CourseResult">

<![CDATA[
select * from courses where tutor_id=#{tutorId}
<if test="courseName!=null">
    and name like #{courseName}
</if>
<if test="startDate!=null">
    and start_date>=#{startDate}
</if>
<if test="endDate!=null">
    and end_start<=#{endDate}
</if>
]]>

</select>

<![CDATE[ ]]>保证之间的内容作为一般的字符处理,不做特殊处理。

choose标签

choose标签用于选择第一个选择条件,例如:
<select id="searchCourses" parameterType="hashmap" resultMap="CourseResult">
    select * from courses
    <choose>
        <when test="searchBy=='Tutor'">
            where tutor_id=#{tutorId}
        </when>
        <when test="searchBy=='CourseName'">
            where name like #{CourseName}
        </when>
        <otherwise>
         where start_date=now();
        </otherwise>
    </choose>
</select>

where标签

有时,所有的查询条件可能都是可选的,但是其中至少有一个查询是需要的,但是若有多个查询条件都满足条件,这时就需要在查询条件添加and 或or。mybatis提供了where标签用于支持建立这种类型的sql语句,当第一个满足的条件前面有and 或 or 等连接词时,会自动删除连接词。例子如下所示:
<select id="searchCourses" parameterType="hashmap" resultMap="CourseResult">
  select * from courses
  <where>
   <if test="tutorId!=null">
        tutor_id=#{tutorId}
   </if>
   <if test="courseName!=null">
       and name like #{courseName}
   </if>
   <if test="startDate!=null">
       and start_date=#{startDate}
   </if>
   <if test="endDate !=null">
      and end_date=#{endDate}
   </if>
  </where>
</select>

trim标签

trim标签比where标签更加灵活,因为它可以在条件前面加上连接词或删除连接词 也可以在条件后面加上连接词或删除连接词;举例如下:
<select id="searchCourses" parameterType="hashmap" resultMap="CourseResult">
  select * from courses
  <trim prefix="where" prefixOverrides="and | or" >
   <if test="tutorId!=null">
        tutor_id=#{tutorId}
   </if>
   <if test="courseName!=null">
       and name like #{courseName}
   </if>
   <if test="startDate!=null">
       and start_date=#{startDate}
   </if>
   <if test="endDate !=null">
      and end_date=#{endDate}
   </if>
  </trim>
</select>

foreach标签

foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名.
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.
open表示该语句以什么开始.
separator表示在每次进行迭代之间以什么符号作为分隔 符.
close表示以什么结束.
举例如下:
<select id="searchCourse" parameterType="hashMap" resultMap="Course">
    select * from courses
    <if test="tutorIds!=null">
        <where>
            <foreach item="tutorId" collection="tutorIds" >
                or tutor_id=#{tutorId}
            </foreah>
        </where>
    </if>
</select>

<select id="searchCourse" parameterType="hashMap" resultMap="Course">
    select * from courses
    <if test="tutorIds!=null">
        <where>
             tutor_id in
            <foreach item="tutorId" collection="tutorIds" open="(" separator="," close=")">
                #{tutorId}
            </foreah >
        </where>
    </if>
</select>

set标签

set标签类似于where标签,会在返回的条件前面插入set关键字,并移除最后一个条件的后面符号,举例如下所示:
<update id="updateStudent" parameterType="Student">
  update students 
  <set>
      <if test="name!=null"> name=#{name},</if>
      <if test="email!=null">email=#{email},</if>
      <if test="phone!=null">phone=#{phone},</if>
  </set>
</update>

如果三个条件都是ture,phone后面的逗号将被移除。

枚举类型

mybatis提供了提供了持久化的枚举类型。假设 Student表结构的gender列,使用varchar类型存储MALE或FEMALE,Student对象使用枚举类型标识gender.
public enum Gender{
    FEMALE,MALE
}

public class Student
{
    ....
    private Gender gender;
    ....
}
<insert id="insert" parameterType="Student">
    insert into student (id,name,gender)
    values(#{id},#{name},#{gender})
</insert>
当执行insert语句时,MALE或FEMALE会存储到gender列,如果想要存储的时枚举值而不是枚举名字,就需要配置类型处理器:
<typeHander handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.mybatis3.domain.Gender">

CLOB和BLOB

mybatis提供了对clob和blob的内检支持,将clob映射为java.lang.String,将blob映射为byte[]数组。因此用户可以像原始类型那样处理clob和blob类型。

传递多个参数

mybatis提供了传递多个参数的内建功能,并通过#{param}语法引用参数。举例如下:

List<Student> findAllStudentByNameEmail(String name,String email);

<select id="findAllStudentByNameEmail" resultMap="Student">
    select * from students where name=#{param1} and email=#{param2}
</select>

将多行数据存储到map中,并以某个列值作为key

要完成上述功能,需要使用sqlSession的selectMap方法;
举例如下:

<select id="findAllStudent" resultMap="Student">
    select * from students 
</select>

Map<Integer,Student> studentMap=sqlSession.selectMap("com.mybatis3.mappers.StudentMapper.findAllStudent","studId");

相关推荐