引言:
在我们生活中,常常会需要填写一些注册的信息,比如性别,年龄,学历啥的,假如我们不想去填写,那我们只写一个SQL的增加语句是不是就不对了呢。这时候我们就需要根据用户的输入情况,进行插入,下面为这种情况的例子
这时候我们需要根据需求,动态的拼接SQL:动态SQL
insert into userInfo(username, password,age,gender,phone) values(?,?,?,?,?); insert into userInfo( password,age,gender,phone) values(?,?,?,?); insert into userInfo(age,gender,phone) values(?,?,?);
一、动态SQL书写方式
注解
1.把全部的sql放到script标签下面
2.使用if标签
判断条件
里面写的是java对象的属性
@Mapper public interface UserInfo2Mapper { //动态SQL练习 //假如此时性别是否为空 //Insert into userinfo(username,password,age,gender,phone) values(#{username},#{password},#{age],#{gender},#{phone}) //gender对应的是java的属性,而不是数据库的 @Insert("<script>" + "Insert into userinfo(username,password,age," + "<if test='gender!=null'>gender,</if>" + "phone)" + "values(#{username},#{password},#{age}," + //下面这个也是java的属性 "<if test='gender!=null'>#{gender},</if>" + "#{phone})" + "</script>") Integer insert(UserInfo userInfo);
使用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.example.myBatis.mapper.UserInfoXMLMapper"> <insert id="insertByXML"> insert into userInfo(username,password,age, <if test="gender!=null" >gender</if>,phone) values(#{username},#{password},#{age} ,<if test='gender!=null'>#{gender},</if> #{phone}) </insert> </mapper>
如何选择:
1.先看公司/团队,是否有要求
2.看同事咋写
二、<trim>会帮我们处理多余的字符
当我们不去写性别的时候,会发现问题
原因就是书写这里的时候,如果把性别注释掉,就会多一个and,所以,我们选择使用trim标签。
方法2:使用where也可以进行消除and,但是出现的问题
由自己的实现得出;假如这样where能够对and进行去除(不写username的情况下)
select*from <where> <if test="username!=null"> username=#{username} </if> <if test="age!=null"> and age=#{age} </if> <if test="gender!=null"> and gender=#{gender} <where>
但是假如是这种情况(不写gender的情况)
trim的缺点:假如所有条件都为空的情况下,SQL语句变成
select*from userinfo where 后面就没有了
当然也有解决方法
select *from userInfo where 1=1 <trim>省略</trim>
(如果查询条件为空,where标签会自动去除where关键字,各有好坏,依据情况定)
select*from <where> <if test="username!=null"> username=#{username} and </if> <if test="age!=null"> age=#{age} and </if> <if test="gender!=null"> and gender=#{gender} <where>
三、<Set>标签
set标签也可以与where一样,起到一定的去除作用。
<update id="updateByCondition"> update userInfo <set> <!-- <trim suffixOverrides=",">--> <if test="username!=null"> username=#{username}, </if> <if test="age!=null"> age=#{age}, </if> <if test=" gender!=null"> gender=#{gender} </if> <!-- </trim>--> </set> where id=9 </update>
四、foreach(循环操作)
Mybatis传递List集合报错 Available parameters are [collection, list]
发现了一个奇怪的问题,当我传递List的时候,不知道为什么一直报这个错,开始在想是不是哪里打错了,后来再去搜索发现是下面这个原理
前任栽树:
当我们传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时 候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。所以,当我们传递的是一个List集合时,mybatis会自动把我们的list集合包装成以list为Key值的map。
(换句话说当我们传递集合的时候,假如不加上这个@Param这个,编译器是无法根据你的名字来去识别你的xml文件中sql选择的id,那么对应xml里面的SQL语句就无法实现))
————————————————
版权声明:本文为CSDN博主「發V發」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_28978689/article/details/79406832
当这个样子改完之后,问题就成功解决啦~。
<sql>和<include>
把一些重复的sql可以提取出来,使用<sql>标签来标识,使用的时候使用<include>标签
例: