zoukankan      html  css  js  c++  java
  • difference between collection and association mapping in mybatis 3

    Mybatis处理“一对多”的关系时,需要用到associasion元素。处理”多对一“用collection元素来实现(这两个元素在之前mapper文件中提到过)。

    本例子中,假设一名User可以有多个Orders,用associasion来实现关联关系

    首先数据库表结构

    CREATE TABLE `user` (
      `id` int(8) NOT NULL AUTO_INCREMENT,
      `username` varchar(20) COLLATE utf8_bin NOT NULL,
      `usernumber` varchar(20) COLLATE utf8_bin NOT NULL,
      `loginname` varchar(20) COLLATE utf8_bin NOT NULL,
      `loginpassword` varchar(20) COLLATE utf8_bin NOT NULL,
      `sex` varchar(4) COLLATE utf8_bin DEFAULT NULL,
      `birthday` date DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    
    //orders表中为user_id添加外键,指向user表的id
    CREATE TABLE `orders` (
      `oid` int(8) NOT NULL AUTO_INCREMENT,
      `orderid` varchar(20) COLLATE utf8_bin NOT NULL,
      `message` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `user_id` int(8) NOT NULL,
      PRIMARY KEY (`oid`),
      KEY `1001` (`user_id`),
      CONSTRAINT `1001` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Orders实体类

            public int oid;
            public String orderid;
            public String message;
            public User user;
           //省略get/set方法

    Order对象的sql映射文件,order.xml

    <mapper namespace="com.mybaits.dao.impl.OrdersImpl">
            <resultMap type="com.mybaits.bean.User" id="userResult">
                    <id property="id" column="id" />
                    <result property="username" column="username"/>
                    <result property="usernumber" column="usernumber"/>
                    <result property="loginname" column="loginname"/>
                    <result property="loginpassword" column="loginpassword"/>
                    <result property="sex" column="sex"/>
                    <result property="birthday" column="birthday" />
            </resultMap>
            
            <resultMap type="com.mybaits.bean.Orders" id="orderResult">
                <id property="oid" column="oid"/>
                <result property="orderid" column="orderid"/>
                <result property="message" column="message"/>
            
                <association property="user" column="user_id" javaType="com.mybaits.bean.User" jdbcType="INTEGER" resultMap="userResult">
                </association>
            </resultMap>
            
            <select id="findAllOrders" resultMap="orderResult">
                select * from orders o left join user u on o.user_id=u.id
            </select>
            
            <insert id="saveOrder" parameterType="Orders">
                insert into orders (orderid,message,user_id) values(#{orderid},#{message},#{user.id})
            </insert>
            
    </mapper><!--使用resultMap属性引用上面的User实体映射-->

    OrderTest类

    @Test
        public void Test2(){
            List<Orders> l=order.findOrders();
            for(int i=0;i<l.size();i++){
                System.out.println(l.get(i));
            }
        }
    订单编号:10001    订单信息:订单1    下单用户:BN
    订单编号:10002    订单信息:订单2    下单用户:BN
    订单编号:10003    订单信息:订单3    下单用户:qwe
    订单编号:10004    订单信息:订单4    下单用户:qwe
    订单编号:10005    订单信息:订单5    下单用户:JAVA

    利用collection在User对象中关联

    1.在User中添加 List<Orders> orders 属性

    private List<Orders> orders=new ArrayList<Orders>();//get/set方法

    2.User的sql映射文件user.xml

       <resultMap type="com.mybaits.bean.User" id="userResult">
                    <id property="id" column="id" />
                    <result property="username" column="username"/>
                    <result property="usernumber" column="usernumber"/>
                    <result property="loginname" column="loginname"/>
                    <result property="loginpassword" column="loginpassword"/>
                    <result property="sex" column="sex"/>
                    <result property="birthday" column="birthday" />
                     //collection元素映射 user对象中order的集合属性,resultMap指向下面的order的resultMap
                    <collection property="orders" ofType="Orders" resultMap="orderResult"></collection>
            </resultMap>
           <resultMap type="com.mybaits.bean.Orders" id="orderResult">
                <id property="oid" column="oid"/>
                <result property="orderid" column="orderid"/>
                <result property="message" column="message"/>
            </resultMap>
          <select id="getUOBN" parameterType="string" resultMap="userResult"> 
                 select * from user u left join orders o on o.user_id=u.id where u.usernumber=#{usernumber}     
              </select>

    3.测试类

    @Test
        public void Test11(){
            User u=userDao.findUserOrders("01111001");
            System.out.println("用户:"+u.getUsername()+"
    订单总数:"+u.getOrders().size());
            for(Orders o:u.getOrders()){
                System.out.println("订单号:"+o.getOrderid()+"	订单信息:"+o.getMessage());
            }
            
        }
    
    用户:BN
    订单总数:2
    订单号:10001    订单信息:订单1
    订单号:10002    订单信息:订单2

    http://www.voidcn.com/blog/fqf_520/article/p-4973660.html

    I am going to assume that you have a many to many relationship between Projects and Employees, which is why you created a Project Assignment table. This Project Assignment table / object may only have two fields/columns: a mapping of project id to employee id - a classic "bridge table" (aka "join" or "junction" table).

    When you map this model to an object graph, you have three options:

    A Project object can have a list of all employees assigned to it
    An Employee object can have a list of projects s/he is assigned to
    Create a Project Assignment object that has a mapping of each projects to its employee and each employee to his/her project.
    In your example you chose the last option.

    Association

    An association is a single mapping for a "has-one" relationship.

    Suppose an Employee can only be assigned to one Project at a time. Some models call this a "has-one" or "belongs to" relationship. If you want to make Employee your "primary" focus in the object graph, then you would map it with an association to his/her Project:

    <resultMap id="employeeResultMap" type="Employee">
    <constructor>
    <idArg column="employee_id" javaType="_integer"/>
    </constructor>
    <result property="firstName" column="first_name"/>
    <result property="lastName" column="last_name"/>
    <!-- etc. for other simple properties of Employee -->

    <!-- Project is a "complex property" of Employee, so we use an -->
    <!-- association to grab all of the Projects properties also -->
    <association property="assignedProject" resultMap="projectResultMap"/>
    </resultMap>
    In this case your objects would look like this:

    public Employee {
    int id;
    String firstName;
    String lastName
    Project assignedProject;
    }

    public Project {
    int id;
    String name;
    String abc;
    }


    Collection

    An collection is a "list" or "set" of associations.

    Now model the inverse - we make Project the primary focus. A Project has a "has-many" relationship with Employee, so it will have a list or collection of those, so we use a "collection" mapping:

    <resultMap id="projectResultMap" type="Project">
    <constructor>
    <idArg column="project_id" javaType="_integer"/>
    <arg column="name" javaType="String"/>
    </constructor>
    <result property="abc" column="abc"/>

    <!-- This tells mybatis that there can be multiple Employees -->
    <!-- to look up and get their properties -->
    <collection property="employees" ofType="Employee">
    <constructor>
    <idArg column="employee_id" javaType="_integer"/>
    </constructor>
    <result property="firstName" column="first_name"/>
    <result property="lastName" column="last_name"/>
    </collection>
    </resultMap>
    Now your objects would look like this:

    public Employee {
    int id;
    String firstName;
    String lastName
    }

    public Project {
    int id;
    String name;
    String abc;
    List<Employee> employees;
    }


    Project Association

    To have a Project Association object, you would either need:

    A single Project Association object that maps all projects to employees and vice versa
    One Project Association object per project, mapping a project to its employees
    One Project Association object per employee, mapping an employee to his/her projects
    The first option is rather complex and messy - you would be trying to do relational mapping with object graphs (hash tables most likely).

    I would choose to make one of the entities (Project or Employee) the primary focus and then model it as I showed above. The one case I didn't cover is if Employee is your primary focus and an Employee can be on multiple projects, then make that a "has-many" relationship using a collection rather than the association I used above.

    Final Note: if it would help to see examples of using a "has-one" association and a "has-many" collection, see the MyBatis Koans I created: https://github.com/midpeter444/mybatis-koans. Koans 10 and 11 demonstrate this.

    http://stackoverflow.com/questions/12425384/difference-between-collection-and-association-mapping-in-mybatis-3
    http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html


    https://github.com/ShawnyXiao/SpringBoot-MyBatis
    https://github.com/oneone1995/M-Volunteer-SpringBoot


    待确定:
    https://github.com/sunlightcs/renren-security







  • 相关阅读:
    map函数
    修改文件夹所有者权限
    [Python]Python基础趣讲精练
    jmeter生成随机字符串
    Jmeter生成8位不重复的随机数
    Jmeter接口测试使用总结
    Jmeter模拟多个号码注册
    Jmeter实现多用户注册登录
    jmeter 生成随机数(手机号)&随机中文字符
    python接口自动化如何封装获取常量的类
  • 原文地址:https://www.cnblogs.com/softidea/p/6705648.html
Copyright © 2011-2022 走看看