Java後端05(初識MyBatis)

来源:https://www.cnblogs.com/te9uila/archive/2023/08/07/17611810.html
-Advertisement-
Play Games

## Mybatis ### 舉個小慄子 mybatis配置文件(XML配置文件) ```java ``` user.xml(實現增刪改查的sql語句) ```xml insert into user values (#{userId},#{username},#{password}) delete ...


Mybatis

舉個小慄子

mybatis配置文件(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">
<!--通過這個配置文件,完成mybatis與資料庫的連接  -->
<configuration>
<!--mybatis 在實例化的時候,會自動掃描這個包下的所有類,用於後續 sql 語句的 resultType-->
    <typeAliases>
        <package name="com.iweb.entity"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="url" value="jdbc:mysql://localhost:3306/iweb?characterEncoding=utf-8"/>
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/user.xml"/>
    </mappers>
</configuration>

user.xml(實現增刪改查的sql語句)

<?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.iweb.entity">
    <select id="listUser" resultType="User">select * from user</select>
<!--    parameterType:表示傳入的參數類型,可以是基本數據類型,也可以是引用類型
        基本類型中需要註意:如果傳入的參數為整型,參數“_int” 表示 int 類型,參數“int” 表示 Integer 類型-->
    <insert id="addUser" parameterType="User">insert into user values (#{userId},#{username},#{password})</insert>
    <delete id="deleteUser" parameterType="String">delete from user where userId = #{userId}</delete>
    <update id="updateUser" parameterType="User">update user set username = #{username},password = #{password} where userId = #{userId}</update>
    <select id="getUser" parameterType="String" resultType="User">select * from user where userId = #{userId}</select>
<!--    模糊查詢-->
    <select id="listUserByNameLike" parameterType="String" resultType="User">select * from user where username like concat('%',#{0},'%')</select>
<!--    複雜查詢-->
    <select id="listUserByIdAndNameLike" parameterType="map" resultType="User">select * from user where userId > #{userId} and username like concat('%',#{username},'%')</select>
</mapper>

使用做sql查詢(Test)

public void test1() throws IOException {
    private SqlSession sqlSession;
    @Before
    public void init() throws IOException {
        // 輸入流讀取配置文件信息
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 基於配置文件獲取 mybatis 的一級緩存對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 基於這個一級緩存,創建一個二級緩存
        sqlSession = sqlSessionFactory.openSession();
    }

    @Test
    public void test01(){
        // 使用二級緩存實現sql語句調用
        List<User> userList = sqlSession.selectList("listUser");
        // 遍歷集合
        for (User user : userList) {
            System.out.println(user);
        }
    }

    @Test
    public void test02(){
        User user = new User("3","robot01","123456");
        sqlSession.insert("addUser",user);
        // mybatis 需要手動提交緩存
        sqlSession.commit();
        test01();
    }

    @Test
    public void test03(){
        User user = new User();
        user.setUserId("3");
        sqlSession.delete("deleteUser",user);
        sqlSession.commit();
        test01();
    }

    @Test
    public void test04(){
        User user = sqlSession.selectOne("getUser","2");
        System.out.println(user);
    }

    @Test
    public void test05(){
        User user = new User("2","HSS","123456");
        sqlSession.update("updateUser",user);
        sqlSession.commit();
        test01();
    }

    @Test
    public void test06(){
        List<User> users = sqlSession.selectList("listUserByNameLike","ss");
        System.out.println(users);
    }

    @Test
    public void test07(){
        Map<String,Object> params = new HashMap<>();
        params.put("userId",2);
        params.put("username","ss");
        List<User> users = sqlSession.selectList("listUserByIdAndNameLike",params);
        System.out.println(users);
    }
}

一對多關係查詢

配置文件(⭐註意:每一個配置文件都需要在 mybatis-config.xml 中進行註冊!!!!!!!!!)

<resultMap id="productBean" type="Product">
    <id column="productId" property="productId"/>
    <result column="productName" property="productName"/>
    <result column="price" property="price"/>
    <result column="stock" property="stock"/>
    <association property="user" javaType="User">
        <id column="uId" property="userId"/>
        <result column="username" property="username"/>
    </association>
</resultMap>
<!--    多對一關係查詢-->
<select id="listProduct" resultMap="productBean">
    select productName,productId,price,stock,u.userId 'uId',username from product left join user u on product.userId = u.userId
</select>

測試類

public class TestMybatis {
    private SqlSession sqlSession;
    @Before
    public void init() throws IOException {
        // 輸入流讀取配置文件信息
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 基於配置文件獲取 mybatis 的一級緩存對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 基於這個一級緩存,創建一個二級緩存
        sqlSession = sqlSessionFactory.openSession();
    }

    @Test
    public void test01(){
        List<Product> productList = sqlSession.selectList("listProduct");
        for (Product product : productList) {
            System.out.println(product);
        }
    }
}

動態sql查詢

配置文件(⭐註意:每一個配置文件都需要在 mybatis-config.xml 中進行註冊!!!!!!!!!)

<select id="listProduct" resultType="product">
    select * from product
    <if test="productName != null">
        where productName like concat('%',#{productName},'%')
    </if>
</select>

測試類

@Test
public void test01(){
    List<Product> productList = sqlSession.selectList("listProduct");
    for (Product product : productList) {
        System.out.println(product);
    }
}

@Test
public void test02(){
    Map<String,String> params = new HashMap<>();
    params.put("productName","1");
    List<Product> productList = sqlSession.selectList("listProduct",params);
    for (Product product : productList) {
        System.out.println(product);
    }
}

多條件查詢

<!--多條件查詢的矛盾-->
<!--    where 標簽會進行自動判斷,如果所有的 if 條件都不成立,那麼 sql 語句中不會出現 where 關鍵字
        只要有一個條件成立,就會自動去除冗餘的 and,並自動添加 where-->
<select id="listProduct" resultType="Product">
    select * from product
    <where>
        <if test="productName != null">
            and productName like concat('%',#{productName},'%')
        </if>
        <if test="price != 0">
            and price > #{price}
        </if>
    </where>
</select>

測試類

@Test
public void test01(){
    Map<String,Object> params = new HashMap<>();
    params.put("productName","1");
    params.put("price",0);
    List<Product> productList = sqlSession.selectList("listProduct",params);
    for (Product product : productList) {
        System.out.println(product);
    }
}

動態sql更新

<update id="updateProduct">
    update product
    <set>
        <if test="productName != null">
            productName = #{productName},
        </if>
        <if test="price != null">
            price = #{price},
        </if>
        <if test="stock != null">
            stock = #{stock},
        </if>
    </set>
    where productId = #{productId}
</update>

測試類

@Test
public void test01(){
    Map<String,Object> params = new HashMap<>();
    params.put("productId","1");
    params.put("productName","product");
    params.put("price","10086");
    params.put("stock","10000");
    sqlSession.update("updateProduct",params);
    sqlSession.commit();
}

when otherwise 標簽

<mapper namespace="com.iweb.entity">
<!--    mybatis 沒有 else 標簽,只能使用 when otherwise 表示 else,如果提供了任何條件,則進行條件鏟鱘,如果沒有提供任何條件參數,則使用 otherwise 作為條件-->
    <select id="listProduct" resultType="Product">
        select * from product
        <where>
            <choose>
                <when test="productName != null">
                    and name like concat('%',#{productName},'%')
                </when>
                <when test="price != null">
                    and price > #{price}
                </when>
                <otherwise>
                    and id > 5
                </otherwise>
            </choose>
        </where>
    </select>
</mapper>

使用註解方式實現簡單的sql

mapper介面文件(一定要註冊!!!!!!)

/**
 * 通過介面(底層是java的JDK動態代理)實現 mybatis 調用
 * 開發人員只需要關心介面,實現類由 mybatis 動態生成
 * 1. 註解開發方式: 適用於簡單場景(註解場景下編寫一對多 多對一 或者是動態sql非常麻煩)
 * 2. xml配置文件開發方式:適用於所有場景(推薦)
 * @author te9uila
 * @since 2023/8/5
 */
public interface ProductMapper {
    @Insert("insert into product values (#{productId},#{productName},#{price},#{stock},#{userId})")
    void add(Product product);
    @Delete("delete from product where productId = #{productId}")
    void delete(String id);
    @Select("select * from product where productId = #{productId}")
    Product get(String id);
    @Update("update product set productName = #{productName},price = #{price},stock = #{stock} where productId = #{productId}")
    int update(Product product);
    @Select("select * from product")
    List<Product> list();
}

測試類

@Test
public void test01(){
    ProductMapper productMapper = sqlSession.getMapper(ProductMapper.class);
    List<Product> productList = productMapper.list();
    System.out.println(productList);
}

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

-Advertisement-
Play Games
更多相關文章
  • 系統要求 C/S架構的單體桌面應用,可以滿足客戶個性化需求,易於升級和維護。相比於一代Winform,界面要求美觀,控制項豐富可定製。 解決方案 依托.Net6開發平臺,採用模塊化思想設計(即分而治之的策略),每個模塊採用DDD分層設計。前端選用WPF + Prism框架,後端選用ABP + EF框架 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本篇是《quarkus依賴註入》的第九篇 ...
  • import os import pandas as pd def md5(string:str=''): import hashlib md5 = hashlib.md5() md5.update(string.encode('utf-8')) return md5.hexdigest() # I ...
  • 註釋是在執行時被忽略的文本。 註釋可用於解釋代碼,使其更易讀。 註釋還可用於在測試替代代碼時防止代碼執行。 Go支持單行或多行註釋。 ## Go單行註釋 單行註釋以兩個正斜杠(`//`)開頭。 在`//`和行尾之間的任何文本都將被編譯器忽略(不會被執行)。 示例 ```Go // This is a ...
  • ### 寫在前面 > 動態 `SQL` 語句是部分或者整個 `SQL` 語句在運行時才能確定,可以更好的與用戶進行交互,大大提高了`SQL`的靈活性 ### 一、執行SQL語句 #### 1.1 執行無入參SQL ① 語法 ```sql EXECUTE IMMEDIATE SQLStatement ...
  • 本文介紹了 Go 語言中的基本概念,包括變數、數據類型、數據類型轉換以及進位轉換。我們將詳細探討整數、浮點數、字元、布爾值和字元串等數據類型,以及如何在實際編程中高效地使用它們。 ...
  • ## 前言 假設一個場景,服務端部署在內網,客戶端需要通過暴露在公網的nginx與服務端進行通信。為了避免在公網進行 http 明文通信造成的信息泄露,nginx與客戶端之間的通信應當使用 https 協議,並且nginx也要驗證客戶端的身份,也就是mTLS雙向加密認證通信。 這條通信鏈路有三個角色 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本篇是《quarkus依賴註入》系列的第 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...