MyBatis(十九):動態SQL

来源:https://www.cnblogs.com/jmsstudy/archive/2022/09/16/16698705.html
-Advertisement-
Play Games

一、什麼是動態SQL 官方文檔給出了這樣的說明: 動態 SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要註意去掉列表最後一個列名的逗號。利用動態 SQL,可以徹底擺脫 ...


一、什麼是動態SQL

官方文檔給出了這樣的說明:

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

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

如果你之前用過 JSTL 或任何基於類 XML 語言的文本處理器,你對動態 SQL 元素可能會感覺似曾相識。在 MyBatis 之前的版本中,需要花時間瞭解大量的元素。藉助功能強大的基於 OGNL 的表達式,MyBatis 3 替換了之前的大部分元素,大大精簡了元素種類,現在要學習的元素種類比原來的一半還要少。

if

choose (when, otherwise)

trim (where, set)

foreach

從這段文字我麽能夠知道動態SQL是用來做什麼的以及它的四個標簽。

二、動態SQL的使用

1.環境搭建

(1)資料庫建立一個blog表

CREATE TABLE blog (
  `id` VARCHAR(50) NOT NULL COMMENT '博客id',
  `title` VARCHAR(100) NOT NULL COMMENT '博客標題',
  `author` VARCHAR(30) NOT NULL COMMENT '博客作者',
  `create_time` DATETIME NOT NULL COMMENT '創建時間',
  `views` INT(30) NOT NULL COMMENT '瀏覽量'
) ENGINE=INNODB DEFAULT CHARSET=utf8

(2)新建一個子maven模塊

(3)建立核心配置文件和資源文件

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties resource="db.properties" />

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/MyBaties?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456

(3)建立MyBayisUtil工具類

這個類用用來獲取SqlSessio的。

package com.jms.utils;

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 java.io.IOException;
import java.io.InputStream;

//SqlSessionFactory-->SqlSession
public class MyBatisUtil {

    private static SqlSessionFactory sqlSessionFactory;

    //獲取SqlSessionFactory對象
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //通過SqlSessionFactory獲取SqlSession對象,其中包含了面向資料庫執行執行SQL命令所需要的方法
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession(true);
    }
}

(4)建立實體類Blog

package com.jms.pojo;

import java.util.Date;

public class Blog {
    private String id;
    private String title;
    private String author;
    private Date createTime;
    private int views;

    public Blog() {
    }

    public Blog(String id, String title, String author, Date createTime, int views) {
        this.id = id;
        this.title = title;
        this.author = author;
        this.createTime = createTime;
        this.views = views;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public int getViews() {
        return views;
    }

    public void setViews(int views) {
        this.views = views;
    }

    @Override
    public String toString() {
        return "Blog{" +
                "id='" + id + '\'' +
                ", title='" + title + '\'' +
                ", author='" + author + '\'' +
                ", createTime=" + createTime +
                ", views=" + views +
                '}';
    }
}

並且在mybatis-config.xml核心配置文件中設置別名:

    <typeAliases>
       <typeAlias type="com.jms.pojo.Blog" alias="Blog"/>
    </typeAliases>

(5)建立BlogMapper介面和BlogMapper.xml配置文件

併在其中添加一個插入方法用於測試環境搭建是否成功。

BlogMapper介面

package com.jms.dao;

import com.jms.pojo.Blog;

public interface BlogMapper {
    void insertBlog(Blog blog);
}

BlogMapper.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.jms.dao.BlogMapper">

    <insert id="insertBlog" parameterType="Blog">
        insert into mybaties.blog
        values (#{id},#{title},#{author},#{createTime},#{views})
    </insert>

</mapper>

在核心配置文件mybatis-config.xml中進行mapper映射:

    <mappers>
        <mapper resource="com/jms/dao/BlogMapper.xml"/>
    </mappers>

(6)建立測試類進行測試

import com.jms.dao.BlogMapper;
import com.jms.pojo.Blog;
import com.jms.utils.BuildIdUtil;
import com.jms.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.Date;

public class MapperTest {
    @Test
    public void insertTest() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
        Blog blog = new Blog(BuildIdUtil.buildID(), "learn mybatis day 1", "jms",
                new Date(), 5000);
        blogMapper.insertBlog(blog);
        blog = new Blog(BuildIdUtil.buildID(), "learn mybatis day 2", "jms",
                new Date(), 9999);
        blogMapper.insertBlog(blog);
        blog = new Blog(BuildIdUtil.buildID(), "learn mybatis day 3", "jms",
                new Date(), 1234);
        blogMapper.insertBlog(blog);
        blog = new Blog(BuildIdUtil.buildID(), "learn mybatis day 4", "jms",
                new Date(), 6753);
        blogMapper.insertBlog(blog);
        blog = new Blog(BuildIdUtil.buildID(), "learn mybatis day 5", "jms",
                new Date(), 454);
        blogMapper.insertBlog(blog);
    }
}

測試結果如下:

 

 

 

 至此環境搭建完畢。

2.標簽的使用我們在後續繼續學習。

 

(本文僅作個人學習記錄用,如有紕漏敬請指正)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先推薦《高性能 MySQL》,這本書是 MySQL 領域的經典之作,擁有廣泛的影響力。不但適合資料庫管理員(DBA)閱讀,也適合開發人員參考學習。不管是資料庫新手還是專家,都能從本書中有所收穫。 其次如果你對 MySQL 的內部原理有興趣的話,可以看一下這本書《MySQL 技術內幕:InnoDB ... ...
  • 如果你是準備自學Python或者正在學習,你應該能用得上: ① Python所有方向的學習路線圖,清楚各個方向要學什麼東西 ② 80多節Python課程視頻,涵蓋必備基礎、爬蟲和數據分析 ③ 100多個Python項目源碼,學習不再是只會理論 ④ 龍叔寫的獨家Python圖文教程,手機也能學習 ⑤ ...
  • 前言 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 又到了學Python時刻~ 第三方模塊: requests >>> pip install requests 如果安裝python第三方模塊: win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip instal ...
  • 基本概念 持續集成 (Continuous Intergration) ​ 持續集成的重點在於構建編譯及測試,開發人員每天要提交很多次代碼到分支,在分支合併到主幹前,需要通過編譯和測試識別出問題。持續集成的流程就是通過自動化的構建(主要是構建編譯、自動化測試)來驗證,從而儘早地發現集成錯誤。 持續集 ...
  • 關於static method的解釋 想要解決上面的報錯,我們首先需要瞭解什麼叫做static method(靜態方法)。 靜態方法為類所有,一般情況下我們通過類來使用(而對於不加static的實例方法我們則只能通過對象的來調用)。 以下我們通過一些代碼的例子來對此進行說明: ## 在同一類裡面調用 ...
  • 《Java 核心技術:捲 1 基礎知識》,這本書本來是 Sun 公司的官方用書,是一本 Java 的入門參考書。 對於 Java 初學者來說,是一本非常不錯的值得時常翻閱的技術手冊。 書中有較多地方進行 Java 與 C++ 的比較,因為當時 Java 面世的時候,又被叫作 "C++ Kille... ...
  • Python入門要買什麼書容易上手?Python 是一個有條理強大的面向對象的程式設計語言。需要學習Python基礎知識,下載、安裝、導入庫、字元串處理、函數使用等。Python入門不論什麼書籍,想要熟練掌握知識點就需要多練多寫項目多思考才能進步,不同的書籍適合不同人,一定要選擇適合自己的資料學習。 ...
  • 一、什麼是動態SQL之if語句 if很簡單了,就是滿足條件就執行,不滿足條件不執行。 那麼動態SQL中的if語句是怎麼樣的呢? 首先我們來看一張表blog: 如果我們執行下麵的SQL語句: select * from blog 肯定會將所有的數據都查出來。那麼我們可以在後面加上where條件進行篩選 ...
一周排行
    -Advertisement-
    Play Games
  • MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。 MQTTnet 原理: MQTTnet 是一個用於.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發佈/訂閱、QoS(服務質量)等。其原理涉及以下關鍵概念: MqttCli ...
  • 在WPF中,源屬性(Source Property)指的是提供數據的屬性,通常是數據模型或者其他控制項的屬性,而目標屬性(Target Property)則是數據綁定的目標,通常是綁定到控制項的屬性,例如TextBlock的Text屬性。數據綁定將源屬性的值自動更新到目標屬性中。 主要包含以下幾個事件: ...
  • async/await 是 C# 中非同步編程的關鍵特性,它使得非同步代碼編寫更為簡單和直觀。下麵深入詳細描述了 async/await 的使用場景、優點以及一些高級使用方法,並提供了相應的實例源代碼。 使用場景: I/O 操作: 非同步編程特別適用於涉及 I/O 操作(如文件讀寫、網路請求等)的場景。在 ...
  • 使用過office的visio軟體畫圖的小伙伴都知道,畫圖軟體分為兩部分,左側圖形庫,存放各種圖標,右側是一個畫布,將左側圖形庫的圖標控制項拖拽到右側畫布,就會生成一個新的控制項,並且可以自由拖動。那如何在WPF程式中,實現類似的功能呢?今天就以一個簡單的小例子,簡述如何在WPF中實現控制項的拖拽和拖動,... ...
  • 1、Blazor Hybrid簡介 Blazor Hybrid 使開發人員能夠將桌面和移動本機客戶端框架與 .NET 和 Blazor 結合使用。在 Blazor Hybrid 應用中,Razor 組件在設備上是本機運行的。 這些組件通過本地互操作通道呈現到嵌入式 Web 視圖控制項。 組件不在瀏覽器 ...
  • 除了內置的數據集,scikit-learn還提供了隨機樣本的生成器。通過這些生成器函數,可以生成具有特定特性和分佈的隨機數據集,以幫助進行機器學習演算法的研究、測試和比較。 目前,scikit-learn庫(v1.3.0版)中有20個不同的生成樣本的函數。本篇重點介紹其中幾個具有代表性的函數。 1. ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------002實現通過文件對話框,選擇合適的文件夾,自定義預設的圖片保存位置,簡單易學 ...
  • 每次談到容器的時候,除了Docker之外,都會說起 Kubernetes,那麼什麼是 Kubernetes呢?今天就來一起學快速入門一下 Kubernetes 吧!希望本文對您有所幫助。 Kubernetes,一種用於管理和自動化雲中容器化工作負載的工具。 想象一下你有一個管弦樂隊,將每個音樂家視為 ...
  • 目錄 基本說明 安裝 Nginx 部署 VUE 前端 部署 Django 後端 Django admin 靜態文件(CSS,JS等)丟失的問題 總結 1. 基本說明 本文介紹了在 windows 伺服器下,通過 Nginx 部署 VUE + Django 前後端分離項目。本項目前端運行在 80 埠 ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------003實現最小化程式到托盤運行,- 為了方便截圖乾凈,實現最小化程式到托盤運行,簡潔,勿擾,實現最小化程式到托盤運行, 實現托盤菜單功能,實現回顯主窗體, 實現托盤開始截屏, 實現氣泡信息提示,實現托盤程式提示,實現托盤退出程式, 封裝完... ...