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");
相关推荐
xiuyangsong 2020-07-26
Dullonjiang 2020-07-19
专注前端开发 2020-10-21
苏康申 2020-11-13
vitasfly 2020-11-12
oraclemch 2020-11-06
liuyang000 2020-09-25
FellowYourHeart 2020-10-05
赵继业 2020-08-17
whyname 2020-08-16
Seandba 2020-08-16
dbasunny 2020-08-16
拼命工作好好玩 2020-08-15
langyue 2020-08-15
写程序的赵童鞋 2020-08-03
Accpcjg 2020-08-02