(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;
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 }
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 }
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>
動態 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)是必須有的。