[mybatis]mybatis动态sql的标签使用详解
动态sql
根据不同的环境生成不同的sql
-
if
-
choose (when, otherwise)
-
trim (where, set)
-
foreach
if
- 使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。
如果传入name就根据name查询,如果输入age就根据age查询,如果不输入就全部查询。
这里还使用了一对标签
主要作用是在判断条件时自动去掉一个或多个end,确保程序正常运行!
<select id="getPerpleByIf" parameterType="Map" resultType="pojo.perple">
select * from perple
<where>
<if test="name!=null" >
name=#{name}
</if>
<if test="age!=null">
and age=#{age}
</if>
</where>
@Test
public void test(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
prepleMapper mapper = sqlSession.getMapper(prepleMapper.class);
Map map= new HashMap();
// map.put("name","tata");
map.put("age","18");
List<perple> perpleByIf = mapper.getPerpleByIf(map);
for(perple perple:perpleByIf){
System.out.println(perple);
}
}
}
choose、when、otherwise
不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
<select id="getPerpleByChoose" parameterType="Map" resultType="pojo.perple">
select * from perple
<where>
<choose>
<when test="name!=null">
name=#{name}
</when>
<when test="age!=null">
age=#{age}
</when>
<otherwise>
birth=#{birth}
</otherwise>
</choose>
</where>
</select>
@Test
public void test1(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
prepleMapper mapper = sqlSession.getMapper(prepleMapper.class);
Map map= new HashMap();
// map.put("name","tata");
map.put("age",13);
map.put("birth","2022-1");
List<perple> perpleByChoose = mapper.getPerpleByChoose(map);
for(perple perple:perpleByChoose){
System.out.println(perple);
}
}
trim、where、set
set跟where标签作用相似,是为了在修改的时候根据传递的参数去掉多余的逗号!
<update id="updateSet" parameterType="Map">
update perple
<set>
<if test="id!=null">
id=#{id},
</if>
<if test="name!=null">
name=#{name},
</if>
<if test="age!=null">
age=#{age} ,
</if>
<if test="birth!=null">
birth=#{birth},
</if>
</set> where id=#{id}
</update>
@Test
public void test2(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
prepleMapper mapper = sqlSession.getMapper(prepleMapper.class);
Map map= new HashMap();
// map.put("name","tata");
map.put("age",22);
map.put("id",3);
// map.put("birth","2022-1");
mapper.updateSet(map);
sqlSession.commit();
}
sql脚本抽取公共部分进行复用
1.使用sql标签进行抽取
<sql id="if">
<if test="name!=null">
name=#{name}
</if>
<if test="age!=null">
and age=#{age}
</if>
</sql>
2.使用include插入
<select id="getPerple" parameterType="String" resultType="perple">
select * from perple
<where>
<include refid="if"></include>
</where>
</select>
foreach
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。
sql语句
<select id="getPerpleByForeach" parameterType="Map" resultType="pojo.perple">
select * from perple
<where>
<foreach collection="ids" item="id" open="and (" close= ")" separator="or">
id=#{id}
</foreach>
</where>
</select>
测试类
@Test
public void test3(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
prepleMapper mapper = sqlSession.getMapper(prepleMapper.class);
Map map= new HashMap();
ArrayList<Integer> ids = new ArrayList<Integer>();
ids.add(2);
ids.add(3);
map.put("ids",ids);
List<perple> foreach = mapper.getPerpleByForeach(map);
for(perple f:foreach){
System.out.println(f);
}
}
动态sql测试的所有接口方法
//通过if语句的查询
List<perple> getPerpleByIf(Map map);
//通过choose语句的查询
List<perple> getPerpleByChoose(Map map);
//通过set标签更新
int updateSet(Map map);
//通过foreach查询123号
List<perple> getPerpleByForeach(Map map);