13mybatis动态SQL

动态语句 if
BookMapper.java 映射接口
public interface BookMapper {

public List<Book> query();
public List<Book> query(Map<String,Object> map);
}

BookMapper.xml 映射配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fz.mapper.BookMapper">
<resultMap id="bookmap" type="book">
<id column="book_id" property="id"/>
<result property="name" column="book_name"/>
<result property="price" column="book_price"/>
</resultMap>

<select id="query" resultMap="bookmap">
select * from book where 1=1
<if test="name!=null">
and book_name like #{name}
</if>
<if test="price!=null">
and book_price = #{price}
</if>
</select>
</mapper>

null和“”

test = "price != null"
test = ‘price == ""‘
if test="#{}"条件可以随便写
把<if test="takeWay == ‘1‘ and workday != null "> 错误

改为<if test=‘takeWay == "1" and workday != null ‘> 正确
或改为<if test="takeWay == ‘1‘.toString() and workday != null ">即可。 正确

test = ‘"java".equals(name)‘

原因是:mybatis是用OGNL表达式来解析的,在OGNL的表达式中,’1’会被解析成字符,java是强类型的,char 和 一个string 会导致不等,所以if标签中的sql不会被解析。
总结下使用方法:单个的字符要写到双引号里面或者使用.toString()才行!

select * from student where name = ‘张三‘;
select * from student where name like ‘%张三%‘;

<if test=‘name!=null and name.indexOf("java")!=-1‘>
where book_name like #{name}
</if>

<select id="query" statementType="PREPARED" parameterType="map" resultMap="mp">
select * from book where 1=1
<if test=‘"《java开发》".equals(name)‘>
and book_name = #{name}
</if>
<if test=‘name!=null and name.indexOf("java")!=-1‘>
and book_name like #{name}
</if>
</select>

程序代码
Map<String,Object> m = new HashMap<String,Object>();
m.put("name","%java%");
List<Book> bks = bdao.query(m);
System.out.println(bks.size());
for(Book b : bks){
System.out.println(b.getName());
}
bks = bdao.query();
System.out.println(bks.size());
for(Book b : bks){
System.out.println(b.getName());
}

m.put("price",28);
//m.remove("name");
bks = bdao.query(m);
System.out.println(bks.size());
for(Book b : bks){
System.out.println(b.getName());
}

Map<String,Object> m = new HashMap<String,Object>();
map.put("name","%李%");
map.put("age",18);

Map<String,Object> m = new HashMap<String,Object>();
m.put("name","赵六");
//m.put("age",18);
List<Student> sts = sm.search(m);
System.out.println(sts.size());

动态语句 choose, when, otherwise
相当于 java switch 语句
更像
if(){
}elseif()
}else{
}elseif(){
}else{
}
choose when otherwise 条件

<select id="" parameterType="Map" resultType="student">
select * from student
<choose>
<when test="name==‘李四‘">
where name = #{name}
</when>
<when test="age==18">
where age>18
</when>
<otherwise>
where 1=1
</otherwise>

</choose>

</select>

<select id="query" statementType="PREPARED" parameterType="map" resultMap="mp">
select * from book where 1=1
<choose>
<when test="name==‘php‘">
and book_name like #{name}
</when>

<when test="price>20">
and book_price>=20
</when>
<otherwise>
and book_price>50
</otherwise>
</choose>
</select>

where 条件 自动添加where 条件
<select id="" parameterType="Map" resultType="student">
select * from student
<where>
<if test="">
age=18
</if>
<if test="">
and name = #{name}
</if>
</where>

</select>

动态SQL语句 trim, where, set

trim条件 自动加where 自动取掉and 或 or关键字

where
<select id="query" statementType="PREPARED" parameterType="map" resultMap="mp">
select * from book
<where>
<if test="name!=null">
or book_name=#{name}
</if>
<if test="price!=null">
or book_price > #{price}
</if>
</where>

</select>

set 会自动去掉,
<update id="update" parameterType="map">
update book
<set>
<if test="name!=null">book_name=#{name},</if>
<if test="price!=null">book_price=#{price},</if>
</set>
<where>
<if test="id!=null">
and book_id = #{id}
</if>
<if test="name!=null">
and book_name = #{name}
</if>
</where>
</update>

trim
<trim prefix="SET" suffixOverrides=","></trim> 相当于<set>
<set>

</set>

<trim prefix="where" prefixOverrides="and|or"></trim> 相当于<where>
<where>

</where>

<update id="update" parameterType="map">
update book

<trim prefix="set" suffixOverrides=",">
<if test="name!=null">book_name=#{name},</if>
<if test="price!=null">book_price=#{price},</if>
</trim>

<trim prefix="where" prefixOverrides="and|or">
<if test="id!=null">
and book_id = #{id}
</if>
<if test="name!=null">
and book_name = #{name}
</if>
</trim>
</update>

<select id="" parameterType="Map" resultType="student">
select * from student
<trim>
<if test="">
age=18
</if>
<if test="">
and name = #{name}
</if>
</trim>

</select>

动态SQL语句 foreach

foreach循环
<select>
select * from db_student
<if test="ids!=null">
<where>
id in
<foreach item="id" collection="ids" separator="," open="(" close=")">
#{id}
</foreach>
</where>
</if>
</select>

<select id="search" parameterType="Map" resultType="student">
select * from db_student
<if test="ids!=null">
<where>
id in
<foreach item="id" collection="ids" separator="," open="(" close=")">
#{id}
</foreach>
</where>
</if>
</select>

<select id="queryin" statementType="PREPARED" parameterType="map" resultMap="mp">
select * from book
<where>
<if test="ids!=null">
book_id in
<foreach item="abc" collection="ids" open="(" separator="," close=")">
#{abc}
</foreach>
</if>
</where>
</select>

<delete id="delete" statementType="PREPARED" parameterType="map">
delete from book
<where>
<if test="ids!=null">
and book_id in
<foreach item="abc" collection="ids" open="(" separator="," close=")">
#{abc}
</foreach>
</if>
<if test="id!=null">
and book_id = #{id}
</if>
</where>
</delete>

Map<String,Object> m = new HashMap<String,Object>();
List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(5);
list.add(6);
m.put("ids",list);
m.put("ids",new int[]{3,4});
List<Student> sts = sm.search(m);
System.out.println(sts.size());

set 条件 用于修改语句
自动添加set 关键字,自动去除最后的逗号 ,
<update id="" parameterType="student">
update db_student
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="age!=null">
age=#{age},
</if>

</set>
where id=#{id}
</update>

时间: 2024-10-20 19:47:53

13mybatis动态SQL的相关文章

MyBatis4:动态SQL

什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的省略逗号,动态SQL可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用JSTL或其它相似的基于XML的文本处理器相似,在MyBatis之前的版本中,有很多元素需

MyBatis动态SQL小结

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: 等线 } .MsoChpDefault { font-family: 等线 } div.WordSection1 { } ol { margin-bottom: 0cm } ul { margin-bottom: 0cm } Mybati

笔记:MyBatis 动态SQL

有时候,静态的SQL语句并不能满足应用程序的需求.我们可以根据一些条件,来动态地构建SQL语句.例如,在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执行检索操作.在实现这种类型的搜索功能,我们可能需要根据这些条件来构建动态的SQL语句.如果用户提供了任何输入条件,我们需要将那个条件 添加到SQL语句的WHERE子句中. MyBatis通过使用<if>,<choose>,<where>,<foreach>,<

MyBatis 动态sql详解

MyBatis的动态sql语句 1.if 条件 2.choose , when 和 otherwise条件 3.where 条件 where条件:1.自动加上where.2.如果where子句以and或者or开头,则自动删除第一个and或者or..所以我们不需要自己加where 4.trim 条件 trim条件和where条件类似但是功能更强大:不仅可以替换掉子句开头的and或者or,还提供了加前缀和后缀的功能. 5.forEach循环 6.set 条件 set条件:自动加上set,自动去除最后

db2存储过程动态sql被截断

编写存储过程,使用动态sql时,调试时发现变量赋值后被截断. 关键代码如下: 实现的效果是先把上下游做对比的sql语句和相关参数存入RKDM_DATA_VOID_RULE, 执行存储过程后把两个sql语句得出的结果插入另一张结果表RKDM_DATA_VOID_CHK_REST. 建表语句: CREATE TABLE RKDM_DATA_VOID_CHK_REST ( DATA_DT DATE, ORDR_NUM INTEGER, CHK_BIG_CLS VARCHAR(256), DATA_PR

mybatis入门-动态sql

什么是动态sql 判断的动态sql mybatis核心就是对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 现有需求如下:需要查询用户,输入的是用户类,如果用户的性别类不为空,则将性别作为查询条件之一,如果用户的姓名不为空,则将用户姓名作为查询条件之一.如果用户两个属性都为空,则查询所有用户. 我们知道,在mapper中,我们的传入参数只有一个,多个参数只能通过包转类来实现,现在这种问题怎么解决呢?答案就是在xml文件中加入判断,使sql语句动态生成.刚才的需求所对应的

MyBatis的动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种

动态SQL

一 动态SQL /* 1.动态SQL概念的内涵 2.实现动态SQL的元素 3.if语句节点 4.choose(when,otherwise)语句节点 5.where节点 6.trim节点 7.set节点(update的set子句) 8.foreach节点 */ 1.动态SQL概念的内涵 MyBatis 最强大的特性之一就是它的动态语句功能,使用动态SQL完成多条件查 询.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL 语中实现某些逻辑. 2.实现动态SQL的元素

mybatis——动态sql

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择.先来看如下一个例子: 01 <select id="dynamicIfTest" parameterType="Blog" resultType=&