最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis的動(dòng)態(tài)SQL和模糊查詢實(shí)例詳解

 更新時(shí)間:2021年03月15日 13:01:13   作者:Alan_Xiang  
這篇文章主要給大家介紹了關(guān)于mybatis的動(dòng)態(tài)SQL和模糊查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

現(xiàn)在以一個(gè)例子來介紹mybatis的動(dòng)態(tài)SQL和模糊查詢:通過多條件查詢用戶記錄,條件為姓名模糊匹配,并且年齡在某兩個(gè)值之間。

新建表d_user:

create table d_user( 
 id int primary key auto_increment, 
 name varchar(10),
 age int(3)
); 

insert into d_user(name,age) values('Tom',12); 
insert into d_user(name,age) values('Bob',13); 
insert into d_user(name,age) values('Jack',18);

建表成功:

image_1b4gjg2c1f1l1gob9to15lpp3bm.png-12.8kB

新建實(shí)體類User:

public class User {
 private Integer id;
 private String name;
 private Integer age;

  //getters and setters
  
 @Override
 public String toString() {
  return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
 }

 public User(Integer id, String name, Integer age) {
  super();
  this.id = id;
  this.name = name;
  this.age = age;
 }

 public User() {
  super();
 }
}

創(chuàng)建查詢條件實(shí)體類ConditionUser:

public class ConditionUser {
 private String name;
 private int minAge;
 private int maxAge;

  //getters and setters
  
 public ConditionUser(String name, int minAge, int maxAge) {
  super();
  this.name = name;
  this.minAge = minAge;
  this.maxAge = maxAge;
 }

 public ConditionUser() {
  super();
 }
}

新建映射文件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 namespace="com.mybatis.test7.userMapper">
 <select id="getUser" parameterType="ConditionUser" resultType="User">
  SELECT * FROM d_user WHERE age &gt;= #{minAge} AND age &lt;= #{maxAge}
  <if test="name!=null">
   AND name LIKE CONCAT(CONCAT('%',#{name}),'%')</if>
 </select>
</mapper>

編寫測試類:

public class Test {

 private SqlSessionFactory sessionFactory;
 private SqlSession session;

 @Before
 public void init(){
  //讀取配置文件
  String resource = "conf.xml";
  InputStream is = this.getClass().getClassLoader().getResourceAsStream(resource);

  //創(chuàng)建SqlSessionFactory和SqlSession
  sessionFactory = new SqlSessionFactoryBuilder().build(is);
  session = sessionFactory.openSession();
 }

 @After
 public void free(){
  session.commit();
  session.close();
 }


 @org.junit.Test
 public void getUser() {
  String statement = "com.mybatis.test7.userMapper"+".getUser";
  ConditionUser conditionUser = new ConditionUser("o", 13, 18);
  List<User> list = session.selectList(statement, conditionUser);
  System.out.println(list);
 }
}

運(yùn)行結(jié)果:

image_1b4gjeoo71aqa8hc1pg746l1vps9.png-12.9kB

注意:

1. 在配置文件中編寫sql語句時(shí),為防止大于號(hào)和小于號(hào)在表示大小關(guān)系和表示標(biāo)簽符號(hào)之間產(chǎn)生混淆,所以通常用&gt;和&lt;來代替sql語句中大于號(hào)和小于號(hào)。

2. 在SQL語句中添加動(dòng)態(tài)SQL標(biāo)簽if的原因是,當(dāng)在后臺(tái)獲取的name屬性值為null時(shí),防止生成where name like %null%的條件判斷語句,正確的邏輯應(yīng)該是,當(dāng)傳來的name屬性值為null時(shí),取消此篩選條件,即不使用where name like ?的判斷條件。在mybatis中,可用的動(dòng)態(tài)SQL標(biāo)簽有:if,choose(when,otherwise),trim(where,set),foreach。

3. 在使用模糊查詢時(shí),拼接%+#{name}+%的方法有如下幾種:

(1).像上述例子中一樣,在SQL語句中使用CONCAT關(guān)鍵字。

(2).使用${}代替#{}:

<?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.mybatis.test7.userMapper">
 <select id="getUser" parameterType="ConditionUser" resultType="User">
  SELECT * FROM d_user WHERE age &gt;= #{minAge} AND age &lt;= #{maxAge}
  <if test="name!=null">
   AND name LIKE '%${name}%'</if>
 </select>
</mapper>

注意,默認(rèn)情況下,使用#{}語法,MyBatis會(huì)產(chǎn)生PreparedStatement語句,并且安全地設(shè)置PreparedStatement參數(shù),這個(gè)過程中MyBatis會(huì)進(jìn)行必要的安全檢查和轉(zhuǎn)義。例如:

執(zhí)行SQL:select * from emp where name = #{employeeName}

參數(shù):employeeName=>Smith

解析后執(zhí)行的SQL:select * from emp where name = ?

執(zhí)行SQL:Select * from emp where name = ${employeeName}

參數(shù):employeeName傳入值為:Smith

解析后執(zhí)行的SQL:Select * from emp where name =Smith

綜上所述,${}方式可能會(huì)引發(fā)SQL注入的問題,同時(shí)也會(huì)影響SQL語句的預(yù)編譯,所以從安全性和性能的角度出發(fā),應(yīng)盡量使用#{}。當(dāng)需要直接插入一個(gè)不做任何修改的字符串到SQL語句中,例如在ORDER BY后接一個(gè)不添加引號(hào)的值作為列名,這時(shí)候就需要使用${}。

(3).在程序中拼接。

總結(jié)

到此這篇關(guān)于mybatis的動(dòng)態(tài)SQL和模糊查詢的文章就介紹到這了,更多相關(guān)mybatis動(dòng)態(tài)SQL模糊查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)Excel讀取的實(shí)例教程

    SpringBoot實(shí)現(xiàn)Excel讀取的實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)Excel讀取的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Idea中如何修改項(xiàng)目的SVN地址

    Idea中如何修改項(xiàng)目的SVN地址

    這篇文章主要介紹了Idea中如何修改項(xiàng)目的SVN地址問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • JavaSE實(shí)現(xiàn)文件壓縮與解壓縮的技巧分享

    JavaSE實(shí)現(xiàn)文件壓縮與解壓縮的技巧分享

    我們?cè)谌粘?shí)際開發(fā)中,對(duì)于文件壓縮和解壓縮場景,是非常常見的操作,本文詳細(xì)介紹JavaSE中文件壓縮和解壓縮的實(shí)現(xiàn)方法,包括源代碼解析、應(yīng)用場景案例、優(yōu)缺點(diǎn)分析、案例演示、文末總結(jié)等等,請(qǐng)同學(xué)們耐心閱讀
    2024-03-03
  • java8新特性之接口的static和default的使用

    java8新特性之接口的static和default的使用

    這篇文章主要介紹了java8新特性之接口的static和default的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • sentinel流量控制框架(目錄設(shè)置)

    sentinel流量控制框架(目錄設(shè)置)

    Sentinel?是面向分布式服務(wù)架構(gòu)的高可用流量防護(hù)組件幫助開發(fā)者保障微服務(wù)的穩(wěn)定性,本文重點(diǎn)給大家介紹sentinel流量控制框架的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-03-03
  • 深入了解JAVA HASHMAP的死循環(huán)

    深入了解JAVA HASHMAP的死循環(huán)

    HASHMAP基于哈希表的 Map 接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)下面小編來帶大家詳細(xì)了解下吧
    2019-06-06
  • Java調(diào)用wsdl接口的兩種方法(axis和wsimport)

    Java調(diào)用wsdl接口的兩種方法(axis和wsimport)

    本文主要介紹了Java調(diào)用wsdl接口的兩種方法(axis和wsimport),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 將ResultSet中得到的一行或多行結(jié)果集封裝成對(duì)象的實(shí)例

    將ResultSet中得到的一行或多行結(jié)果集封裝成對(duì)象的實(shí)例

    這篇文章主要介紹了將ResultSet中得到的一行或多行結(jié)果集封裝成對(duì)象的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • java字符串轉(zhuǎn)JSON簡單代碼示例

    java字符串轉(zhuǎn)JSON簡單代碼示例

    這篇文章主要給大家介紹了關(guān)于java字符串轉(zhuǎn)JSON的相關(guān)資料,JSON?是一種輕量級(jí)的數(shù)據(jù)交換格式,常用于Web應(yīng)用程序中的數(shù)據(jù)傳輸,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 詳解Springboot 優(yōu)雅停止服務(wù)的幾種方法

    詳解Springboot 優(yōu)雅停止服務(wù)的幾種方法

    這篇文章主要介紹了詳解Springboot 優(yōu)雅停止服務(wù)的幾種方法 ,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論

通州市| 东港市| 保康县| 临漳县| 蒙阴县| 齐河县| 桑日县| 长子县| 阜宁县| 长沙县| 建宁县| 集安市| 娄烦县| 龙陵县| 剑阁县| 信丰县| 兰溪市| 晋中市| 横山县| 新余市| 高邑县| 古丈县| 商洛市| 上犹县| 来宾市| 宣武区| 松江区| 伽师县| 鄂托克前旗| 乌海市| 永新县| 东兴市| 安平县| 甘南县| 汝阳县| 祁阳县| 张家川| 焉耆| 中江县| 资阳市| 射阳县|