当前位置:   article > 正文

mybatis框架——对象关系映射_mybati映射对象

mybati映射对象

打个广告,帮朋友卖点东西,东西超便宜的哟【衣服鞋子等】,厂家直接出货,绝对低于市场价!!! 一般都比市场价便宜3—7折【都是牌子货】,如果您感兴趣,可以扫描屏幕下方的二维码,感谢关注!!!

微信

一、数据模型分析

  • 明确每张表存储的信息
  • 明确每张表中关键字段(主键、外键、非空)
  • 明确数据库中表与表之间的外键关系
  • 明确业务中表与表的关系(建立在具体的业务)

下面以商品订单为例,其关系图如下:

二、一对一映射

1、需求

查询订单信息,关联查询用户信息

2、Sql实现

主信息:orders

从信息:user

 

那么sql语句为:

  1. SELECT
  2. orders.`id`,
  3. orders.`user_id`,
  4. orders.`number`,
  5. user.`username`,
  6. user.`sex`
  7. FROM
  8. orders,
  9. USER
  10. WHERE orders.`user_id` = user.`id`

3、具体实现

1.resultType方式

        首先创建扩展类:

  1. public class OrdersExt extends Orders {
  2. // user.`username`,user.`sex`
  3. private String username;
  4. private String sex;
  5.    //get set
  6. }

然后在OrdersMapper.xml中:

  1. <!-- 一对一映射之resultType -->
  2. <select id="findOrdersAndUser" resultType="com.itheima.mybatis.po.OrdersExt">
  3. SELECT
  4. orders.`id`,
  5. orders.`user_id`,
  6. orders.`number`,
  7. user.`username`,
  8. user.`sex`
  9. FROM
  10. orders,
  11. USER
  12. WHERE orders.`user_id` = user.`id`
  13. </select>

在接口中:

  1. //一对一之resultType
  2. public List<OrdersExt> findOrdersAndUser();

小结:

       使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。

2.resultMap方式

       使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。首先修改扩展类:

  1. public class OrdersExt extends Orders {
  2. private User user;//用户信息
  3.        //get set
  4. }

然后在映射文件中:

  1. <!-- OrdersAndUserRstMap -->
  2. <resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndUserRstMap">
  3. <!-- 订单信息 -->
  4. <id column="id" property="id" />
  5. <result column="user_id" property="userId" />
  6. <result column="number" property="number" />
  7. <!-- 用户信息(一对一) -->
  8. <!-- association:一对一关联映射 -->
  9. <!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
  10. <!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
  11. <association property="user" javaType="com.itheima.mybatis.po.User">
  12. <id column="user_id" property="id" />
  13. <result column="username" property="username" />
  14. <result column="sex" property="sex" />
  15. </association>
  16. </resultMap>
  17. <!-- 一对一映射之resultMap -->
  18. <select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
  19. SELECT
  20. orders.`id`,
  21. orders.`user_id`,
  22. orders.`number`,
  23. user.`username`,
  24. user.`sex`
  25. FROM
  26. orders,
  27. USER
  28. WHERE orders.`user_id` = user.`id`
  29. </select>

小结:

       在一对一结果映射时,使用resultType更加简单方便,如果有特殊要求(对象嵌套对象)时,需要使用resultMap进行映射,比如:查询订单列表,然后在点击列表中的查看订单明细按钮,这个时候就需要使用resultMap进行结果映射。而resultType更适应于查询明细信息,比如,查询订单明细列表。

三、一对多映射

1、需求

查询订单信息,关联查询订单明细信息及用户信息

2、Sql实现

主信息:orders

从信息:orderdetail、user(一个订单对应多个订单详情)

 

那么sql语句为:

  1. SELECT
  2. orders.`id`,
  3. orders.`user_id`,
  4. orders.`number`,
  5. user.`username`,
  6. user.`sex`,
  7. orderdetail.`id` detailId,
  8. orderdetail.`items_id`,
  9. orderdetail.`items_num`
  10. FROM
  11. orders,
  12. USER,
  13. orderdetail
  14. WHERE orders.`user_id` = user.`id`
  15. AND orders.`id` = orderdetail.`orders_id`

3、具体实现

       首先修改扩展类:

  1. public class OrdersExt extends Orders {
  2.    private User user;//用户信息
  3. private List<Orderdetail> detailList;//订单明细信息
  4. //getset
  5. }

然后在映射文件中:

  1. <!-- OrdersAndDetailRstMap -->
  2. <!-- extends:可以继承一个已有的resultMap,指定resultMap的唯一标示即可 -->
  3. <!-- 注意:继承时,只能继承type类型是一样的resultMap -->
  4. <resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndDetailRstMap"
  5. extends="OrdersAndUserRstMap">
  6. <!-- 订单明细信息(一对多) -->
  7. <!-- collection:映射一对多关系 -->
  8. <collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail">
  9. <id column="detailId" property="id" />
  10. <result column="items_id" property="itemsId" />
  11. <result column="items_num" property="itemsNum" />
  12. </collection>
  13. </resultMap>
  14. <!-- 一对多映射 -->
  15. <select id="findOrdersAndDetailRstMap" resultMap="OrdersAndDetailRstMap">
  16. SELECT
  17. orders.`id`,
  18. orders.`user_id`,
  19. orders.`number`,
  20. user.`username`,
  21. user.`sex`,
  22. orderdetail.`id` detailId,
  23. orderdetail.`items_id`,
  24. orderdetail.`items_num`
  25. FROM
  26. orders,
  27. USER,
  28. orderdetail
  29. WHERE
  30. orders.`user_id` = user.`id`
  31. AND orders.`id` = orderdetail.`orders_id`
  32. </select>

四、多对多映射

       多对多映射是一对多映射的特例

1、需求

查询用户信息,关联查询该用户购买的商品信息

2、Sql实现

主信息:user

从信息:items、orders、orderdetail(一个用户对应多个商品,一个商品对应多个用户;)

 

那么sql语句:

  1. SELECT
  2. orders.`id`,
  3. orders.`user_id`,
  4. orders.`number`,
  5. user.`username`,
  6. user.`sex`,
  7. orderdetail.`id` detailId,
  8. orderdetail.`items_id`,
  9. orderdetail.`items_num`,
  10. items.`name`,
  11. items.`price`
  12. FROM
  13. orders,
  14. USER,
  15. orderdetail,
  16. items
  17. WHERE orders.`user_id` = user.`id`
  18. AND orders.`id` = orderdetail.`orders_id`
  19. AND orderdetail.`items_id` = items.`id`

3、具体实现

       首先修改User类(这里没有新加扩展类),在User类中添加List<Orders> orders;

  1. public class User{
  2. private int id;
  3. private String username;// 用户姓名
  4. private String sex;// 性别
  5. private Date birthday;// 生日
  6. private String address;// 地址
  7. //订单信息
  8. private List<Orders> orders;
  9. }

然后在Orders类中也添加List<Orderdetail> detailList

  1. public class Orders {
  2.    private Integer id;
  3.    private Integer userId;
  4.    private String number;
  5.    private Date createtime;
  6.    private String note;  
  7.    //订单明细集合
  8.    private List<Orderdetail> detailList;
  9. }

然后在Orderdetail中添加Items items

  1. public class Orderdetail {
  2.    private Integer id;
  3.    private Integer ordersId;
  4.    private Integer itemsId;
  5.    private Integer itemsNum;  
  6.    //商品信息
  7.    private Items items;
  8. }

然后在映射文件中:

  1. <!-- UserAndItemsRstMap -->
  2. <resultMap type="com.itheima.mybatis.po.User" id="UserAndItemsRstMap">
  3. <!-- 用户信息 -->
  4. <id column="user_id" property="id" />
  5. <result column="username" property="username" />
  6. <result column="sex" property="sex" />
  7. <!-- 订单信息(一(用户)对多(订单)) -->
  8. <collection property="orders" ofType="com.itheima.mybatis.po.Orders">
  9. <id column="id" property="id" />
  10. <result column="user_id" property="userId" />
  11. <result column="number" property="number" />
  12. <!-- 订单明细信息(一对多) -->
  13. <collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail">
  14. <id column="detailId" property="id" />
  15. <result column="items_id" property="itemsId" />
  16. <result column="items_num" property="itemsNum" />
  17. <!-- 商品信息(一对一) -->
  18. <association property="items" javaType="items">
  19. <id column="items_id" property="id" />
  20. <result column="name" property="name" />
  21. <result column="price" property="price" />
  22. </association>
  23. </collection>
  24. </collection>
  25. </resultMap>
  26. <!-- 多对多 -->
  27. <select id="findUserAndItemsRstMap" resultMap="UserAndItemsRstMap">
  28. SELECT
  29. orders.`id`,
  30. orders.`user_id`,
  31. orders.`number`,
  32. user.`username`,
  33. user.`sex`,
  34. orderdetail.`id` detailId,
  35. orderdetail.`items_id`,
  36. orderdetail.`items_num`,
  37. items.`name`,
  38. items.`price`
  39. FROM
  40. orders,
  41. USER,
  42. orderdetail,
  43. items
  44. WHERE orders.`user_id` = user.`id`
  45. AND orders.`id` =
  46. orderdetail.`orders_id`
  47. AND orderdetail.`items_id` = items.`id`
  48. </select>

在Mapper接口中:

public List<User> findUserAndItemsRstMap();//多对多

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/625628
推荐阅读
相关标签
  

闽ICP备14008679号