动态sql:
注意这里是传入一个对象 根据对象的属性有无值来传入对于的值
<mapper namespace="dao.TeacherMapperDynamicSQL">
<resultMap type="entity.Teacher" id="Teacher">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="gender" property="teacher_gender"/>
resultMap>
<select id="getTeachersByIf" resultMap="Teacher">
SELECT * FROM teachers where
<if test="id!=null">id=#{id}if>
<if test="name!=null&&name.trim()!=''">AND name=#{name}if>
<if test="teacher_gender==0 or teacher_gender==1">AND gender=#{teacher_gender}if>
select>
mapper>
注意:
如果第一个id没有传入,那就会有 where and xx语法错误 。
可以再where后面加上1=1 以后的条件都and xx即可
还有一种方式使用·where标签·
<select id="getTeachersByIf" resultMap="Teacher">
SELECT * FROM teachers
<where>
<if test="id!=null">id=#{id}if>
<if test="name!=null&&name.trim()!=''">AND name=#{name}if>
<if test="teacher_gender==0 or teacher_gender==1">AND gender=#{teacher_gender}if>where>
select>
注意:
where标签只会处理第一个多出来的and或者or 也没法解决and拼在后面的
所以使用where的时候 and 要写在第一位
后面多出的and或者or where标签不能解决
还有一个解决方案就是 trim截取标签.
prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
prefix给拼串后的整个字符串加一个前缀
prefixOverrides="":
前缀覆盖: 去掉整个字符串前面多余的字符
suffix="":后缀
suffix给拼串后的整个字符串加一个后缀
suffixOverrides=""
后缀覆盖:去掉整个字符串后面多余的字符
<select id="getTeachersByIf" resultMap="Teacher">
SELECT * FROM teachers
<trim prefix="where" suffixOverrides="and">
<if test="id!=null">id=#{id} AND if>
<if test="name!=null&&name.trim()!=''">name=#{name} ANDif>
<if test="teacher_gender==0 or teacher_gender==1"> gender=#{teacher_gender} andif>trim>
select>
前面都是if配合其他的标签
实现 带了什么属性 就将他们统一拼起来 查询同时满足
是分支选择:
switch-case
如果带了id就用id查 如果带了 其他属性就用其他属性查
特点:只取一个属性来查询
<select id="getTeachersByIf" resultMap="Teacher">
SELECT * FROM teachers
<where>
<when test="id!=null">
id=#{id}
when>
<when test="name!=null&&name.trim()!=''">
name=#{name}
when>
<when test="teacher_gender==0 or teacher_gender==1">
gender=#{teacher_gender}
when>
where>
select>
一般都是要用where这样比较结构好看
如果传入多个 那就只取最前面那个
如果都不传入 那就取
要实现修改呢? 传入什么属性 就修改什么属性
有两个方法
1. trim()方法
2. set
suffixOverrides="," 指定两个参数之间的连接符
id="updateTeachers">
UPDATE teachers
"set" suffixOverrides=",">
<if test="name!=null&&name.trim()!=''">
name=#{name},
if>
<if test="teacher_gender==0 or teacher_gender==1">
gender=#{teacher_gender},
if>
<where>id=#{id}
注意 这个时候 name=#{name}之类的 后面必须加, 不然 就报错
id="updateTeachers">
UPDATE teachers
<set>
<if test="name!=null&&name.trim()!=''">
name=#{name},
if>
<if test="teacher_gender==0 or teacher_gender==1">
gender=#{teacher_gender},
if>
set>
<where>id=#{id}
collection:指定要遍历的集合。
list类型的参数会特殊处理封装在map中,map的key就叫list
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引。遍历list的时候是index就是索引,item就是当前值
遍历map的时候index表示的就是map的key,item就是map的值
#{变量名}就能取出变量的值也就是当前遍历出的元素
//接口,这一步需要给她取别名 不取就报错
public List getTeachersByForeach(@Param("m")List numb);
//映射文件
<select id="getTeachersByForeach" resultMap="Teacher">
select * FROM teachers
<foreach collection="m" item="item_id" open="where id in(" close=")" separator=",">
#{item_id}
foreach>
select>
//测试
List teachers = findTeacher.getTeachersByForeach(Arrays.asList(2,3,4));
foreach标签实现批量插入:
//接口
public void insertTeachers(@Param("list")List list);
//映射文件
"insertTeachers">
insert into teachers(name,gender,school_id) values
<foreach collection="list" item="item" separator=",">
(#{item.name},#{item.teacher_gender},#{item.student.id})
foreach>
list.add(new Teacher(null,"aa","1"));
list.add(new Teacher(null,"bb","0"));
findTeacher.insertTeachers(list);
sqlSession.commit();
注意:
同样是list list对象可以不用@Param 而list integer类型需要
传入对象#{属性名} 传入对象集合foreach标签#{对象.属性名}