MyBatis--動態SQL(if的用法)


(ps:測試工具為idea,SpringBoot整合Mybatis,基礎配置及簡單的單表操作省略....)

准備工作--

1.建表

 1 CREATE TABLE `sys_user`  (
 2   `id` int(11) NOT NULL AUTO_INCREMENT,
 3   `user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用戶名',
 4   `user_password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密碼',
 5   `user_email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '郵箱',
 6   `user_info` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '簡介',
 7   `head_img` blob NULL COMMENT '頭像',
 8   `create_time` datetime(0) NULL DEFAULT NULL COMMENT '創建時間',
 9   PRIMARY KEY (`id`) USING BTREE
10 ) ENGINE = InnoDB AUTO_INCREMENT = 1007 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
11 
12 -- ----------------------------
13 -- Records of sys_user
14 -- ----------------------------
15 INSERT INTO `sys_user` VALUES (1, 'admin', '123456', 'admin@qq.com', '管理員', NULL, '2020-03-04 13:01:03');
16 INSERT INTO `sys_user` VALUES (1001, 'test', '123456', 'test@mybatis.com', '測試人員', NULL, '2020-03-04 13:01:43');
17 INSERT INTO `sys_user` VALUES (1005, 'test0', '123456', 'test@mybatis.tk', NULL, NULL, '2020-06-22 14:49:48');
18 INSERT INTO `sys_user` VALUES (1006, 'test1', '123456', 'test@mybatis.tk', NULL, NULL, '2020-06-22 14:49:48');
19 INSERT INTO `sys_user` VALUES (1007, 'test2', '123456', 'test@mybatis.tk', NULL, NULL, '2020-06-22 14:49:48');
20 
21 SET FOREIGN_KEY_CHECKS = 1;
sys_user.sql

2.實體類

 1 package com.beilin.menber.entity;
 2 
 3 
 4 import lombok.Data;
 5 /**
 6  * 用戶表
 7  */
 8 import java.util.Date;
 9 import java.util.List;
10 
11 @Data
12 public class SysUser {
13     private Long id;//id自增
14     private String userName;//用戶名
15     private String userPassword;//密碼
16     private String userEmail;//郵箱
17     private String userInfo;//簡介
18     private byte[] headImg;//頭像
19     private Date createTime;//創建時間
20 
21 
22 }
SysUser

3.UserMapper接口

1 package com.beilin.menber.dao;
2 import java.util.List;
3 
4 public interface UserMapper {
5 
6     //根據id查詢
7     SysUser selectById(Long id);
8 
9    }
UserMapper

4.XML文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!-- mybatis的dtd文件 -->
 3 <!DOCTYPE mapper
 4         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 5         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 6 <!--namespace屬性: 用於指定指向那個接口 -->
 7 <mapper namespace="com.beilin.menber.dao.UserMapper">
 8     <resultMap id="userMap" type="com.beilin.menber.entity.SysUser">
 9         <id property="id" column="id"/>
10         <result property="userName" column="user_name"/>
11         <result property="userPassword" column="user_password"/>
12         <result property="userEmail" column="user_email"/>
13         <result property="userInfo" column="user_info"/>
14         <result property="headImg" column="head_img" jdbcType="BLOB"/>
15         <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
16     </resultMap>
17         
18       <sql id="userBase">
19          
20    id,user_name,user_password,user_email,user_info,head_img,create_time
21     </sql>
22     
23       <select id="selectById" resultType="SysUser">
24             select * from sys_user where id =#{id}
25         </select>
26 
27 </mapper>
SysUserMapper.xml

 

  動態 SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態 SQL,可以徹底擺脫這種痛苦。

  使用動態 SQL 並非一件易事,但借助可用於任何 SQL 映射語句中的強大的動態 SQL 語言,MyBatis 顯著地提升了這一特性的易用性。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if標簽通常用於WHERE語句中,通過判斷參數值來決定是否使用某個查詢條件,它也經常用於UPDATE語句中判斷是否更新某一字段,還可以在INSERT語句中用來判斷是否插入某個字段的值。

  假設需求:實現一個用戶管理高級查詢功能,根據輸入的條件去檢索用戶信息,當只輸入用戶時,需要根據用戶名進行模糊搜索;當只輸入郵箱時,根據郵箱進行匹配;當同時輸入用戶名和郵箱時,用這兩個條件去查詢匹配的用戶。

 首先需要在UserMapper接口中增加對應的接口方法,代碼如下:

 

1  /**
2      * 根據動態條件查詢用戶信息
3      * @param user
4      * @return
5      */
6     List<SysUser> selectByUser(SysUser user);

 

 XML文件SQL

 1 <select id="selectByUser" resultType="SysUser">
 2    select id,
 3     user_name userName,
 4     user_password userPassword,
 5     user_email userEmail,
 6     user_info userInfo,
 7     create_time createTime
 8    from sys_user
 9    where 1 = 1 
10    <if test="userName != null and userName !=''">
11    and user_name like concat('%',#{userName},'%')
12    </if>
13    <if test="userEmail != null and userEmail !=''">
14       and user_email like concat('%',#{userEmai},'%')
15    </if>
16 </select>

 新建UserMapperTest測試類

 1 package com.beilin.menber.dao;
 2 
 3 
 4 import com.beilin.menber.entity.SysUser;
 5 import org.junit.jupiter.api.Test;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.boot.test.context.SpringBootTest;
 8 import org.springframework.util.Assert;
 9 
10 import java.util.ArrayList;
11 import java.util.Date;
12 import java.util.List;
13 import static org.junit.jupiter.api.Assertions.*;
14 
15 @SpringBootTest
16 class UserMapperTest {
17     @Autowired
18     private UserMapper userMapper;
19 
20 
21     @Test
22     void test(){
23         SysUser user=new SysUser();
24         //只傳入用戶名時
25         user.setUserName("ad");
26         List<SysUser>userList =userMapper.selectByUser(user);
27         System.out.println(userList);
28 
29     }
30 
31      @Test
32     void test1(){
33          SysUser user=new SysUser();
34          //只傳入郵箱時
35          user.setUserEmail("test");
36          List<SysUser>userList =userMapper.selectByUser(user);
37          System.out.println(userList);
38     }
39      @Test
40     void test2(){
41          SysUser user=new SysUser();
42          //同時傳入用戶名和郵箱
43          user.setUserEmail("@mybatis.com");
44          user.setUserName("t");
45          List<SysUser>userList =userMapper.selectByUser(user);
46          System.out.println(userList);
47     }
48 
49   
50 
51 }

右鍵運行,然后控制台就會輸出對應的信息,這里不一一測試了

 

 

 

  • 注意SQL中where關鍵字后面的條件

    where 1 = 1

  由於兩個條件都是動態的,所以如果沒有1=1這個默認條件,當兩個if判斷都不滿足時,最后生成的SQL就會以where結束,這樣不符合SQL規范,因此就會報錯。加上1=1這個條件就可以避免SQL語法錯誤導致的異常。這種寫法並美觀,后面可以使用where標簽替代這種寫法。

  • 注意條件中的and(或or)

  這里的and(或or)需要手動添加,當這部分條件拼接到where 1 = 1 后面時仍然是合法的SQL,因為有默認的1=1這個條件,我們才不需要判斷第一個動態條件是否需要加上and(或or),因為這種情況下and(或or)是必須有的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM