最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis聯(lián)合查詢(xún)XML與注解對(duì)比分析

 更新時(shí)間:2026年03月12日 08:55:38   作者:很倔也很天真  
文章對(duì)比了MyBatis中XML配置方式和注解方式查詢(xún)多表關(guān)聯(lián)的效率和實(shí)現(xiàn)方式,XML配置方式執(zhí)行聯(lián)合查詢(xún)效率較高,但注解方式雖然可以獨(dú)立使用,但在處理復(fù)雜映射時(shí)不如XML靈活

測(cè)試類(lèi)容

XML配置轉(zhuǎn)注解方式

實(shí)體類(lèi)

為了測(cè)試請(qǐng)忽略設(shè)計(jì)是否合理…

User.java

@Alias("User")
public class User {
    private Integer id;
    private String username;
    private String password;
    private Timestamp birthday;
    private Boolean sex;
}

UserInfo.java

@Alias("UserInfo")
public class UserInfo {
    private Integer id;
    private User user;
    private String name;
}

UserMessage.java

@Alias("UserMessage")
public class UserMessage {
    private Integer userId;
    private UserInfo userInfo;
    private List<Message> messages;
}

Message.java

@Alias("Message")
public class Message {
    private Integer id;
    private Integer userId;
    private String content;
    private Timestamp time;
}

三表之間的關(guān)聯(lián)為 userId

XML配置方式

XML配置

<select id="selectUserInfoAndMessages" resultMap="UserMessages">
    select
    ui.id as uiid,
    ui.name as name,
    ui.user_id as info_user_id,
    u.id as user_id,
    u.username
    as username,
    u.password as password,
    u.birthday as birthday,
    u.sex as
    sex,
    um.id as umid,
    um.user_id as um_user_id,
    um.content as content,
    um.time as um_time
    from user_info ui
    left outer join user u on u.id = ui.user_id
    left outer join user_message um
    on u.id = um.user_id
    where u.id = #{id}
</select>
<resultMap type="UserMessage" id="UserMessages">
    <id property="userId" column="user_id" />
    <association property="userInfo" column="info_user_id"
        javaType="UserInfo">
        <id property="id" column="uiid" />
        <result property="name" column="name" />
        <association property="user" column="user_id" javaType="User">
            <id property="id" column="user_id" />
            <result property="username" column="username" />
            <result property="password" column="password" />
            <result property="birthday" column="birthday" />
            <result property="sex" column="sex" />
        </association>
    </association>
    <collection property="messages" javaType="ArrayList"
        ofType="Message">
        <id property="id" column="umid" />
        <result property="userId" column="user_id" />
        <result property="content" column="content" />
        <result property="time" column="um_time" />
    </collection>
</resultMap>

查詢(xún)方法

public List<UserMessage> testSelectUserInfoAndMessages(Integer userId) {
    try (SqlSession session = sessionFactory.openSession()) {
        //映射器方式調(diào)用
        //return session.getMapper(UserMapper.class).selectUserInfoAndMessage(userId);
        return session.selectList("mybatis.dao.mappers.UserMapper.selectUserInfoAndMessages", userId);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

執(zhí)行過(guò)程

==>  Preparing: select ui.id as uiid, ui.name as name, ui.user_id as info_user_id, u.id as user_id, u.username as username, u.password as password, u.birthday as birthday, u.sex as sex, um.id as umid, um.user_id as um_user_id, um.content as content, um.time as um_time from user_info ui left outer join user u on u.id = ui.user_id left outer join user_message um on u.id = um.user_id where u.id = ? 
==> Parameters: 9(Integer)
<==    Columns: uiid, name, info_user_id, user_id, username, password, birthday, sex, umid, um_user_id, content, um_time
<==        Row: 5, 江流, 9, 9, test中文2, 1234567, 2018-07-17 17:04:09.0, 0, 1, 9, 信息1, 2018-07-18 11:36:58.0
<==        Row: 5, 江流, 9, 9, test中文2, 1234567, 2018-07-17 17:04:09.0, 0, 2, 9, 信息2, 2018-07-18 11:37:05.0
<==      Total: 2

結(jié)果

[UserMessage [userId=9, userInfo=UserInfo [id=5, user=User [id=9, username=test中文2, password=1234567, birthday=2018-07-17 17:04:09.0, sex=false], name=江流], messages=[Message [id=1, userId=9, content=信息1, time=2018-07-18 11:36:58.0], Message [id=2, userId=9, content=信息2, time=2018-07-18 11:37:05.0]]]]

此種方式只查詢(xún)了一次,結(jié)果集被過(guò)濾了重復(fù)項(xiàng)目,最終集合中只有一個(gè)UserMessage對(duì)象。

注解方式

注解方法

@Select("select * from user where id = #{userId}")
@Results(value = {
        @Result(property="userId" , column="id"),
        @Result(property="userInfo" , column="id", one = @One(select="mybatis.dao.mappers.UserMapper.getUserInfoByAnnotation")),
        @Result(property="messages" , column = "id" , many= @Many(select="mybatis.dao.mappers.UserMapper.getUserMessagesByAnnotation"))
})
public List<UserMessage> selectUserInfoAndMessagesByAnnotation(Integer userId);//查詢(xún)用戶信息和用戶消息

@Select("select * from user_info where user_id = #{userId}")
@Results(value={
        @Result(property="id" , column="id"),
        @Result(property="name" , column = "name"),
        @Result(property="user" , column = "user_id" , one = @One(select="mybatis.dao.mappers.UserMapper.getUserByAnnotation"))
})
public UserInfo getUserInfoByAnnotation(Integer userId);//查詢(xún)用戶信息

@Select("select * from user where id = #{userId}")
public User getUserByAnnotation(Integer userId);//查詢(xún)用戶

@Select("select * from user_message where user_id = #{userId}")
public List<Message> getUserMessagesByAnnotation(Integer userId);//查詢(xún)用戶消息集合

查詢(xún)方法

public List<UserMessage> testSelectUserMessagesByAnnotation(Integer userId) {
    try (SqlSession session = sessionFactory.openSession()) {
        return session.getMapper(UserMapper.class).selectUserInfoAndMessagesByAnnotation(userId);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

執(zhí)行過(guò)程

==>  Preparing: select * from user where id = ? 
==> Parameters: 9(Integer)
<==    Columns: id, username, password, sex, birthday
<==        Row: 9, test中文2, 1234567, 0, 2018-07-17 17:04:09.0
====>  Preparing: select * from user_info where user_id = ? 
====> Parameters: 9(Integer)
<====    Columns: id, user_id, name
<====        Row: 5, 9, 江流
======>  Preparing: select * from user where id = ? 
======> Parameters: 9(Integer)
<======    Columns: id, username, password, sex, birthday
<======        Row: 9, test中文2, 1234567, 0, 2018-07-17 17:04:09.0
<======      Total: 1
<====      Total: 1
====>  Preparing: select * from user_message where user_id = ? 
====> Parameters: 9(Integer)
<====    Columns: id, user_id, content, time
<====        Row: 1, 9, 信息1, 2018-07-18 11:36:58.0
<====        Row: 2, 9, 信息2, 2018-07-18 11:37:05.0
<====      Total: 2
<==      Total: 1

可以看出執(zhí)行了幾次查詢(xún)語(yǔ)句。

結(jié)果

[UserMessage [userId=9, userInfo=UserInfo [id=5, user=User [id=9, username=test中文2, password=1234567, birthday=2018-07-17 17:04:09.0, sex=false], name=江流], messages=[Message [id=1, userId=9, content=信息1, time=2018-07-18 11:36:58.0], Message [id=2, userId=9, content=信息2, time=2018-07-18 11:37:05.0]]]]

總結(jié)

  • XML執(zhí)行聯(lián)合查詢(xún)效率是要高一些的
  • 注解方式方法倒是可以獨(dú)立使用,雖然XML也可以用select屬性
  • 混合使用更好

套用官方的話

1、因?yàn)樽畛踉O(shè)計(jì)時(shí),MyBatis 是一個(gè) XML 驅(qū)動(dòng)的框架。配置信息是基于 XML 的,而且映射語(yǔ)句也是定義在 XML 中的。而到了 MyBatis 3,就有新選擇了。MyBatis 3 構(gòu)建在全面且強(qiáng)大的基于 Java 語(yǔ)言的配置 API 之上。這個(gè)配置 API 是基于 XML 的 MyBatis 配置的基礎(chǔ),也是新的基于注解配置的基礎(chǔ)。注解提供了一種簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)簡(jiǎn)單映射語(yǔ)句,而不會(huì)引入大量的開(kāi)銷(xiāo)。

2、注意 不幸的是,Java 注解的的表達(dá)力和靈活性十分有限。盡管很多時(shí)間都花在調(diào)查、設(shè)計(jì)和試驗(yàn)上,最強(qiáng)大的 MyBatis 映射并不能用注解來(lái)構(gòu)建——并不是在開(kāi)玩笑,的確是這樣。比方說(shuō),C#屬性就沒(méi)有這些限制,因此 MyBatis.NET 將會(huì)比 XML 有更豐富的選擇。也就是說(shuō),基于 Java 注解的配置離不開(kāi)它的特性。

附 數(shù)據(jù)表SQL

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(25) DEFAULT NULL,
  `password` varchar(25) DEFAULT NULL,
  `sex` bit(1) DEFAULT b'1',
  `birthday` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

CREATE TABLE `user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `name` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `user_info_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE `user_message` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `content` varchar(255) DEFAULT NULL,
  `time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `message_ibfk_1` (`user_id`),
  CONSTRAINT `user_message_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中out.print和out.write的方法

    java中out.print和out.write的方法

    本文用一個(gè)小例子說(shuō)明java out.print和out.write的方法,大家參考使用吧
    2013-11-11
  • java如何讀取Excel簡(jiǎn)單模板

    java如何讀取Excel簡(jiǎn)單模板

    這篇文章主要為大家詳細(xì)介紹了java如何讀取Excel簡(jiǎn)單模板,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 一文看懂JAVA設(shè)計(jì)模式之工廠模式

    一文看懂JAVA設(shè)計(jì)模式之工廠模式

    本文主要介紹了JAVA中設(shè)計(jì)模式的工廠模式,文中講解非常詳細(xì),代碼幫助大家更好的學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 如何自定義MyBatis攔截器更改表名

    如何自定義MyBatis攔截器更改表名

    自定義MyBatis攔截器可以在方法執(zhí)行前后插入自己的邏輯,這非常有利于擴(kuò)展和定制 MyBatis 的功能,本篇文章實(shí)現(xiàn)自定義一個(gè)攔截器去改變要插入或者查詢(xún)的數(shù)據(jù)源?,需要的朋友可以參考下
    2023-10-10
  • Java中的ReentrantLock解讀

    Java中的ReentrantLock解讀

    這篇文章主要介紹了Java中的ReentrantLock解讀,ReentantLock是java中重入鎖的實(shí)現(xiàn),一次只能有一個(gè)線程來(lái)持有鎖,包含三個(gè)內(nèi)部類(lèi),Sync、NonFairSync、FairSync,需要的朋友可以參考下
    2023-09-09
  • Java?九宮重排(滿分解法)

    Java?九宮重排(滿分解法)

    本文主要介紹了Java?九宮重排(滿分解法),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 面試題:Java中如何停止線程的方法

    面試題:Java中如何停止線程的方法

    這篇文章主要介紹了Java中如何停止線程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作

    java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作

    UDP是與TCP相對(duì)應(yīng)的協(xié)議,UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境。正因?yàn)閁DP協(xié)議沒(méi)有連接的過(guò)程,所以它的通信效率高;但也正因?yàn)槿绱耍目煽啃圆蝗鏣CP協(xié)議高,本文給大家介紹java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作,感興趣的朋友一起看看吧
    2021-10-10
  • MessageUtils.message("user.jcaptcha.expire")問(wèn)題及解決

    MessageUtils.message("user.jcaptcha.expire")問(wèn)題及解決

    文章介紹了若依項(xiàng)目中的國(guó)際化工具M(jìn)essageUtils,用于根據(jù)不同語(yǔ)言環(huán)境獲取驗(yàn)證碼過(guò)期提示信息,通過(guò)Spring的MessageSource讀取多語(yǔ)言配置文件實(shí)現(xiàn),并詳細(xì)描述了其作用、配置文件位置、底層原理及觸發(fā)場(chǎng)景
    2026-04-04
  • springboot?集成activemq項(xiàng)目配置方法

    springboot?集成activemq項(xiàng)目配置方法

    這篇文章主要介紹了springboot?集成activemq項(xiàng)目配置方法,e-car項(xiàng)目配置通過(guò)引入activemq依賴(lài),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04

最新評(píng)論

当雄县| 师宗县| 云梦县| 蓬安县| 汶川县| 房山区| 顺平县| 开阳县| 巩义市| 汉源县| 宁阳县| 镶黄旗| 桂平市| 阿拉善左旗| 株洲县| 满洲里市| 文安县| 丽江市| 平阴县| 佳木斯市| 八宿县| 乌拉特中旗| 大宁县| 来凤县| 镇宁| 九江市| 城固县| 汕头市| 洛南县| 抚宁县| 台安县| 建阳市| 德安县| 浠水县| 堆龙德庆县| 涿鹿县| 盖州市| 石楼县| 阳高县| 清水河县| 嫩江县|