一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - mybatis的動態SQL和模糊查詢實例詳解

mybatis的動態SQL和模糊查詢實例詳解

2021-08-24 11:37Alan_Xiang Java教程

這篇文章主要給大家介紹了關于mybatis的動態SQL和模糊查詢的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

現在以一個例子來介紹mybatis的動態SQL和模糊查詢:通過多條件查詢用戶記錄,條件為姓名模糊匹配,并且年齡在某兩個值之間。

新建表d_user:

  1. create table d_user(
  2. id int primary key auto_increment,
  3. name varchar(10),
  4. age int(3)
  5. );
  6.  
  7. insert into d_user(name,age) values('Tom',12);
  8. insert into d_user(name,age) values('Bob',13);
  9. insert into d_user(name,age) values('Jack',18);

建表成功:

mybatis的動態SQL和模糊查詢實例詳解

新建實體類User:

  1. public class User {
  2. private Integer id;
  3. private String name;
  4. private Integer age;
  5.  
  6.   //getters and setters
  7.   
  8. @Override
  9. public String toString() {
  10. return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
  11. }
  12.  
  13. public User(Integer id, String name, Integer age) {
  14. super();
  15. this.id = id;
  16. this.name = name;
  17. this.age = age;
  18. }
  19.  
  20. public User() {
  21. super();
  22. }
  23. }

創建查詢條件實體類ConditionUser:

  1. public class ConditionUser {
  2. private String name;
  3. private int minAge;
  4. private int maxAge;
  5.  
  6.   //getters and setters
  7.   
  8. public ConditionUser(String name, int minAge, int maxAge) {
  9. super();
  10. this.name = name;
  11. this.minAge = minAge;
  12. this.maxAge = maxAge;
  13. }
  14.  
  15. public ConditionUser() {
  16. super();
  17. }
  18. }

新建映射文件userMapper.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.mybatis.test7.userMapper">
  4. <select id="getUser" parameterType="ConditionUser" resultType="User">
  5. SELECT * FROM d_user WHERE age &gt;= #{minAge} AND age &lt;= #{maxAge}
  6. <if test="name!=null">
  7. AND name LIKE CONCAT(CONCAT('%',#{name}),'%')</if>
  8. </select>
  9. </mapper>

編寫測試類:

  1. public class Test {
  2.  
  3. private SqlSessionFactory sessionFactory;
  4. private SqlSession session;
  5.  
  6. @Before
  7. public void init(){
  8. //讀取配置文件
  9. String resource = "conf.xml";
  10. InputStream is = this.getClass().getClassLoader().getResourceAsStream(resource);
  11.  
  12. //創建SqlSessionFactory和SqlSession
  13. sessionFactory = new SqlSessionFactoryBuilder().build(is);
  14. session = sessionFactory.openSession();
  15. }
  16.  
  17. @After
  18. public void free(){
  19. session.commit();
  20. session.close();
  21. }
  22.  
  23. @org.junit.Test
  24. public void getUser() {
  25. String statement = "com.mybatis.test7.userMapper"+".getUser";
  26. ConditionUser conditionUser = new ConditionUser("o", 13, 18);
  27. List<User> list = session.selectList(statement, conditionUser);
  28. System.out.println(list);
  29. }
  30. }

運行結果:

mybatis的動態SQL和模糊查詢實例詳解

注意:

1. 在配置文件中編寫sql語句時,為防止大于號和小于號在表示大小關系和表示標簽符號之間產生混淆,所以通常用&gt;和&lt;來代替sql語句中大于號和小于號。

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

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

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

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

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.mybatis.test7.userMapper">
  4. <select id="getUser" parameterType="ConditionUser" resultType="User">
  5. SELECT * FROM d_user WHERE age &gt;= #{minAge} AND age &lt;= #{maxAge}
  6. <if test="name!=null">
  7. AND name LIKE '%${name}%'</if>
  8. </select>
  9. </mapper>

注意,默認情況下,使用#{}語法,MyBatis會產生PreparedStatement語句,并且安全地設置PreparedStatement參數,這個過程中MyBatis會進行必要的安全檢查和轉義。例如:

執行SQL:select * from emp where name = #{employeeName}

參數:employeeName=>Smith

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

執行SQL:Select * from emp where name = ${employeeName}

參數:employeeName傳入值為:Smith

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

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

(3).在程序中拼接。

總結

到此這篇關于mybatis的動態SQL和模糊查詢的文章就介紹到這了,更多相關mybatis動態SQL模糊查詢內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/xiangwanpeng/article/details/53790810

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美贵妇videos办公室360 | 亚洲免费视| 动漫美女胸被狂揉扒开吃奶动态图 | 99精品视频只99有精品 | 亚洲欧美综合一区 | 国产欧美成人免费观看 | 千金在线观看 | 男女做受快插大片 | 明星ai人脸替换造梦在线播放 | 欧美日韩在线观看一区二区 | 日韩精品一区二区三区免费视频 | 扒开尿口| 国产麻豆流白浆在线观看 | 欧美人妖另类性hd | 欧美日韩国产亚洲一区二区三区 | 人皮高跟鞋在线观看 | 波多野结衣 在线播放 | 亚洲冬月枫中文字幕在线看 | 不卡视频一区二区 | 日韩福利网 | 亚洲日韩精品欧美一区二区一 | 久久久精品免费免费直播 | 国亚洲欧美日韩精品 | 久久综合亚洲色hezyo | 国产不卡视频一区二区在线观看 | 国产成人久久精品推最新 | 精品在线播放 | 国产成人夜色91 | 91久久偷偷做嫩草影院电 | 99在线视频观看 | 天天色天天综合网 | 国产草 | 久久久无码精品无码国产人妻丝瓜 | 4hu影院永久在线播放 | 亚洲高清网站 | 亚洲春色综合另类网蜜桃 | 男女拍拍拍免费视频网站 | 国产综合欧美日韩视频一区 | 亚洲天堂网在线观看视频 | 国模人体aⅴ | 女人麻豆国产香蕉久久精品 |