mybatis 一对多

一对多关联

一对多关联和多对一关联的区别:是从一的一端取多的一端,还是从多的一端取一的一端。

表结构(一对多、多对一、一对一的表结构相同):


 
  1. -- 用户表

  2. CREATE TABLE `user1`(

  3. `id` INT PRIMARY KEY AUTO_INCREMENT,

  4. `user_name` VARCHAR(20),-- 用户姓名

  5. `address` VARCHAR(60)-- 联系地址

  6. ) ENGINE INNODB CHARSET utf8;

  7. INSERT INTO `user1` VALUES(1,'陈大','深圳市南山区');

  8. INSERT INTO `user1` VALUES(2,'王二','深圳市福田区');

  9. INSERT INTO `user1` VALUES(3,'张三','深圳市龙华新区');

  10. INSERT INTO `user1` VALUES(4,'李四','深圳市龙岗区');

  11.  
  12.  
  13. -- 卡表

  14. CREATE TABLE `card1`(

  15. `id` INT PRIMARY KEY AUTO_INCREMENT,

  16. `card_no` VARCHAR(18),

  17. `remark` VARCHAR(100),

  18. `user_id` INT-- 用于关联user1的主键id(不设置外键,避免级联问题)

  19. ) ENGINE=INNODB CHARSET=utf8;

  20. INSERT INTO `card1` VALUES(1,'420001','工资卡',1);

  21. INSERT INTO `card1` VALUES(2,'420002','工资卡',2);

  22. INSERT INTO `card1` VALUES(3,'420003','工资卡',3);

  23. INSERT INTO `card1` VALUES(4,'420004','工资卡',3);

  24.  
  25.  
  26. -- SELECT * FROM `user1`;

  27. -- SELECT * FROM `card1`;

 

实体类:Card1


 
  1. package com.chensan.o2m.entity;

  2.  
  3. public class Card1 {

  4. private int id;

  5. private String cardNo;

  6. private String remark;

  7.  
  8. //...省略setter、getter方法

  9. }

实体类:User1


 
  1. package com.chensan.o2m.entity;

  2.  
  3. import java.util.List;

  4.  
  5. public class User1 {

  6. private int id;

  7. private String userName;

  8. private String address;

  9. private List<Card1> cards;

  10.  
  11. public String toString(){

  12. return "[ id = " + id + ", userName = "

  13. + userName + ", address = " + address + "]";

  14. }

  15. //...省略setter、getter方法

  16. }

实体类User1映射文件

 


 
  1. <?xml version="1.0" encoding="UTF-8" ?>

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  4.  
  5. <mapper namespace="com.chensan.o2m.entity.User1Mapper">

  6. <resultMap id="user1" type="com.chensan.o2m.entity.User1">

  7. <id property="id" column="user_id"/>

  8. <result property="userName" column="user_name"/>

  9. <result property="address" column="address"/>

  10.  
  11. <collection property="cards" column="user_id" ofType="com.chensan.o2m.entity.Card1">

  12. <id property="id" column="id"/>

  13. <result property="cardNo" column="card_no"/>

  14. <result property="remark" column="remark"/>

  15. </collection>

  16. </resultMap>

  17.  
  18. <select id="query" parameterType="int" resultMap="user1">

  19. SELECT t1.`id` `user_id`,t1.`user_name`,t1.`address`,t2.`id`,t2.`card_no`,t2.`remark`

  20. FROM `user1` t1,`card1` t2

  21. WHERE t1.`id`=t2.`user_id` AND t1.`id`=#{id}

  22. </select>

  23. </mapper>

myBatis配置文件

 


 
  1. <?xml version="1.0" encoding="UTF-8" ?>

  2. <!DOCTYPE configuration

  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">

  5.  
  6. <configuration>

  7. <!-- 和spring整合后 environments配置将废除-->

  8. <environments default="development">

  9. <environment id="development">

  10. <!-- 使用jdbc事务管理 或者JTA事务管理-->

  11. <transactionManager type="JDBC" />

  12. <!-- 数据库连接池 第三方组件:c3p0-->

  13. <dataSource type="POOLED">

  14. <property name="driver" value="com.mysql.jdbc.Driver"/>

  15. <property name="url" value="jdbc:mysql://localhost:3306/mybatis01"/>

  16. <property name="username" value="root"/>

  17. <property name="password" value="123456"/>

  18. </dataSource>

  19. </environment>

  20. </environments>

  21.  
  22. <!-- 加载实体类的映射文件 -->

  23. <mappers>

  24. <mapper resource="com/chensan/o2m/mapper/User1Mapper.xml"/>

  25. </mappers>

  26. </configuration>

测试类

 


 
  1. package com.chensan.o2m.test;

  2.  
  3. import java.io.Reader;

  4.  
  5. import org.apache.ibatis.io.Resources;

  6. import org.apache.ibatis.session.SqlSession;

  7. import org.apache.ibatis.session.SqlSessionFactory;

  8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;

  9.  
  10. import com.chensan.o2m.entity.Card1;

  11. import com.chensan.o2m.entity.User1;

  12.  
  13. public class TestO2M {

  14. private static SqlSessionFactory sqlSessionFactory;

  15. private static Reader resource;

  16.  
  17. //创建会话工厂

  18. static{

  19. try{

  20. resource = Resources.getResourceAsReader("myBatisConfig.xml");

  21. sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);

  22. }catch(Exception e){

  23. e.printStackTrace();

  24. }

  25. }

  26.  
  27. public static SqlSessionFactory getSession(){

  28. return sqlSessionFactory;

  29. }

  30.  
  31. //一对多:查询用户对应卡(银行卡)

  32. public void getUserCard(){

  33. SqlSession sqlSession = sqlSessionFactory.openSession();

  34. User1 user = sqlSession.selectOne("com.chensan.o2m.entity.User1Mapper.query", 3);

  35. System.out.println(user);

  36. for(Card1 card : user.getCards()){

  37. System.out.println(

  38. "[ " +

  39. "userId = " + user.getId() + ", " +

  40. "userName = " + user.getUserName() + ", " +

  41. "address = " + user.getAddress() + ", " +

  42. "cardId = " + card.getId() + ", " +

  43. "cardNo = " + card.getCardNo() + ", " +

  44. "remark = " + card.getRemark() +

  45. " ]"

  46. );

  47. }

  48.  
  49. sqlSession.close();

  50. }

  51.  
  52. public static void main(String[] args) {

  53. TestO2M testMyBatisOneToMany = new TestO2M();

  54. testMyBatisOneToMany.getUserCard();

  55. }

  56. }

结果: --------------------- 本文来自 陈_三 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/qinshijangshan/article/details/60955096?utm_source=copy

 

结果:

[ id = 3, userName = 张三, address = 深圳市龙华新区]
[ userId = 3, userName = 张三, address = 深圳市龙华新区, cardId = 3, cardNo = 420003, remark = 工资卡 ]
[ userId = 3, userName = 张三, address = 深圳市龙华新区, cardId = 4, cardNo = 420004, remark = 工资卡 ]

user1和card1的id列同名,如果不对其中一列取别名,则user只关联一个card对象,只有一条记录:

[ id = 3, userName = 张三, address = 深圳市龙华新区]
[ userId = 3, userName = 张三, address = 深圳市龙华新区, cardId = 3, cardNo = 420003, remark = 工资卡 ]
之前很奇怪只有一条记录,参考:http://blog.youkuaiyun.com/rain097790/article/details/13615291后才知道是列同名问题。

--------------------- 本文来自 陈_三 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/qinshijangshan/article/details/60955096?utm_source=copy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值