mybatis 动态SQL
if标签
通常使用在where,通过判断参数的值来决定是否使用某个查询条件,或者在update是否使用更新某个字段,在insert 中是否插入某个字段的值
if 标签有一个必要的属性test,test 属性值是OGNL判断表达式 <if test="name != null and name != ''"> property !=/== null :适用于任何类型的字段,判断属性值是否为空 property !=/== ’ ‘ 仅使用于字符串类型 and 和or 判断条件, 判断字符串的时候先判断是否为null,再去判断是否为空

但是当两个条件都不满足的时候
会出现类型这样的sql语句 select * from weibo_user where (不符合规则
可以通过where标签去解决,自动删除and or
choose用法
choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
<select id="selectByIdName" resultType="java.util.HashMap"> select * from weibo_user <where> <choose> <when test="id != null or id != ''" > id = #{id} </when> <when test="name != null or name != ''" > and username = #{name} </when>
<otherwise>
and 1 == 2;
</otherwise
</choose> </where>
一旦上面的id符合条件,那就不会进行name的判断,直接按照id去查询了
不会再向下判断了,
where 标签:
如果该标签包含的元素中有返回值,就插入一个where 如果where后面的字符串是以and和or开头的,就自动将他们剔除。
select * from weibo_user <where> <if test="name != null and name != ''"> username = #{name} </if> <if test="id != null and id != ''"> and id = #{id}; </if> </where>
因为当第一个if条件不成立,第二个if成立的时候,整合的SQL语句是:
select * from weibo_user where and id = #{id}
但是这里有where标签,会自动剔除and,最后语句正确。
set标签
和where 一样
如果标签包含的元素有返回值,就插入一个set,如果set后面的字符串是以逗号结尾的,就将都好剔除
<update id="updateWeiboUserName" > update weibo_user <set> <if test="username != null and username != ''"> username = #{username}, </if> <if test="nickname != null and nickname != ''"> nickname = #{nickname}, </if> </set> where id = #{id} </update>
trim用法
where 和set 标签的功能都可以用trim 标签来实现,并且在底层就是通过
TrimSqlNode 实现的。
trim元素的主要功能是,与之对应的属性是
下面的前提条件是,当trim里面的元素有内容的时候,会加入指定的位置和指定的内容
prefix 可以在自己包含的内容前加上某些前缀,
suffix 也可以在其后加上某些后缀
prefixOverrides 可以把包含内容的首部某些内容覆盖
suffixOverrides 也可以把尾部的某些内容覆盖
只需要指定 trim的一些属性
where 标签对应trim 的实现如下。 <trim prefix=”WHERE ” prefixOverrides=” AND |OR ” > </ trim>
注意:上面的AND空格不能省略!!!
foreach
因为我们SQL语句会使用IN关键字:id in (1,2,3)
foreach 可以对数组、Map 或实现了工terable 接口(如List 、Set )的对象进行遍 历。数组在处理时会转换为List 对象,因此foreach 遍历的对象可以分为两大类: Itera ble 类型和Map 类型。这两种类型在遍历循环时情况不一
<select> select * from sys_user where 工d in <foreach collection= ” lis t ” open= ” ( ” close= ” )” separator= ” , ” item= ” id” index = ” i ” > #{id} </foreach> </ select>
属性分析:
collection : 必填,值为要选代循环的属性名。这个属性值的情况有很多。
item :变量名,值为从法代对象中取出的每一个值。
index :索引的属性名,在集合数组情况下值为当前索引值, 当选代循环的对象是Map
类型时,这个值为Map 的key (键值)。
open:整个循环内容开头的字符串。
close : 整个循环内容结尾的字符串。
separator :每次循环的分隔符。
<!--使用foreach元素查询用户信息--> <select id="selectUserByForeach" resultType="com.po.MyUser" parameterType= "List"> select * from user where uid in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> # {item} </foreach> </select>
bind
创建并绑定变量到上下文当中,
<select id="selectByName" resultType="java.util.HashMap"> -- select * from weibo_user where username like concat(#{name},'%') select * from weibo_user where <if test="username != name and username != ''" > <bind name="usernameLike" value="name+'%'"/> username like #{usernameLike} </if> </select>
resultMap:
查询到的数据库的列,映射成为你喜欢的类型
column 从数据库中得到的列名
property 映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的JavaBeans的属性,那么就会使用。否则MyBatis将会找给定名称的字段。
这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一些东西:“username”,或者映射到一些复杂的东西:“address.street.number”
<resultMap id="selectallmap" type="java.util.HashMap"> <result property="微博用户id" column="id"></result> <result property="微博用户" column="username"></result> <result property="微博用户别名" column="nickname"></result> <result property="微博用户状态" column="status"></result> <result property="微博用户创建时间" column="create_at"></result> <result property="标记" column="remark"></result> </resultMap>
查询:
<select id="selectAll" resultMap="selectallmap" > select * from weibo_user </select> 结果: { "微博用户别名": "全", "password": "1997", "标记": "11", "微博用户id": 2, "微博用户状态": 1300, "微博用户": "quanupdate", "微博用户创建时间": "2020-05-05T02:24:20.000+00:00" }, { "微博用户别名": "unickname", "password": "1111", "标记": "22", "微博用户id": 3, "微博用户状态": 1, "微博用户": "zhangsann", "微博用户创建时间": "2020-05-05T02:24:24.000+00:00" }, { "微博用户别名": "qq", "password": "1111", "标记": "33", "微博用户id": 4, "微博用户状态": 1, "微博用户": "zhangsan", "微博用户创建时间": "2020-05-05T02:24:29.000+00:00" },
进行关联查询
评论:
public class WeiboCommont { private int id; private String content; private Date creat_at; // 链接到WeiboUser表里面的id的外键 private int user_id; private int weibo_id; weibouser: public class WeiboUser { // 建立与数据库对应的列 private Integer id; private String username; private String password; private String nickname; private short status; private Date create_at; private String remark;
查询:
<select id="selectById" resultMap="selectallmap" > select wc.content,wu.* from weibo_commont wc inner join weibo_user wu on wc.user_id = wu.id where wu.id = #{id} </select>
[ { "微博用户别名": "unickname", "password": "1111", "标记": "22", "微博用户id": 3, "微博用户状态": 1, "content": "zhangsan 评论", "微博用户": "zhangsann", "微博用户创建时间": "2020-05-05T02:24:24.000+00:00" }, { "微博用户别名": "unickname", "password": "1111", "标记": "22", "微博用户id": 3, "微博用户状态": 1, "content": "zhangsan 评论2", "微博用户": "zhangsann", "微博用户创建时间": "2020-05-05T02:24:24.000+00:00" } ]

浙公网安备 33010602011771号