MyBatis之Collection

Collection翻譯過來,意爲"集合"的意思,既然是集合,確定是表明多個。html

MyBatis以其自身,小巧易懂,聞名於JavaEE。java

傳統的JDBC就不說了,Hibernate記得是曾經的持久層框架霸主,記得早在幾年前的時候,SSH(Spring+Struts2+Hibernate)是業界中應用最廣的。mysql

Hibernate與MyBatis的區別就很少說了,個人相關文章好比ssm框架整合+Ajax異步驗證已經說過了,說過不想再重複。sql

關於JDBC+Hibernate+MyBatis的區別能夠參考個人這篇博文MyBatis+Hibernate+JDBC對比分析mybatis

mybatis的一對一和一對多以及多對多,一對一倒不經常使用,一對多和多對多就比較經常使用了。框架

<!-- 通用查詢映射結果 -->
    <resultMap id="BaseResultMap" type="com.entity.FinanceOrder">
        <id column="order_no" property="orderNo" />
        <result column="user_id" property="userId" />
        <result column="order_type" property="orderType" />
        <result column="pay_type" property="payType" />
        <result column="total_amount" property="totalAmount" />
        <result column="order_status" property="orderStatus" />
        <result column="subject" property="subject" />
        <result column="create_time" property="createTime" />
        <result column="amount_type" property="amountType" />
        <result column="account_coupon_id" property="accountCouponId" />
        <result column="finish_time" property="finishTime" />
        <result column="trade_status" property="tradeStatus" />
        <result column="invoice" property="invoice" />
        <result column="wx_transaction_id" property="wxTransactionId" />
        <result column="use_points" property="usePoints" />
        <result column="points_amount" property="pointsAmount" />
        <result column="balance_amount" property="balanceAmount" />
        <result column="wx_amount" property="wxAmount" />
        <result column="pwd" property="pwd" />
        <result column="remarks" property="remarks" />
        
        <collection property="orderResources" ofType="OrderResources">
             <result column="resource_id" property="resourceId" />
        </collection>
        
        <collection property="orderGuest" ofType="OrderGuest">
            <result column="name" property="name" />
        </collection>
    </resultMap>

    <!-- 獲取當天訂單信息 -->
    <select id="getTodayOrderInfo" resultMap="BaseResultMap"> SELECT order.order_status,order.create_time, order.finish_time,order.total_amount,order.remarks,rms_order_resources.resource_id,rms_order_guest.name FROM rms_finance_order AS `order` LEFT JOIN rms_order_resources ON(order.order_no=rms_order_resources.order_no) LEFT JOIN rms_order_guest ON(order.order_no=rms_order_guest.order_no) WHERE order.company_code=#{companyCode} </select>

這個例子能夠說是一對多,也能夠說是多對多,這並不重要,重要的是你要知道參數的含義。還有就是每當要將sql寫入mybatis對應的配置文件時,必需要在mysql相關的客戶端或者命令行執行一遍,確認沒有問題了,再放入xml配置文件中,這樣能夠避免不少沒必要要的錯誤。異步

有一點補充說明下:
關於javatype和oftype的區別?
javatype指定的是對象的屬性的類型,一般狀況下使用<collection>標籤默認是集合類型,因此一般就不須要寫ArrayList,而oftype指定的是映射到list集合屬性中pojo的類型,例如你在集合中放置的類型例如
    List<OrderResources> list
那麼oftype對應的類型必須是OrderResources類型,若是mybatis沒有對實體進行別名的話,須要寫全路徑,例如個人OrderResources放置在cn.test包下,我就要將oftype寫成cn.test.OrderResources。
否則的話會報找不到類異常。還有要注意的#{companyCode},必需要和參數列表中對應的參數一致,否則會出現兩種結果:
 要麼出現報錯是參數名不對,要麼就是不報錯顯示沒有數據。一般狀況,sql先執行一遍發現是有數據的,並且條件給的如出一轍,這就是須要引發重視了,要麼就是你的參數不對,要麼就是代碼又問題。
我常常遇到的就是參數不對致使沒法返回結果,可是單元測試也不會報錯。這個時候就要重視了,由於正常狀況下經過sql能夠查的出數據,可是對應的方法卻查不到數據也不報錯,最有可能的就是參數名錯了,例如#{companyCode},你可能在前臺寫參數寫成company_code,參數不一致,一般不會報錯,但也獲取不到數據。單元測試

相關文章
相關標籤/搜索