1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        你還在手寫(xiě) join 聯(lián)表查詢?MyBatis-Plus 這樣寫(xiě)太香了!

        共 14572字,需瀏覽 30分鐘

         ·

        2023-03-11 01:04

        點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

        推薦閱讀:

        勸大家別再搞老舊的 Spring Cloud 了!

        Spring Cloud 2022 正式發(fā)布!


        使用方法

        安裝

        Maven

        <dependency>
            <groupId>com.github.yulichang</groupId>
            <artifactId>mybatis-plus-join</artifactId>
            <version>1.2.4</version>
        </dependency>

        Gradle

         implementation 'com.github.yulichang:mybatis-plus-join:1.2.4'

        或者clone代碼到本地執(zhí)行 mvn install, 再引入以上依賴

        推薦一個(gè)開(kāi)源免費(fèi)的 Spring Boot 最全教程:

        https://github.com/javastacks/spring-boot-best-practice

        使用

        • mapper繼承MPJBaseMapper (必選)
        • service繼承MPJBaseService (可選)
        • serviceImpl繼承MPJBaseServiceImpl (可選)

        核心類 MPJLambdaWrapper和MPJQueryWrapper

        MPJLambdaWrapper用法

        簡(jiǎn)單的三表查詢

        class test {
            @Resource
            private UserMapper userMapper;

            void testJoin() {
                List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
                        new MPJLambdaWrapper<UserDO>()
                                .selectAll(UserDO.class)
                                .select(UserAddressDO::getTel)
                                .selectAs(UserAddressDO::getAddressUserDTO::getUserAddress)
                                .select(AreaDO::getProvinceAreaDO::getCity)
                                .leftJoin(UserAddressDO.classUserAddressDO::getUserIdUserDO::getId)
                                .leftJoin(AreaDO.classAreaDO::getIdUserAddressDO::getAreaId)
                                .eq(UserDO::getId, 1)
                                .like(UserAddressDO::getTel, "1")
                                .gt(UserDO::getId, 5))
        ;
            }
        }

        對(duì)應(yīng)sql

        SELECT 
            t.id,
            t.name,
            t.sex,
            t.head_img,
            t1.tel,
            t1.address AS userAddress,
            t2.province,
            t2.city 
        FROM 
            user t 
            LEFT JOIN user_address t1 ON t1.user_id = t.id 
            LEFT JOIN area t2 ON t2.id = t1.area_id 
        WHERE (
            t.id = ? 
            AND t1.tel LIKE ? 
            AND t.id > ?)

        說(shuō)明:

        分頁(yè)查詢

        class test {
            @Resource
            private UserMapper userMapper;

            void testJoin() {
                IPage<UserDTO> iPage = userMapper.selectJoinPage(new Page<>(210), UserDTO.class,
                        new MPJLambdaWrapper<UserDO>()
                                .selectAll(UserDO.class)
                                .select(UserAddressDO::getTel)
                                .selectAs(UserAddressDO::getAddressUserDTO::getUserAddress)
                                .select(AreaDO::getProvinceAreaDO::getCity)
                                .leftJoin(UserAddressDO.classUserAddressDO::getUserIdUserDO::getId)
                                .leftJoin(AreaDO.classAreaDO::getIdUserAddressDO::getAreaId))
        ;
            }
        }

        對(duì)應(yīng)sql

        SELECT 
            t.id,
            t.name,
            t.sex,
            t.head_img,
            t1.tel,
            t1.address AS userAddress,
            t2.province,
            t2.city
        FROM 
            user t
            LEFT JOIN user_address t1 ON t1.user_id = t.id
            LEFT JOIN area t2 ON t2.id = t1.area_id
        LIMIT ?,?

        MPJQueryWrapper

        簡(jiǎn)單的3表查詢

        class test {
            @Resource
            private UserMapper userMapper;

            void testJoin() {
                List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
                        new MPJQueryWrapper<UserDO>()
                                .selectAll(UserDO.class)
                                .select("addr.tel", "addr.address", "a.province")
                                .leftJoin("user_address addr on t.id 
        = addr.user_id")
                                .rightJoin("
        area a on addr.area_id = a.id")
                                .like("
        addr.tel", "1")
                                .le("
        a.province", "1"));
            }
        }

        對(duì)應(yīng)sql

        SELECT 
            t.id,
            t.name,
            t.sex,
            t.head_img,
            addr.tel,
            addr.address,
            a.province
        FROM 
            user t
            LEFT JOIN user_address addr on t.id = addr.user_id
            RIGHT JOIN area a on addr.area_id = a.id
        WHERE (
            addr.tel LIKE ?
            AND a.province <= ?)

        另外,如果你近期準(zhǔn)備面試跳槽,建議在Java面試庫(kù)小程序在線刷題,涵蓋 2000+ 道 Java 面試題,幾乎覆蓋了所有主流技術(shù)面試題。

        說(shuō)明:

        • UserDTO.class 查詢結(jié)果類(resultType)
        • selectAll(UserDO.class) 查詢主表全部字段(主表實(shí)體類)默認(rèn)主表別名 "t"
        • select() mp的select策略是覆蓋,以最后一次為準(zhǔn),這里的策略是追加,可以一直select 主表字段可以用lambda,會(huì)自動(dòng)添加表別名,主表別名默認(rèn)是 t ,非主表字段必須帶別名查詢
        • leftJoin() rightJoin() innerJoin() 傳sql片段 格式 (表 + 別名 + 關(guān)聯(lián)條件)
        • 條件查詢,可以查詢主表以及參與連接的所有表的字段,全部調(diào)用mp原生的方法,正常使用沒(méi)有sql注入風(fēng)險(xiǎn)

        分頁(yè)查詢

        class test {
            @Resource
            private UserMapper userMapper;

            void testJoin() {
                IPage<UserDTO> page = userMapper.selectJoinPage(new Page<>(110), UserDTO.class,
                        new MPJQueryWrapper<UserDO>()
                                .selectAll(UserDO.class)
                                .select("addr.tel", "addr.address")
                                .select("a.province")
                                .leftJoin("user_address addr on t.id 
        = addr.user_id")
                                .rightJoin("
        area a on addr.area_id = a.id"));
            }
        }

        對(duì)應(yīng)sql

        SELECT 
            t.id,
            t.name,
            t.sex,
            t.head_img,
            addr.tel,
            addr.address,
            a.province
        FROM 
            user t
            LEFT JOIN user_address addr on t.id = addr.user_id
            RIGHT JOIN area a on addr.area_id = a.id 
        LIMIT ?,?

        還可以這么操作,但不建議

        class test {
            @Resource
            private UserMapper userMapper;

            void testJoin() {
                List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
                        new MPJQueryWrapper<UserDO>()
                                .selectAll(UserDO.class)
                                .select("addr.tel", "addr.address")
                                //行列轉(zhuǎn)換
                                .select("CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex")
                                //求和函數(shù)
                                .select("sum(a.provinceAS province")
                                //自定義數(shù)據(jù)集
                                .leftJoin("(select * from user_addressaddr on t.id 
        = addr.user_id")
                                .rightJoin("
        area a on addr.area_id = a.id")
                                .like("
        addr.tel", "1")
                                .le("
        a.province", "1")
                                .orderByDesc("
        addr.id"));
            }
        }

        對(duì)應(yīng)sql

        SELECT 
            t.id,
            t.name,
            t.sex,
            t.head_img,
            addr.tel,
            addr.address,
            CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex,
            sum(a.province) AS province
        FROM 
            user t
            LEFT JOIN (select * from user_address) addr on t.id = addr.user_id
            RIGHT JOIN area a on addr.area_id = a.id
        WHERE (
            addr.tel LIKE ?
            AND a.province <= ?)
        ORDER BY
            addr.id DESC

        作者:陽(yáng)宗德
        鏈接:https://juejin.cn/post/7110405284811522085

        End


        Spring 旗下最牛逼的國(guó)產(chǎn)項(xiàng)目!

        23 種設(shè)計(jì)模式實(shí)戰(zhàn)(很全)

        Spring Boot 3.0 正式發(fā)布,王炸!!

        Spring Cloud Alibaba 最新重磅發(fā)布!

        Nacos 2.2 正式發(fā)布,這次更新太炸了!

        Spring Cloud 微服務(wù)最新課程!

        瀏覽 57
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            轻点好疼你的太大了 | 欧洲免费黄色片 | 无码成A毛片免费 | av男人天堂av | 精品久久久久成人片中文字幕 | 成人无码A级毛片免费花嫁 | 亚洲免费黄色网 | 黑人粗黑的性器撕裂哭喊 | 午夜精品三级久久久有码 | 欧美一级在线观看 |