Mybatis進階

基本知識

resultMap

  • constructor–實例化的時候通過構造器將結果集注入到類中
    • oidArg– ID 參數; 將結果集標記為ID,以方便全局調用
    • oarg–注入構造器的結果集
  • id–結果集ID,將結果集標記為ID,以方便全局調用
  • result–注入一個字段或者javabean屬性的結果
  • association–復雜類型聯合;許多查詢結果合成這個類型
    • 嵌套結果映射– associations能引用自身,或者從其它地方引用
  • collection–復雜類型集合
  • 嵌套結果映射– collections能引用自身,或者從其它地方引用
  • discriminator–使用一個結果值以決定使用哪個resultMap
    • case–基于不同值的結果映射
      • 嵌套結果映射–case也能引用它自身, 所以也能包含這些同樣的元素。它也可以從外部引用resultMap

http://blog.csdn.net/wxwzy738/article/details/24742495

一、一對一關系association

  1. association
    association通常用來映射一對一的關系,例如,有個類user,對應的實體類如下:(getter,setter方法省略)
    private String id;//主鍵
    private String userName;//用戶姓名
    

    有個類Article,對應的實體類如下:
    private String id;//主鍵
    private String articleTitle;//標題
    private String articleContent;//內容
    

    當我想查詢一個用戶的時候,也查到他寫的一篇文章應該如何寫呢?在user類中加入一個屬性article
    private String id;//主鍵
    private String userName;//用戶姓名
    private Article article;//新增的文章屬性
    
  2. mapper.xml 配置
    在user類的mapper.xml中這樣配置
    <resultMap id="userResultMap"  type="test.mybatis.entity.User">
      <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
      <result column="userName" property="userName"/>
    //這里把user的id傳過去
       <association property="article" column="id"                          select="test.mybatis.dao.articleMapper.selectArticleByUserId" />//test.mybatis.dao.articleMapper為命名空間
     </resultMap>
    

    同時,article類的mapper.xml
    <resultMap id="articleResultMap" type="test.mybatis.entity.Article">
      <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
      <result column="articleTitle" property="articleTitle" jdbcType="VARCHAR" javaType="java.lang.String"/>
     <result column="articleContent" property="articleContent" jdbcType="VARCHAR" javaType="java.lang.String"/>
     </resultMap>
      (當然,這里還有查詢user表的語句,省略)
    

    繼續在article的mapper.xml寫下如下
     <select id="selectArticleByUserId"
     parameterType="java.lang.String"
     resultMap="ArticleResultMap" >
     select * from
     tb_article where userId=#{userId}
     </select>
    

二、一對多關系collection

  • 實體類增加對應屬性
 private String id;//主鍵
 private String userName;//用戶姓名
 private List<Article> articleList;
  • userMapper.xml配置
<resultMap id="userResultMap" type="test.mybatis.entity.User">
  <id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/>
  <result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
//這里把user的id傳過去
   <collection property="articleList" column="id"                       
            select="test.mybatis.dao.articleMapper.selectArticleListByUserId" />
 </resultMap>
  • userMapper.xml也可以這樣配置
    question 與questionOption時一對多關系
    <!-- User 連接查詢 方法配置 (一個問題對多個問題選項)  -->
        <resultMap type="Question" id="questionMap">
        <id column="id" property="id"/>
        <result column="display_id" property="displayId"/>
        <result column="question_description" property="description"/>
        <result column="is_deleted" property="isDeleted"/>
        <collection resultMap="optionMap" property="questionOptionList" ofType="QuestionOption"/>
    </resultMap>
    
    <resultMap type="QuestionOption" id="optionMap">
            <id column="option_id" property="id"/>
            <result column="question_id" property="questionId"/>
            <result column="option_descritpion" property="optionDescription" javaType="java.lang.String"/>
            <result column="is_correct" property="isCorrect"/>
    </resultMap>

    <select id="getQuestionById" resultMap="questionMap" parameterType="int">
        <![CDATA[
            select
            B.id as id,
            B.display_id as display_id, 
            B.description as question_description,
            B.is_deleted as is_deleted,
            P.id as option_id,
            P.question_id as question_id,
            P.option_description as option_descritpion,
            P.is_correct as is_correct
            from question B
            left outer join question_option P on (B.id = P.question_id)
            where B.id = #{id}
        ]]>
    </select>

幾點注意

  • 在調用查詢方法的時候異常為runtimeException 不會自己拋出,所以當有問題時,可以用try catch保住查錯
  • result返回的類型記得對應,resultType時為java類 resultMap時填寫類型為map
  • 嵌套查詢,也就是第一種方法查詢時,collectioncolumn為上層主鍵名,也就是說一般為傳入的參數

三、批量更新

  1. 第一種
     <update id="updateQuestionOptions" parameterType="java.util.List">
             <foreach collection="list" item="item" index="index" separator=";">
             UPDATE 
                 question_option
             SET option_description = #{item.optionDescription},is_correct = #{item.isCorrect}
                 
                     WHERE id = #{item.id}
             </foreach>
     </update>
    
    注意末尾要加號separator=";"
  2. 第二中
    <update id="deleteQuestionByIds" parameterType="java.util.List">
            UPDATE 
                question
            SET
                is_deleted = 1,
                updated_time = NOW()
            WHERE id in 
            <foreach collection="list" item="item" index="index"  open="(" separator="," close=")">
                #{item}
            </foreach>
    </update>

注意注意前后要加括號open="(" separator="," close=")"

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的...
    笨鳥慢飛閱讀 5,571評論 0 4
  • 前言 接著上一篇Mybatis入門繼續,上一篇主要演示了Mybatis的基本操作,對數據庫的增刪改查,但是在實際項...
    Real_man閱讀 1,575評論 0 2
  • 對象之間的關系: 關聯關系:A對象依賴B對象,并且把B對象作為A對象的一個屬性,則A和B是依賴關系. ** 按照多...
    CoderZS閱讀 641評論 0 8
  • 每個線程都應該有它自己的SqlSession實例。SqlSession的實例不能共享使用,它是線程不安全的 配置文...
    蕊er閱讀 481評論 0 0
  • 01 小陳今年8歲了,他的房間和桌子都是我幫忙收拾的,如果不是我一定要求他得自己整理書包,他巴不得把整理書包的工作...
    瑞和她的淺島繁花閱讀 668評論 0 12