使用mybatis提供的各種標籤方法實現動態拼接Sql。這裡演示where標籤和if標籤實現使用姓名的模糊查詢和性別查詢使用者列表,當用戶沒有選擇姓名以及性別時查詢出所有的記錄。
阿新 • • 發佈:2018-12-21
1.需求:
使用姓名的模糊查詢和性別查詢使用者列表,當用戶沒有選擇姓名以及性別時查詢出所有的記錄。
2.在UserMapper介面中定義方法:
public List<User> findUserByNameAndSex(User user);
3.在UserMapper.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介面代理實現編寫規則: 1.對映檔案中namespace要等於介面的全路徑 2.通過sql語句實現資料庫的操作 3.對映檔案中sql語句id要等與於介面的方法名稱 4.對映檔案中傳入引數型別要等於介面方法的傳入引數型別 5.對映檔案中返回結果集型別要等於介面方法的返回值型別 --> <mapper namespace="com.huida.mapper.UserMapper"> <select id="findUserByNameAndSex" parameterType="com.huida.po.User" resultType="com.huida.po.User"> <!-- select * from user where 1=1 and username like "%${username}%" and sex=#{sex} --> select * from user <!-- where標籤有兩個作用: 1.替代where關鍵字 2.會去掉第一個條件的and關鍵字,會自動加上1=1永真條件,也就是放當後面的條件為null時,執行永真條件 --> <where> <if test="username!=null and username!=''"> and username like "%${username}%" </if> <if test="sex!=null and sex!=''"> and sex=#{sex} </if> </where> </select> </mapper>
我們為了實現當用戶名以及性別都為null時,查詢到使用者列表中的所有記錄,所以sql語句寫為:
select * from user where 1=1 and username like "%${username}%" and sex=#{sex}
這裡面有一個1=1的永真判斷條件用於實現當後面的兩個條件均為空時執行永真條件而不會報錯。
where標籤有兩個作用:
1.替代where關鍵字
2.會去掉第一個條件的and關鍵字,會自動加上1=1永真條件,也就是放當後面的條件為null時,執行永真條件。
在if標籤中注意要做不等於空字串校驗。
4.測試程式碼:
package com.huida.test; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.management.Query; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import org.omg.PortableInterceptor.USER_EXCEPTION; import com.huida.mapper.UserMapper; import com.huida.po.User; import com.huida.vo.QueryVo; public class UserMapperTest { private SqlSessionFactory factory=null; @Before public void init() throws Exception{ //通過流將核心配置檔案讀取進來 InputStream inputStream=Resources.getResourceAsStream("config/SqlMapConfig.xml"); //通過核心配置檔案輸入流來建立工廠 factory=new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testfindUserByNameAndSex(){ //建立SqlSession SqlSession openSession=factory.openSession(); //通過會話的getMapper方法來例項化介面(實現類的物件) UserMapper userMapper=openSession.getMapper(UserMapper.class);//引數放介面的位元組碼檔案 User user=new User(); user.setSex("2"); user.setUsername("aa"); List<User> list=userMapper.findUserByNameAndSex(user); System.out.println(list); } }