mybatis--高级结果映射之一对一、一对多、多对多
来源:互联网 发布:刷qq币软件 编辑:程序博客网 时间:2024/05/17 01:14
高级结果映射
一、数据模型分析
1、 明确每张表存储的信息
2、 明确每张表中关键字段(主键、外键、非空)
3、 明确数据库中表与表之间的外键关系
4、 明确业务中表与表的关系(建立在具体的业务)
二、一对一映射
1、需求
查询订单信息,关联查询用户信息
2、SQL语句
主信息:orders
从信息:user
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex` FROM orders, USER WHERE orders.`user_id` = user.`id`
3、使用resultType输出映射
3.1创建扩展类
OrdersExt:
package po;public class OrdersExt extends Orders{private String username;private String sex;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}
Orders:
package po;import java.util.Date;import java.util.List;public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //订单明细集合 private List<Orderdetail> detailList;
3.2映射文件
<!-- 一对一映射之resultMap --><select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">SELECTorders.`id`,orders.`user_id`,orders.`number`,user.`username`,user.`sex`FROMorders,USERWHERE orders.`user_id` = user.`id`</select>
3.3Mapper接口
public interface OrdersMapper {//一对一映射之resultTypepublic List<OrdersExt> findOrdersAndUser();
3.4测试代码
@Testpublic void testFindOrdersAndUser() {// 创建OrdersMapper对象SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);List<OrdersExt> list = mapper.findOrdersAndUser();sqlSession.close();}
3.5小结
使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。
而且映射的属性要存在于一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。
4、使用resultMap输出映射
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。
4.1修改扩展类package po;public class OrdersExt extends Orders{private String username;private String sex;//用户信息private User user;
4.2映射文件
<!-- OrdersAndUserRstMap --><resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndUserRstMap"><!-- 订单信息 --><id column="id" property="id" /><result column="user_id" property="userId" /><result column="number" property="number" /><!-- 用户信息(一对一) --><!-- association:一对一关联映射 --><!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 --><!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 --><association property="user" javaType="com.itheima.mybatis.po.User"><id column="user_id" property="id" /><result column="username" property="username" /><result column="sex" property="sex" /></association></resultMap><!-- 一对一映射之resultMap --><select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">SELECTorders.`id`,orders.`user_id`,orders.`number`,user.`username`,user.`sex`FROMorders,USERWHERE orders.`user_id` = user.`id`</select>
4.3Mapper接口
//一对一之resultMappublic List<OrdersExt> findOrdersAndUserRstMap();
4.4测试代码
@Testpublic void testFindOrdersAndUserRstMap() {// 创建OrdersMapper对象SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);List<OrdersExt> list = mapper.findOrdersAndUserRstMap();sqlSession.close();}
5、小结
在一对一结果映射时,使用resultType更加简单方便,如果有特殊要求(对象嵌套对象)时,需要使用resultMap进行映射,
比如:查询订单列表,然后在点击列表中的查看订单明细按钮,这个时候就需要使用resultMap进行结果映射。
而resultType更适用于查询明细信息,比如,查询订单明细列表。
三、一对多映射
1、需求
查询订单信息,关联查询订单明细信息及用户信息
2、SQL语句
主信息:orders
从信息:orderdetail、user
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex`, orderdetail.`id` detailId, orderdetail.`items_id`, orderdetail.`items_num` FROM orders, USER, orderdetail WHERE orders.`user_id` = user.`id` AND orders.`id` = orderdetail.`orders_id`
3、修改扩展类
package po;import java.util.List;public class OrdersExt extends Orders{private String username;private String sex;private User user;///订单明细信息private List<Orderdetail> detailList;
Orderdetail:
package po;public class Orderdetail { private Integer id; private Integer ordersId; private Integer itemsId; private Integer itemsNum; //商品信息 private Items items;
4、映射文件
<!-- OrdersAndDetailRstMap --><!-- extends:可以继承一个已有的resultMap,指定resultMap的唯一标示即可 --><!-- 注意:继承时,只能继承type类型是一样的resultMap --><resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndDetailRstMap"extends="OrdersAndUserRstMap"><!-- 订单明细信息(一对多) --><!-- collection:映射一对多关系 --><!-- property:映射的多的那个集合的属性 --><!--ofType: 集合内的对象的类型 --><collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail"><id column="detailId" property="id" /><result column="items_id" property="itemsId" /><result column="items_num" property="itemsNum" /></collection></resultMap><!-- 一对多映射 --><select id="findOrdersAndDetailRstMap" resultMap="OrdersAndDetailRstMap">SELECTorders.`id`,orders.`user_id`,orders.`number`,user.`username`,user.`sex`,orderdetail.`id` detailId,orderdetail.`items_id`,orderdetail.`items_num`FROMorders,USER,orderdetailWHEREorders.`user_id` = user.`id`AND orders.`id` = orderdetail.`orders_id`</select>
5、Mapper接口
//一对多public List<OrdersExt> findOrdersAndDetailRstMap();
6、测试代码
@Testpublic void testFindOrdersAndDetailRstMap() {// 创建OrdersMapper对象SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);List<OrdersExt> list = mapper.findOrdersAndDetailRstMap();sqlSession.close();}
四、多对多映射
多对多映射是一对多映射的特例
1、需求
查询用户信息,关联查询该用户购买的商品信息
2、SQL语句
主信息:user
从信息:items、orders、orderdetail
SELECT orders.`id`, orders.`user_id`, orders.`number`, user.`username`, user.`sex`, orderdetail.`id` detailId, orderdetail.`items_id`, orderdetail.`items_num`, items.`name`, items.`price` FROM orders, USER, orderdetail, items WHERE orders.`user_id` = user.`id` AND orders.`id` = orderdetail.`orders_id` AND orderdetail.`items_id` = items.`id`
3、修改PO类
在User类中添加List<Orders> orders;
public class User implements Serializable{private int id;private String username;// 用户姓名private String sex;// 性别private Date birthday;// 生日private String address;// 地址//订单信息private List<Orders> orders;
在Orders类中添加List<Orderdetail> detailList;
public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //订单明细集合 private List<Orderdetail> detailList;
在Orderdetail中添加Items items;
public class Orderdetail { private Integer id; private Integer ordersId; private Integer itemsId; private Integer itemsNum; //商品信息 private Items items;
4、Mapper接口
//多对多public List<User> findUserAndItemsRstMap();
5、映射文件
<!-- UserAndItemsRstMap --><resultMap type="com.itheima.mybatis.po.User" id="UserAndItemsRstMap"><!-- 用户信息 --><id column="user_id" property="id" /><result column="username" property="username" /><result column="sex" property="sex" /><!-- 订单信息(一对多) --><collection property="orders" ofType="com.itheima.mybatis.po.Orders"><id column="id" property="id" /><result column="user_id" property="userId" /><result column="number" property="number" /><!-- 订单明细信息(一对多) --><collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail"><id column="detailId" property="id" /><result column="items_id" property="itemsId" /><result column="items_num" property="itemsNum" /><!-- 商品信息(一对一) --><association property="items" javaType="items"><id column="items_id" property="id" /><result column="name" property="name" /><result column="price" property="price" /></association></collection></collection></resultMap><!-- 多对多 --><select id="findUserAndItemsRstMap" resultMap="UserAndItemsRstMap">SELECTorders.`id`,orders.`user_id`,orders.`number`,user.`username`,user.`sex`,orderdetail.`id` detailId,orderdetail.`items_id`,orderdetail.`items_num`,items.`name`,items.`price`FROMorders,USER,orderdetail,itemsWHERE orders.`user_id` = user.`id`AND orders.`id` =orderdetail.`orders_id`AND orderdetail.`items_id` = items.`id`</select>
6、测试代码
@Testpublic void testFindUserAndItemsRstMap() {// 创建OrdersMapper对象SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);List<User> list = mapper.findUserAndItemsRstMap();sqlSession.close();}
0 0
- mybatis--高级结果映射之一对一、一对多、多对多
- mybatis映射 一对一、一对多、多对多高级映射
- Mybatis高级结果映射一对一或一对多
- MyBatis高级映射之-一对一(一对多)关联映射
- mybatis中的高级映射一对一、一对多、多对多
- mybatis高级映射(一对一,一对多,多对多)
- (八)mybatis学习之高级映射(一对一、一对多、多对多)
- 【Mybatis高级映射】一对一映射、一对多映射、多对多映射
- 【mybatis深度历险系列】mybatis中的高级映射一对一、一对多、多对多
- mybatis resaultMap 高级映射 (一对一,一对多,多对一,多对多)
- mybatis高级映射关系,一对一,一对多,多对多,多对一
- Mybatis高级映射(一对一的查询以及一对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- 计算机 计算机语言 常见的DOS命令
- 08cms房产7.1旗舰版+7.0升级包+最新WAP手机触屏版:微信公众平台新增多个重量级功能,无任何限制
- Android Studio 学习之 Android SDK快速更新
- 类似于微博个人中心
- 内容提供者简单介绍
- mybatis--高级结果映射之一对一、一对多、多对多
- springmvc的执行流程详解
- 网页页面 自动刷新的3种代码
- 李开复给中国大学生的第七封信——21世纪最需要的七种人才
- 【网络】ping命令
- MSM8937系统启动流程
- poj_1734 Sightseeing trip(最小环+floyd+INF范围)
- Spring Boot学习---2.将项目打成war包部署到自己的tomcat中
- 多线程的详细使用