国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MyBatis(多表查詢,動態(tài)SQL的使用)

這篇具有很好參考價值的文章主要介紹了MyBatis(多表查詢,動態(tài)SQL的使用)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

多表查詢

?查詢文章詳情

查詢一個用戶底下的所有文章

動態(tài)SQL的使用

if 標簽

trim 標簽

?where 標簽

set 標簽

foreach 標簽


多表查詢

現(xiàn)在有倆張表,一張是文章表,一張是用戶表.如下:

MyBatis(多表查詢,動態(tài)SQL的使用)

MyBatis(多表查詢,動態(tài)SQL的使用)

?查詢文章詳情

我們現(xiàn)在想查詢得到一張表,表里面的內(nèi)容和文章表大多一致,只是要在文章表的基礎上添加用戶表中的username字段,這就需要多表聯(lián)查來實現(xiàn)

用戶類(用戶表的映射)

@Data
public class UserEntity {
    private int id;
    private String username;
    private String password;
    private String photo;
    private LocalDateTime createtime;
    private LocalDateTime updatetime;
    private int state;
}

文章類(文章表的映射)

@Data
public class ArticleInfo {
    private Integer id;
    private String title;
    private String content;
    private LocalDateTime createtime;
    private LocalDateTime updatetime;
    private Integer uid;
    private Integer rcount;
    private int state;
}

文章表拓展(文章表加上用戶表中的username字段的表)

public class ArticleInfoVO extends ArticleInfo {
    private String username;

    //Lombok的toString方法默認是不打印父類的屬性的,所以這里我們要重寫toString方法
    @Override
    public String toString() {
        return "ArticleInfoVO{" +
                "username='" + username + '\'' +
                "} " + super.toString();
    }
}

這里因為Lombok的toString方法默認是不打印父類屬性的,所以我們進行了重寫(方便后續(xù)打印觀察結(jié)果)

實現(xiàn)mapper接口

@Mapper
public interface ArticleMapper {
    //查詢文章詳情
    ArticleInfoVO getDetail(@Param("id") Integer id);
}

實現(xiàn)對應的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.example.demo.mapper.ArticleMapper">
    <select id="getDetail" resultType="com.example.demo.entity.vo.ArticleInfoVO">
        select a.*,u.username from articleinfo a
        left join userinfo u on u.id = a.uid
        where a.id=#{id}
    </select>
</mapper>

單元測試

@SpringBootTest
class ArticleMapperTest {

    @Autowired
    private ArticleMapper articleMapper;
    @Test
    void getDetail() {
        ArticleInfoVO articleInfoVO = articleMapper.getDetail(1);
        System.out.println(articleInfoVO);
    }
}

結(jié)果

MyBatis(多表查詢,動態(tài)SQL的使用)

查詢一個用戶底下的所有文章

主表依然是文章表,對文章表先插入幾條數(shù)據(jù)

MyBatis(多表查詢,動態(tài)SQL的使用)

mapper接口

@Mapper
public interface ArticleMapper {
    List<ArticleInfoVO> getArticleByUid(@Param("uid")Integer uid);
}

?xml

  <select id="getArticleByUid" resultType="com.example.demo.entity.vo.ArticleInfoVO">
        select a.*,u.username from articleinfo a
        left join userinfo u on u.id = a.uid
        where a.uid = #{uid}
    </select>

單元測試

   @Test
    void getArticleByUid() {
        Integer uid = 1;
        List<ArticleInfoVO> list = articleMapper.getArticleByUid(uid);
        list.stream().forEach(System.out::println);
    }

結(jié)果

MyBatis(多表查詢,動態(tài)SQL的使用)

動態(tài)SQL的使用

動態(tài)SQL:允許我們在xml中寫一些邏輯判斷,來實現(xiàn)sql語句的拼接?

例如,在我們填寫表單的時候,一些字段是必須要填的,一些字段是非必須填的,我們要如何實現(xiàn)呢?
難點在于對于一些非必填的字段,我們?nèi)绾螌懖迦氲膕ql語句,這些字段是寫在sql語句中怎么實現(xiàn),用戶填寫這個字段的時候要寫,不填寫這個字段的時候又不需要寫.

if 標簽

現(xiàn)在要上傳用戶信息,我們需要傳遞username,password,photo這個三個字段,這其中username和password是必填的,photo是可填可不填的,我應該如何實現(xiàn)呢?

mapper

int addUser2(UserEntity user);

xml

 <insert id="addUser2">
        insert into userinfo(username,password
        <if test="photo != null">
            ,photo
        </if>
        )values(#{username},#{password}
        <if test="photo != null">
            ,#{photo}
        </if>
        )
    </insert>

if標簽必須要有test(判斷條件),這里面除了要寫到sql語句中的屬性,我們可以直接拿到程序中的參數(shù),而寫入到sql語句中就需要使用#{},${}等方式獲取參數(shù).

單元測試

   @Transactional
    @Test
    void addUser2() {
        String username = "寶寶";
        String password = "123456";
        UserEntity user = new UserEntity();
        user.setUsername(username);
        user.setPassword(password);
        int result = userMapper.addUser2(user);
        System.out.println(result);
    }

結(jié)果

MyBatis(多表查詢,動態(tài)SQL的使用)

可以看到我們傳入username和password生成的sql語句就只有這倆個字段

 @Transactional
    @Test
    void addUser2() {
        String username = "寶寶";
        String password = "123456";
        UserEntity user = new UserEntity();
        user.setUsername(username);
        user.setPassword(password);
        user.setPhoto("cat.png");
        int result = userMapper.addUser2(user);
        System.out.println(result);
    }

MyBatis(多表查詢,動態(tài)SQL的使用)?可以看到同樣的代碼,我們這次多傳入了photo屬性,此時生成的sql語句就有username,password,photo字段了

trim 標簽

上面這個例子,如果username,password,photo都是非必填的(sql語句中的逗號不好處理),此時就需要<trim>標簽了

<trim>標簽的屬性

prefix: 表示整個語句塊,以prefix的值前綴

suffix: 表示整個語句塊,以suffix的值后綴

prefixOverrides: 表示整個語句塊要去除掉前綴

suffixOverrides: 表示整個語句塊要去除掉后綴

現(xiàn)在username,password,photo字段都為非必填,我們要如何實現(xiàn)?

mapper

 int addUser3(UserEntity user);

xml?

<insert id="addUser3">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="username != null">
            username,
        </if>
        <if test="password != null">
            password,
        </if>
        <if test="photo != null">
            photo
        </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="username != null">
                #{username},
        </if>
        <if test="password != null">
                #{password},
        </if>
        <if test="photo != null">
            #{photo}
        </if>
        </trim>
    </insert>

單元測試

 @Transactional
    @Test
    void addUser3() {
        String username = "白楊";
        String password = "123456";
        UserEntity user = new UserEntity();
        user.setUsername(username);
        user.setPassword(password);
        int result = userMapper.addUser3(user);
        System.out.println(result);
    }

結(jié)果

MyBatis(多表查詢,動態(tài)SQL的使用)

?where 標簽

想象一下這種場景:當我們在搜索框輸入文章標題的時候,搜索引擎會根據(jù)這個標題查詢,但是這個標題不是必須填的,我們也可以不輸入文章標題只是輸入了文章標題,搜索引擎會根據(jù)標題查詢,我們要如何實現(xiàn)這個功能呢?

例如現(xiàn)在在搜索框可以輸入標題或者id,或者什么都不輸入

mapper

List<ArticleInfoVO> getListByIdOrTitle(@Param("id")Integer id,@Param("title")String title);

xml

   <select id="getListByIdOrTitle" resultType="com.example.demo.entity.vo.ArticleInfoVO">
        select * from articleinfo
        <where>
            <if test="id!=null and id>0">
                id = #{id}
            </if>
            <if test="title!=null">
                and title like concat('%',#{title},'%')
            </if>
        </where>
    </select>

使用了where標簽好處:1.如果我們什么都沒傳,where后面的判斷語句都為Null,此時where標簽會自動幫我們去掉where.2.當我們只傳了一部分,where標簽會自動幫我們去掉前綴and

單元測試

  @Test
    void getListByIdOrTitle() {
        List<ArticleInfoVO> list = articleMapper.getListByIdOrTitle(null,null);
        System.out.println(list.size());
    }

MyBatis(多表查詢,動態(tài)SQL的使用)

此時我們什么都沒傳,生成的sql語句沒有where

 @Test
    void getListByIdOrTitle() {
        List<ArticleInfoVO> list = articleMapper.getListByIdOrTitle(null,"C語言");
        System.out.println(list.size());
    }

?MyBatis(多表查詢,動態(tài)SQL的使用)

此時我們傳入了標題"C語言",這時生成的sql就有了where判斷語句, 且自動幫我們?nèi)サ袅薬nd

set 標簽

和where標簽很像,當我set標簽里面有信息,生成的sql語句就會生成set去修改內(nèi)容(set會自動幫我們去掉最后一個","),如果set標簽里面沒有信息,生成的sql語句就沒有set

foreach 標簽

<foreach>標簽允許我們傳入一個集合

<foreach>標簽屬性

collection: 綁定方法參數(shù)中的集合,如List,Set,Map或數(shù)組對象

item:遍歷時的每一個對象

open:語句塊開頭字符串

close:語句塊結(jié)束字符串

separator:每次遍歷之間間隔的字符串

利用foreach標簽來進行批量刪除

mapper

// 根據(jù)文章id集合批量刪除文章
    int deleteByIdList(@Param("idList")List<Integer> idList);

xml

<delete id="deleteByIdList">
        delete from articleinfo
        where id in
        <foreach collection="idList" item="id" open="(" close=")" separator="," >
            #{id}
        </foreach>
    </delete>

單元測試

    @Transactional
    @Test
    void deleteByIdList() {
        List<Integer> idList = new ArrayList<>();
        idList.add(1);
        idList.add(2);
        idList.add(3);
        int result = articleMapper.deleteByIdList(idList);
        System.out.println(result);
    }

結(jié)果

MyBatis(多表查詢,動態(tài)SQL的使用)文章來源地址http://www.zghlxwxcb.cn/news/detail-495696.html

到了這里,關于MyBatis(多表查詢,動態(tài)SQL的使用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • SQL語句 - 多表查詢使用詳細介紹

    SQL語句 - 多表查詢使用詳細介紹

    例如我們有一張員工表和部門表, 員工表有6條數(shù)據(jù), 部門表表有4條數(shù)據(jù) : 使用多表查詢, 查詢員工表和部門表兩張表 : 此時查詢到的結(jié)果會有24條數(shù)據(jù), 為什么會這樣呢 ? 笛卡爾積:有A, B兩個集合, 取A, B集合所有組合情況(4*6=24); 我們多表查詢, 更多的是消除這些無效的數(shù)據(jù) 例

    2024年01月16日
    瀏覽(21)
  • MyBatis動態(tài)SQL、模糊查詢與結(jié)果映射

    MyBatis動態(tài)SQL、模糊查詢與結(jié)果映射

    目錄 前言 一、MyBatis動態(tài)SQL 1.動態(tài)SQL是什么 2.動態(tài)SQL的作用 3.常用動態(tài)SQL元素 1. where + if 元素 2. set + if 元素 3. choose + when + otherwise 元素 4. 自定義 trim 元素 ?1. 自定義 trim 元素改寫上面的 where + if 語句 2. 自定義 trim 元素改寫上面的 set + if 語句 5. foreach 元素 6.SQL片段重用 二、

    2024年02月11日
    瀏覽(45)
  • Mybatis 動態(tài)SQL條件查詢(注釋和XML方式都有)

    Mybatis 動態(tài)SQL條件查詢(注釋和XML方式都有)

    需求 : 根據(jù)用戶的輸入情況進行條件查詢 新建了一個 userInfo2Mapper 接口,然后寫下如下代碼,聲明 selectByCondition 這個方法 我們先用XML的方式實現(xiàn) 在resources 中創(chuàng)建 Userinfo2XMLMapper.xml 文件 ?將 Userinfo2XMLMapper.xml 文件中的 namespace 進行修改,改為 userInfo2Mapper 接口中的第一行 package 的

    2024年01月22日
    瀏覽(28)
  • Springboot 封裝整活 Mybatis 動態(tài)查詢條件SQL自動組裝拼接

    Springboot 封裝整活 Mybatis 動態(tài)查詢條件SQL自動組裝拼接

    ps:最近在參與3100保衛(wèi)戰(zhàn),戰(zhàn)況很激烈,剛剛打完仗,來更新一下之前寫了一半的博客。 該篇針對日常寫查詢的時候,那些動態(tài)條件sql 做個簡單的封裝,自動生成(拋磚引玉,搞個小玩具,不喜勿噴)。 來看看我們平時寫那些查詢,基本上都要寫的一些動態(tài)sql: ? 一個字段

    2024年02月12日
    瀏覽(18)
  • MyBatis進階:掌握MyBatis動態(tài)SQL與模糊查詢、結(jié)果映射,讓你在面試中脫穎而出??!

    MyBatis進階:掌握MyBatis動態(tài)SQL與模糊查詢、結(jié)果映射,讓你在面試中脫穎而出!!

    目錄 一、引言 二、MyBatis動態(tài)SQL 2.1.if元素使用 2.2.foreach元素使用 三、MyBatis模糊查詢 ①使用#{字段名} ②使用${字段名} ③使用concat{\\\'%\\\',#{字段名},\\\'%\\\'} 總結(jié) 四、MyBatis結(jié)果映射 4.1.案例演示 4.1.1.resultType進行結(jié)果映射 4.1.2.resultMap進行結(jié)果映射 在當今的軟件開發(fā)環(huán)境中,數(shù)據(jù)庫的使

    2024年02月11日
    瀏覽(22)
  • MyBatis多表查詢

    MyBatis多表查詢

    目錄 1. 多表關系回顧 2. 一對一查詢 2.1 一對一多表查詢方式一:基于標簽進行手動結(jié)果映射封裝? 2.2 一對一多表查詢方式二 - 通過標簽來封裝屬性中所關聯(lián)的對象 3. 一對多查詢 4. 多對多查詢 在項目開發(fā)當中一對一關系的表不常見,因為一對一關系的兩張表通常會合并為一

    2024年02月10日
    瀏覽(43)
  • Mybatis——多表查詢

    Mybatis——多表查詢

    目錄 一、簡介 二、業(yè)務環(huán)境的準備 2.1、準備工作: 2.2、SQL 三、一對一和一對多 Sql語句: POJO ?OrderMapper OrderMapper.xml ?Test測試類 運行結(jié)果 MyBatis 是一個優(yōu)秀的持久層框架,它提供了強大的支持來執(zhí)行數(shù)據(jù)庫操作,包括多表查詢。多表查詢是指從多個數(shù)據(jù)庫表中檢索數(shù)據(jù)的過

    2024年02月02日
    瀏覽(18)
  • Springboot 自定義 Mybatis攔截器,實現(xiàn) 動態(tài)查詢條件SQL自動組裝拼接(玩具)

    Springboot 自定義 Mybatis攔截器,實現(xiàn) 動態(tài)查詢條件SQL自動組裝拼接(玩具)

    ps:最近在參與3100保衛(wèi)戰(zhàn),戰(zhàn)況很激烈,剛剛打完仗,來更新一下之前寫了一半的博客。 該篇針對日常寫查詢的時候,那些動態(tài)條件sql 做個簡單的封裝,自動生成(拋磚引玉,搞個小玩具,不喜勿噴)。 來看看我們平時寫那些查詢,基本上都要寫的一些動態(tài)sql: ? 一個字段

    2024年02月12日
    瀏覽(30)
  • MySQL基礎篇補充 | 多表查詢中使用SQL99實現(xiàn)7種JOIN操作、SQL99語法新特性

    MySQL基礎篇補充 | 多表查詢中使用SQL99實現(xiàn)7種JOIN操作、SQL99語法新特性

    目錄 一:多表查詢中使用SQL99實現(xiàn)7種JOIN操作? 二:SQL99語法新特性 1. 自然連接Natural 2.?USING連接 在多表查詢中,除了遇到最多的內(nèi)連接、左外連接和右外連接,還有其它的連接方式;接下來就聊聊其它的連接方式,如下圖:???????? 并且在正式講解之前,需要先了解

    2024年02月03日
    瀏覽(24)
  • MyBatis多表查詢和注解開發(fā)

    MyBatis多表查詢和注解開發(fā)

    一對一查詢的模型 用戶表和訂單表的關系為, 一個用戶有多個訂單,一個訂單只從屬于一個用戶 一對一查詢的需求:查詢一個訂單,與此同時查詢出該訂單所屬的用戶 一對一查詢的語句 對應的sql語句: 查詢的結(jié)果如下: 創(chuàng)建Order和User實體 創(chuàng)建OrderMapper接口 配置OrderMappe

    2024年02月04日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包