设为首页 收藏本站
查看: 725|回复: 0

[经验分享] Mybatis 一对多(OneToOne)关系映射

[复制链接]

尚未签到

发表于 2016-11-26 09:43:13 | 显示全部楼层 |阅读模式
  http://kinglixing.blog.iyunv.com/3421535/709738
关于MyBatis一对多的设置如下:
1.创建数据库脚本
CREATE TABLE t_customer( 
  id int(10) not null auto_increment, 
  address varchar(120), 
  postcode varchar(6), 
  sex varchar(2), 
  cname varchar(24), 
  primary key(id) 
)charset="GB2312"; 

CREATE TABLE t_orders( 
  id int(10) not null auto_increment, 
  code varchar(24), 
  customer_id int(3) not null
  primary key(id) 
)charset="GB2312";

ALTER TABLE t_orders 
ADD CONSTRAINT orders_customer_fk FOREIGN KEY (customer_id) REFERENCES t_customer(id)
-- t_orders.customer_id 参照 t_customer.id


 
2.创建实体类(POJO)
Customer.java
package com.lixing.ibatis.entity.onetomany; 

import java.io.Serializable; 
import java.util.List; 

public class Customer implements Serializable{ 
  private static final long serialVersionUID = 451949797460417653L; 
  private int id; 
  private String address; 
  private String postcode; 
  private String sex; 
  private String cname; 
  private List<Orders> orders;   //一个Customer 对应N多个Orders
  public int getId() { 
    return id; 
  } 
  public void setId(int id) { 
    this.id = id; 
  } 
  public String getAddress() { 
    return address; 
  } 
  public void setAddress(String address) { 
    this.address = address; 
  } 
  public String getPostcode() { 
    return postcode; 
  } 
  public void setPostcode(String postcode) { 
    this.postcode = postcode; 
  } 
  public String getSex() { 
    return sex; 
  } 
  public void setSex(String sex) { 
    this.sex = sex; 
  } 
  public String getCname() { 
    return cname; 
  } 
  public void setCname(String cname) { 
    this.cname = cname; 
  } 
  public List<Orders> getOrders() { 
    return orders; 
  } 
  public void setOrders(List<Orders> orders) { 
    this.orders = orders; 
  } 



 
Orders.java
package com.lixing.ibatis.entity.onetomany; 

import java.io.Serializable; 

public class Orders implements Serializable { 
  private static final long serialVersionUID = 8215977396669780567L; 
  private int id; 
  private String code; 
  private int customerId; 
  private Customer customer;  //多个Orders对应一个Customer
    
  public int getId() { 
    return id; 
  } 

  public void setId(int id) { 
    this.id = id; 
  } 

  public String getCode() { 
    return code; 
  } 

  public void setCode(String code) { 
    this.code = code; 
  } 

  public int getCustomerId() { 
    return customerId; 
  } 

  public void setCustomerId(int customerId) { 
    this.customerId = customerId; 
  } 

  public Customer getCustomer() { 
    return customer; 
  } 

  public void setCustomer(Customer customer) { 
    this.customer = customer; 
  } 


 
3.创建Mapper映射接口
CustomerMapper.java
package com.lixing.ibatis.onetomany.mapper; 

import com.lixing.ibatis.entity.onetomany.Customer; 

public interface CustomerMapper { 
  void insertCustomer(Customer customer); 
  Customer getCustomer(int id); 


 
OrdersMapper.java
package com.lixing.ibatis.onetomany.mapper; 

import java.util.List; 

import com.lixing.ibatis.entity.onetomany.Orders; 

public interface OrdersMapper { 
  void insertOrders(Orders orders); 
  List<Orders> getOrders(int id);    //根据id
  List<Orders> getOrdersById(int customerId);   //根据customerId获得N多个对象


 
4.创建Mapper XML配置文件
CustomerMapper.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.lixing.ibatis.onetomany.mapper.CustomerMapper"> 
  <parameterMap type="Customer" id="parameterCustomerMap"> 
    <parameter property="id"/> 
    <parameter property="address"/> 
    <parameter property="postcode"/> 
    <parameter property="sex"/> 
    <parameter property="cname"/>     
  </parameterMap> 
    
  <insert id="insertCustomer" parameterMap="parameterCustomerMap"> 
    <selectKey    keyProperty="id" resultType="int" order="AFTER"> 
      SELECT @@IDENTITY AS ID 
    </selectKey> 
    INSERT INTO t_customer(address,postcode,sex,cname) 
    VALUES(#{address},#{postcode},#{sex},#{cname}) 
  </insert>        
    
  <resultMap type="Customer" id="resultCustomerMap"> 
    <result property="id" column="id"/> 
    <result property="address" column="address"/> 
    <result property="postcode" column="postcode"/> 
    <result property="sex" column="sex"/> 
    <result property="cname" column="cname"/> 
    <collection property="orders" column="id" select="com.lixing.ibatis.onetomany.mapper.OrdersMapper.getOrdersById"/> 
  </resultMap> 
    
  <select id="getCustomer" resultMap="resultCustomerMap" parameterType="int"> 
    SELECT * 
    FROM t_customer 
    WHERE id=#{id} 
  </select>         
</mapper> 

  
OrderMapper.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.lixing.ibatis.onetomany.mapper.OrdersMapper"> 
  <parameterMap type="Orders" id="parameterOrdersMap"> 
    <parameter property="id"/> 
    <parameter property="code"/> 
    <parameter property="customerId"/> 
  </parameterMap> 
    
  <insert id="insertOrders"    parameterMap="parameterOrdersMap"> 
    <selectKey    keyProperty="id" resultType="int" order="AFTER"> 
      SELECT LAST_INSERT_ID() AS ID 
    </selectKey> 
    INSERT INTO t_orders(code,customer_id) 
    VALUES(#{code},#{customerId}) 
  </insert>    
    
  <resultMap type="Orders" id="ordersMap"> 
    <result property="id" column="id"/> 
    <result property="code" column="name"/> 
    <result property="customerId" column="customer_id"/> 
    <association property="customer" javaType="Customer" column="customer_id" select="com.lixing.ibatis.onetomany.mapper.CustomerMapper.getCustomer"/> 
  </resultMap>    
  <select id="getOrders" resultMap="ordersMap" parameterType="int"> 
    SELECT * FROM t_orders 
    WHERE id=#{id} 
  </select> 
    
  <select id="getOrdersById" resultMap="ordersMap" parameterType="int"> 
    SELECT * FROM t_orders 
    WHERE customer_id=#{customer_id} 
  </select> 
    
</mapper>    

  
 
5.mybatis-config.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> 
  <settings> 
    <!-- changes from the defaults for testing --> 
    <setting name="cacheEnabled" value="false" /> 
    <setting name="useGeneratedKeys" value="true" /> 
    <setting name="defaultExecutorType" value="REUSE" /> 
  </settings> 
    
  <typeAliases> 
    <typeAlias type="com.lixing.ibatis.entity.onetomany.Customer" alias="Customer"/> 
    <typeAlias type="com.lixing.ibatis.entity.onetomany.Orders" alias="Orders"/> 
     
  </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:3306/test" /> 
        <property name="username" value="root" /> 
        <property name="password" value="7501857" /> 
      </dataSource> 
    </environment> 
  </environments> 
  <mappers> 
    <mapper resource="com/lixing/ibatis/onetomany/mapper/CustomerMapper.xml"/> 
    <mapper resource="com/lixing/ibatis/onetomany/mapper/OrdersMapper.xml"/> 
  </mappers> 
</configuration> 

 
6.创建测试类
  
package com.lixing.ibatis.test; 

import java.util.Iterator; 
import java.util.List; 

import org.apache.ibatis.session.SqlSession; 
import org.apache.ibatis.session.SqlSessionFactory; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 

import com.lixing.ibatis.entity.onetomany.Customer; 
import com.lixing.ibatis.entity.onetomany.Orders; 
import com.lixing.ibatis.onetomany.mapper.CustomerMapper; 
import com.lixing.ibatis.onetomany.mapper.OrdersMapper; 
import com.lixing.ibatis.util.MyBatisUtil; 


public class OrdersMapperTest { 
  private SqlSessionFactory sqlSessionFactory=null
  private SqlSession session=null
    
  @Before 
  public void before(){ 
    sqlSessionFactory=MyBatisUtil.getInstance(); 
    session=sqlSessionFactory.openSession(); 
  } 
    
  @Test 
  public void testInsertOrders(){ 
    Orders orders=new Orders(); 
    orders.setCode("code__1"); 
    orders.setCustomerId(1); 
     
    OrdersMapper ordersMapper=session.getMapper(OrdersMapper.class); 
    ordersMapper.insertOrders(orders); 
    session.commit();     
  } 
    
  @Test 
  public void testInsertCustomerOneToMany(){ 
    Customer customer=new Customer(); 
    customer.setCname("Lixing5"); 
    customer.setPostcode("518105"); 
    customer.setSex("男"); 
    customer.setAddress("广东省深圳市5"); 
     
    CustomerMapper customerMapper=session.getMapper(CustomerMapper.class); 
    customerMapper.insertCustomer(customer); 
    System.out.println(customer.getId()); 
     
    Orders orders1=new Orders(); 
    orders1.setCode("code__5_1"); 
    orders1.setCustomerId(customer.getId()); 
     
    Orders orders2=new Orders(); 
    orders2.setCode("code__5_2"); 
    orders2.setCustomerId(customer.getId()); 
     
    Orders orders3=new Orders(); 
    orders3.setCode("code__5_3"); 
    orders3.setCustomerId(customer.getId()); 
     
    OrdersMapper ordersMapper=session.getMapper(OrdersMapper.class); 
    ordersMapper.insertOrders(orders1); 
    ordersMapper.insertOrders(orders2); 
    ordersMapper.insertOrders(orders3); 
     
    session.commit();    
  } 
    
     
  @Test 
  public void testGetOrdersManyToOne(){ 
    OrdersMapper ordersMapper=session.getMapper(OrdersMapper.class); 
    List<Orders> list=ordersMapper.getOrdersById(5); 
    for(int i=0;i<list.size();i++){ 
      Orders orders=list.get(i); 
      Customer customer=orders.getCustomer(); 
      System.out.println(orders.getId()+"\t"+orders.getCode()+"\t"+orders.getCustomerId()); 
      System.out.println("\t \t--:"+customer.getId()+"\t"+customer.getCname()); 
    }     
    session.commit(); 
  } 
    
    
  @Test 
  public void testGetCustomerOneToMany(){ 
    CustomerMapper customerMapper=session.getMapper(CustomerMapper.class); 
    Customer customer=customerMapper.getCustomer(5); 
    List<Orders> orders=customer.getOrders(); 
    System.out.println(customer.getId()+"\t"+customer.getCname()+"\t"+customer.getPostcode()+"\t"+customer.getAddress()); 
    for(int i=0;i<orders.size();i++){ 
      Orders order=orders.get(i); 
      System.out.println("\t \t --:"+order.getId()+"\t"+order.getCode()+"\t"+order.getCustomerId()); 
    } 
    session.commit(); 
  } 
    
  @After 
  public void after(){ 
    session.close(); 
  } 



  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305747-1-1.html 上篇帖子: mybatis的sql映射配置文件 下篇帖子: MyBatis+Spring基于接口编程的原理分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表