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");
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。