• MyBatis之Collection


    Collection翻译过来,意为"集合"的意思,既然是集合,肯定是代表多个。

    MyBatis以其自身,小巧易懂,闻名于JavaEE。

    传统的JDBC就不说了,Hibernate记得是曾经的持久层框架霸主,记得早在几年前的时候,SSH(Spring+Struts2+Hibernate)是业界中应用最广的。

    Hibernate与MyBatis的区别就不多说了,我的相关文章比如ssm框架整合+Ajax异步验证已经说过了,说过不想再重复。

    关于JDBC+Hibernate+MyBatis的区别可以参考我的这篇博文MyBatis+Hibernate+JDBC对比分析

    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,参数不一致,通常不会报错,但也获取不到数据。


       

  • 相关阅读:
    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介
    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学
    001 Android Studio 首次编译执行项目过程中遇到的几个常见问题
    Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
    Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
    监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
    轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
    轻量级ORM框架——第一篇:Dapper快速学习
    CF888G Xor-MST(异或生成树模板)
  • 原文地址:https://www.cnblogs.com/youcong/p/9296421.html
Copyright © 2020-2023  润新知