07-Mybatis之動態SQL:根據不同的條件生成不同的不同的sql語句
阿新 • • 發佈:2020-12-20
動態SQL:根據不同的條件生成不同的不同的sql語句
1.if使用
<select id="selectByIdName" resultType="User"> select * from user where 1=1 <if test="id!=null and id!=''"> and id=#{id} </if> <if test="username!=null and username!=''"> and username=#{username} </if> </select>
//介面:
public interface UserMapper {
User selectByIdName(@Param("id")int id,@Param("username")String username);
}
//呼叫:
UserMapper userMapper = session.getMapper(UserMapper.class);
User user =userMapper.selectByIdName(3,"lisi");
System.out.println(user);
2.where使用
簡介:<where></where> 元素只會在至少有一個子元素的條件返回 SQL 子句的情況下才去插入“WHERE”子句。而且,若語句的開頭為“AND”或“OR”,where 元素也會將它們去除。 例如:select * from user where and username=#{username} and password=#{password}將會變成 select * from user where username=#{username} and password=#{password}
<select id="selectByNamePwd1" resultType="User"> select * from user <where> <if test="username!=null and username!=''"> username=#{username} </if> <if test="password!=null and password!=''"> and password=#{password} </if> </where> </select>
//介面:
public interface UserMapper {
User selectByNamePwd1(@Param("username") String username,@Param("password")String password);
}
//呼叫:
UserMapper userMapper = session.getMapper(UserMapper.class);
User user=userMapper.selectByNamePwd1("lisi","123");
System.out.println(user);
3.choose, when, otherwise使用
簡介:有時我們不想應用到所有的條件語句,而只想從中擇其一項。針對這種情況,MyBatis 提供了 choose 元素,它像 Java 中的 if-else if - else 語句。
注意,如果<choose></choose>下的<when>都滿足條件,將會只輸出前者(即choose只會選擇一個生成語句)
<select id="selectByNamePwd1" resultType="User">
select * from user
<where>
<choose>
<when test="username!=null and username!=''">
username=#{username}
</when>
<when test="password!=null and password!=''">
password=#{password}
</when>
</choose>
</where>
</select>
//介面:
public interface UserMapper {
User selectByNamePwd1(@Param("username") String username,@Param("password")String password);
}
//呼叫:
UserMapper userMapper = session.getMapper(UserMapper.class);
User user=userMapper.selectByNamePwd1("1","1");
System.out.println(user);
4.set使用
簡介:去掉最後一個","
<update id="upd" parameterType="User">
update user
<set>
此處加id=#{id},是為了防止下面兩個if判斷都不成功導致語法錯誤(update user where id=#{id})
id=#{id},
<if test="username!=null">
username=#{username},
</if>
<if test="password!=null">
password=#{password},
</if>
</set>
where id=#{id}
</update>
//介面:
public interface UserMapper {
int upd(User user);
}
//呼叫:
User user=new User(3,"updname","updpwd");
int index = userMapper.upd(user);
System.out.println(index);
session.commit();
5.trim使用
簡介:where、set原型
prefix:字首增加
prefixOverrides:字首刪除
suffix:字尾增加
suffixOverrides:字尾刪除
注意:執行順序,先刪除內容再增加內容
where功能:
<select id="selectByNamePwd2" resultType="User">
select * from user
<trim prefix="where" prefixOverrides="and">
<if test="username!=null and username!=''">
username=#{username}
</if>
<if test="password!=null and password!=''">
and password=#{password}
</if>
</trim>
</select>
//介面:
public interface UserMapper {
User selectByNamePwd2(@Param("username") String username,@Param("password")String password);
}
//呼叫:
User user=userMapper.selectByNamePwd2("","111");
System.out.println(user);
6.bind使用
簡介:給引數重新賦值,用於模糊查詢、在原內容前或者後新增內容
模糊查詢
<select id="selectById1" resultType="User">
<bind name="username" value="'%'+username+'%'"/>
select * from user where username like #{username}
</select>
//介面:
public interface UserMapper {
User selectById1(@Param("id")int id,@Param("username") String username);
}
//呼叫:
User user=userMapper.selectById1(2,"li");
System.out.println(user);
7.foreach使用
簡介:迴圈遍歷引數內容,還具備在內容的前後新增內容,還具備新增分隔符功能
適用於in查詢中 select * from user where id in ( , , , )
批量新增(注意:mybatis中foreach效率比較低)
insert int user values (id1,username1,password1),(id2,username2,password2),(id3,username3,password3)
collection:要遍歷的集合
item:迭代變數
open:迴圈後左側新增的內容
close:迴圈後右側新增的內容
separator:每次迴圈時,元素之間的分隔符
<select id="selectByIdList" resultType="User">
select * from user where id in
<foreach collection="idList" item="idList" open="(" close=")" separator=",">
#{idList}
</foreach>
</select>
//介面:
public interface UserMapper {
List<User> selectByIdList(@Param("idList")List<Integer> idList);
}
//呼叫:
List<Integer> list=new ArrayList<>();
list.add(2);
list.add(3);
List<User> userList=userMapper.selectByIdList(list);
for(User user:userList){
System.out.println(user);
}
8.sql使用
簡介:某些SQL片段如果希望複用,可以使用<sql>定義這個片段
之後在<select>等標籤中使用<include>引用
<select id="selectAll2" resultType="User">
select <include refid="mysql"></include>
from user
</select>
<sql id="mysql">
id,username
</sql>
//介面:
public interface UserMapper {
List<User> selectAll2();
}
//呼叫:
List<User> userList=userMapper.selectAll2();
for(User user : userList){
System.out.println(user);
}