您的位置:首页 > 其它

mybatis高级结果映射学习之一对一映射(六)

2017-01-25 10:35 525 查看
Mybatis结果映射有两种方式,使用resultMap更加方便,如果有当对象嵌套对象时,需要使用resultMap进行映射。比如:查询订单列表,点击列表中的查看订单明细就是使用resultMap进行的结果映射。

1.数据模型分析

明确每张表储存信息

明确每张表中关键字段

明确数据库表与表之间的外键关系

明确业务中表与表的关系

数据库:

CREATE TABLE USER(
id  INT(5) NOT NULL AUTO_INCREMENT ,
NAME VARCHAR(255) ,
sex VARCHAR(1) ,
PRIMARY KEY (id)
)

CREATE TABLE orders(
id INT(5) NOT NULL AUTO_INCREMENT ,
userId INT(5) ,
number INT(5),
createtime DATE ,
note VARCHAR(255) ,
PRIMARY KEY (id)
)


2.一对一映射

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

主信息:orders

从信息 :user

1.SQL

SELECT

orders.
id
,

orders.
user_id
,

orders.
number
,

user.
username
,

user.
sex


FROM

orders,

USER

WHERE orders.
user_id
= user.
id




2.使用ResultType

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

pojo:

基类 Orders orders中有各种私有属性及其他的get set 方法。

package com.mybatis.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;

public void setDetailList(List<Orderdetail> detailList) {
this.detailList = detailList;
}

public Integer getId() {
return id;
}

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

public Integer getUserId() {
return userId;
}

public void setUserId(Integer userId) {
this.userId = userId;
}

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number == null ? null : number.trim();
}

public Date getCreatetime() {
return createtime;
}

public void setCreatetime(Date createtime) {
this.createtime = createtime;
}

public String getNote() {
return note;
}

public void setNote(String note) {
this.note = note == null ? null : note.trim();
}
}


需要创建一个类OrdersExt 继承实现 Orders 并添加 用户字段信息。并生成 get set 方法。

public class OrdersExt extends Orders {

private int id ;
private String name ;

//使用resultMap
private User user ;

public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Integer getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}


这样 OrdersExt 即包含和能访问 基类属性的 get set 方法。

映射文件:

<select id="findOrdersAndUser" resultType="com.mybatis.po.OrderExt">
SELECT orders.'id',
orders.'user_id',
orders.'number',
user.`username`,
user.`sex`,
FROM
orders,
user
WHERE orders.`user_id`=user.`id`
</select>


Mapper 接口

public interface OrdersMapper{
//一对一之resultType
public List< OrdersExt>  findOrdersAndUser() ;
}


测试代码

@Test
public void testFindOrdersAndUser() {

SqlSession sqlSession = sqlSessionFactory.openSession() ;
OrdersMapper mapper =  sqlSession.getMapper(OrdersMapper.class) ;
List<OrdersExt>  listExt= mapper.findOrdersAndUser() ;

}


使用resultMap

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

pojo类修改

在 扩展类OrdersExt 中增加 private User user ; 并提供get 和 set方法。

//使用resultMap
private User user ;

public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}


映射文件

<resultMap type="com.mybatis.po.OrdersExt" id="OrdersAndUserRstMap">
<id  column="id" property="id" />
<result column="userId" property="userId"/>
<result column="note" property="note"/>
<!-- association :一对一关联映射 -->
<!-- property: 关联信息查询的结果将要映射的扩展类中的对象属性名称-->
<association property="user" javaType="com.mybatis.po.User">
<!-- 这里将order中的userId 映射到User 的id ,其实就是 user表中id的值,只不过userid与user.id 是一样的  -->
<id column="userId" property="id"/>
<result column="sex" property="sex"/>
<result column="username" property="name" />
</association>
</resultMap>

<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
orders.`id`,
orders.`userId`,
orders.`number`,
orders.`note`,
user.`id`,
user.`name` username,
user.`sex`,
FROM
orders,
USER
WHERE orders.`userId` = user.`id`
</select>


Mapper接口

public List<OrdersExt> findOrdersAndUserRstMap();


测试代码

@Test
public void testFindOrdersAndUser() {

SqlSession sqlSession = sqlSessionFactory.openSession() ;
OrdersMapper mapper =  sqlSession.getMapper(OrdersMapper.class) ;
List<OrdersExt>  listExt= mapper.findOrdersAndUserRstMap() ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: