zoukankan      html  css  js  c++  java
  • mybatis关系映射之一对多和多对一

    一. 简介:

    本实例使用顾客和订单的例子做说明: 一个顾客可以有多个订单, 一个订单只对应一个顾客

    二. 例子:

    1. 代码结构图:

    2. 建表语句:

    CREATE DATABASE test;    
      
    USE test;  
      
    CREATE TABLE person(  
      personId VARCHAR(36) PRIMARY KEY,  
      personName VARCHAR(64),  
      personAddress VARCHAR(128),  
      personTel VARCHAR(11)  
    );  
      
    CREATE TABLE orders(  
      orderId VARCHAR(36) PRIMARY KEY,  
      orderNumber VARCHAR(20),  
      orderPrice INT,  
      pid VARCHAR(36)  
    );  
      
    INSERT INTO person VALUES('001', 'Jack', 'Wuhan', '1234567');  
    INSERT INTO orders VALUES('O_00001', '00001', 100, '001');  
    INSERT INTO orders VALUES('O_00002', '00002', 200, '001');  
      
    SELECT p.*, o.*  
    FROM person p   
      JOIN orders o ON (p.personId=o.pid)  
    WHERE p.personId = '001'  
    

    3. 顾客实体:

    /** 
     * 客户实体  
     */  
    public class Person {  
      
        private String id;  
        private String name;  
        private String address;  
        private String tel;  
          
        private List<Order> orders;  
          
        @Override  
        public String toString() {  
            return "{id: " + id + ", name: " + name + ", address: " + address + ", tel: " + tel + "}";  
        }  
    }  
    

    4. 订单实体:

    /** 
     * 订单实体 
     */  
    public class Order {  
      
        private String id;  
        private String number;  
        private int price;  
          
        private Person person;   
          
        @Override  
        public String toString() {  
            return "{id: " + id + ", number: " + number + ", price: " + price + "}";  
        }  
      
    }  
    

    5. 一对多实体配置: Person.xml

    <?xml version="1.0" encoding="UTF-8" ?>  
    <!DOCTYPE mapper  
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
    <mapper namespace="com.zdp.domain.Person">  
      
        <resultMap type="Person" id="personBean">  
            <id column="personId" property="id"/>  
            <result column="personName" property="name"/>  
            <result column="personAddress" property="address"/>  
            <result column="personTel" property="tel"/>  
              
            <!-- 一对多的关系 -->  
            <!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 -->  
            <collection property="orders" ofType="Order">  
                <id column="orderId" property="id"/>  
                <result column="orderNumber" property="number"/>  
                <result column="orderPrice" property="price"/>  
            </collection>  
        </resultMap>  
          
        <!-- 根据id查询Person, 关联将Orders查询出来 -->  
        <select id="selectPersonById" parameterType="string" resultMap="personBean">  
            select p.*, o.* from person p, orders o where p.personId  = o.pid and p.personId = #{id}  
        </select>  
          
    </mapper>  
    

    6. 多对一实体配置:

    <?xml version="1.0" encoding="UTF-8" ?>  
    <!DOCTYPE mapper  
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
    <mapper namespace="com.zdp.domain.Order">  
        <resultMap type="Order" id="orderBean">  
            <id column="orderId" property="id"/>  
            <result column="orderNumber" property="number"/>  
            <result column="orderPrice" property="price"/>  
              
            <!-- 多对一的关系 -->  
            <!-- property: 指的是属性的值, javaType:指的是属性的类型-->  
            <association property="person" javaType="Person">  
                <id column="personId" property="id"/>  
                <result column="personName" property="name"/>  
                <result column="personAddress" property="address"/>  
                <result column="personTel" property="tel"/>  
            </association>  
        </resultMap>  
          
        <!-- 根据id查询Order, 关联将Person查询出来 -->  
        <select id="selectOrderById" parameterType="string" resultMap="orderBean">  
            select p.*, o.* from person p, orders o where p.personId  = o.pid and o.orderId = #{id}  
        </select>  
          
    </mapper>  
    

    7. 总配置: sqlMapConfig.xml

    <?xml version="1.0" encoding="UTF-8" ?>  
    <!DOCTYPE configuration  
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
    "http://mybatis.org/dtd/mybatis-3-config.dtd">  
    <configuration>  
        <typeAliases>  
            <typeAlias type="com.zdp.domain.Person" alias="Person"/>    
            <typeAlias type="com.zdp.domain.Order" alias="Order"/>    
        </typeAliases>  
        <environments default="development">  
            <environment id="development">  
                <transactionManager type="JDBC" />  
                <dataSource type="POOLED">  
                    <property name="driver" value="com.mysql.jdbc.Driver" />  
                    <property name="url" value="jdbc:mysql://localhost/test" />  
                    <property name="username" value="root" />  
                    <property name="password" value="root" />  
                </dataSource>  
            </environment>  
        </environments>  
        <mappers>  
            <!-- 映射文件的位置 -->  
            <mapper resource="com/zdp/domain/Person.xml" />  
            <mapper resource="com/zdp/domain/Order.xml" />  
        </mappers>  
    </configuration>  
    

    8. 测试文件:

    /** 
     * 测试一对多和多对一 
     */  
    public class MybatisTest {  
      
        private SqlSessionFactory ssf;   
      
        @Before  
        public void initSF() throws Exception {  
            String resource = "sqlMapConfig.xml";  
            InputStream inputStream = Resources.getResourceAsStream(resource);  
            ssf = new SqlSessionFactoryBuilder().build(inputStream);  
        }  
      
        @Test//一对多关联查询  
        public void selectPersonById()throws Exception{  
            SqlSession session = ssf.openSession();  
            Person person = session.selectOne("com.zdp.domain.Person.selectPersonById", "001");  
            System.out.println(person.getOrders());  
        }  
          
        @Test//多对一关联查询  
        public void selectOrderById()throws Exception{  
            SqlSession session = ssf.openSession();  
            Order order = session.selectOne("com.zdp.domain.Order.selectOrderById", "O_00001");  
            System.out.println(order.getPerson().getName());  
        }  
    }  
    
  • 相关阅读:
    [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】
    [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】
    [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】
    微讯云端【申明:来源于网络】
    前端如何学习和相关面试题整理
    js 函数总结
    前端归纳面试题
    js 中关键字 this的用法
    好的网站
    对属性NaN的理解纠正和对Number.isNaN() 、isNaN()方法的辨析
  • 原文地址:https://www.cnblogs.com/gxbk629/p/5370383.html
Copyright © 2011-2022 走看看