动态SQL
<select id="queryByCountryCity" resultType="com.text.pojo.Addresses">
select * from addresses
<where>
<if test="country != null and country !=''">
COUNTRY = #{country}
</if>
<if test="city != null and city !=''">
and
CITY = #{city}
</if>
</where>
</select>
<if>if 可以加入test=""进行相关判断
<where>where 可以去掉多余的前置and
<!--
功能:
根据传入的对象动态的修改其中的值,
如果某个字段传入的非空值,再去修改,否则不修改
set只能处理后置的
-->
<update id="update" parameterType="com.text.pojo.Addresses">
update addresses
<set>
<if test="city != null and city != ''">
city = #{city},
</if>
<if test="country != null and country != ''">
country = #{country},
</if>
<if test="street != null and street != ''">
street = #{street},
</if>
<if test="state != null and state != ''">
state = #{state},
</if>
<if test="zip != null and zip != ''">
zip = #{zip},
</if>
</set>
<where>
ADDR_ID = #{addrId}
</where>
</update>
<set>set 除去后面的逗号,
<select id="query" resultType="com.text.pojo.Addresses" parameterType="com.text.pojo.Addresses">
select * from addresses
<where>
<choose>
<when test="country != null">
and country = #{country}
</when>
<when test="state != null">
and state = #{state}
</when>
<otherwise>
and city = #{city}
</otherwise>
</choose>
</where>
</select>
<choose>choose 相当于if.. else if
<otherwise>otherwise 相当于else
<select id="queryTrim" resultType="com.text.pojo.Addresses" parameterType="com.text.pojo.Addresses">
select * from addresses
<trim prefix="WHERE" suffixOverrides="AND">
<if test="city != null and city != ''">
city = #{city} and
</if>
<if test="country != null and country != ''">
country = #{country} and
</if>
<if test="street != null and street != ''">
street = #{street} and
</if>
<if test="state != null and state != ''">
state = #{state} and
</if>
<if test="zip != null and zip != ''">
zip = #{zip} and
</if>
</trim>
</select>
<trim>trim 比较全能
可以添加属性,prefix suffix代表前面或后面加额外的sql字段
prefixOverrides suffixOverrides代表前面和后面可能有多余的sql字段
mybatis可以根据属性自己识别
<select id="queryByIds" resultType="com.text.pojo.Addresses">
select *
from addresses
<where>
addr_id in
<!--
collection代表集合类型
open代表拼接时以什么开头
close代表拼接时以什么结尾
item代表遍历的每个元素的名字,一个代号
separator代表分隔符
index 如果需要标号也可以使用
-->
<foreach collection="list" open="(" close=")" item="item" separator=",">
#{item}
</foreach>
</where>
</select>
<foreach>foreach 可以进行遍历
有collection open close item separator index等多种属性
<!--#{}内不支持拼接
实现模糊查询
解决方案1:在应用层进行拼接再传进mapper.xml
解决方案2:再xml中用字符串拼接 '%'+ #{city} + '%' 但是这样有sql注入风险
解决方案3:通过mysql函数concat(*,*,*)实现拼接
解决方案4:使用bind标签,对我们的变量进行重新绑定,然后通过新绑定的变量进行引用即可
-->
<select id="queryLike" resultType="com.text.pojo.Addresses">
<bind name="_city" value="'%'+city+'%'"/>
select * from addresses
<where>
city like #{_city}
</where>
</select>
<bind>bind 可以进行自定义变量
<!--将最常用的sql语句变成片段,方便复用-->
<sql id="baseColumn">
country,state,city
</sql>
<select id="listAll" resultType="com.text.pojo.Addresses">
select
<include refid="baseColumn"/>
from addresses
</select>
<sql>sql 可以取出重复的sql片段进行复用
<include> include 可以导入sql片段
两个标签需要配合使用