一对一关系映射
案例:根据订单编号查询订单信息和用户信息(两张表,主外键关系)
1、写一个订单的扩展类
1、定义order类,生成属性的get、set、和toString方法(User类前边都有,这里不写)
public class Orders {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
private Integer user_id;
private String note;
private String number;
private Date createtime;
@Override
public String toString() {
return "Orders{" +
"id=" + id +
", user_id=" + user_id +
", note='" + note + '\'' +
", number='" + number + '\'' +
", createtime=" + createtime +
'}';
}
}
2、定义扩展类OrderExs,继承order,添加用户名和地址属性,生成两个属性的get和set方法以及tostring方法
public class OrdersExt extends Orders {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
private String address;
@Override
public String toString() {
return "OrdersExt{" +
"username='" + username + '\'' +
", address='" + address + '\'' +
'}'+super.toString();
}
}
3、编写接口orderMapper,编写查询方法
public interface OrderMapper {
/**
* 一对一查询,编写扩展类
* @param id
* @return
*/
public OrdersExt findOrderById(int id);
}
4、编写映射文件,编写查询方法
<?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.szl.mapper.OrderMapper">
<select id="findOrderById" resultType="ordersExt" parameterType="int">
select o.*,u.username,u.address
from orders o,user u
where o.user_id=u.id
and o.id=#{id}
</select>
</mapper>
5、编写测试类
/**
* 一对一级联查询:订单扩展类
* @throws IOException
*/
@Test
public void test6() throws IOException {
OrderMapper orderMapper=session.getMapper(OrderMapper.class);
OrdersExt ordersExt=orderMapper.findOrderById(3);
System.out.println("查询结果"+ordersExt);
}
查询的结果:
DEBUG [main] - ==> Preparing: select o.*,u.username,u.address from orders o,user u where o.user_id=u.id and o.id=?
DEBUG [main] - ==> Parameters: 3(Integer)
DEBUG [main] - <== Total: 1
查询结果OrdersExt{username='王五', address='null'}Orders{id=3, user_id=1, note='null', number='1000010', createtime=Wed Feb 04 13:22:35 CST 2015}
2、模型里有模型
定义orders类,将user最为orders中的一个属性:
public class Orders {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
private Integer user_id;
private String note;
private String number;
private Date createtime;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
private User user;//订单所属用户
@Override
public String toString() {
return "Orders{" +
"id=" + id +
", user_id=" + user_id +
", note='" + note + '\'' +
", number='" + number + '\'' +
", createtime=" + createtime +
'}';
}
}
添加方法接口:
public interface OrderMapper {
/**
* 一对一查询,编写扩展类
* @param id
* @return
*/
public OrdersExt findOrderById(int id);
public Orders findOrderById2(int id);
}
编写查询配置文件:
<!-- 模型里有模型,使用resultMap-->
<resultMap id="orderRslMap" type="orders">
<!--往order的模型匹配数据-->
<id column="id" property="id"></id>
<id column="note" property="note"></id>
<id column="number" property="number"></id>
<id column="createtime" property="createtime"></id>
<!--往order的user匹配数据,property中的user是属性,javaType中的user是模型(类)-->
<association property="user" javaType="user">
<id column="user_id" property="id"></id>
<id column="username" property="username"></id>
<id column="address" property="address"></id>
</association>
</resultMap>
<select id="findOrderById2" resultMap="orderRslMap" parameterType="int">
select o.*,u.username,u.address
from orders o,user u
where o.user_id=u.id
and o.id=#{id}
</select>
</mapper>
编写测试类(数据库加载对象前边有,这里不多写):
@Test
public void test8() throws IOException {
OrderMapper orderMapper=session.getMapper(OrderMapper.class);
Orders order =orderMapper.findOrderById2(3);
System.out.println("查询结果"+order);
System.out.println(order.getUser());
}
查询结果:
查询结果Orders{id=3, user_id=null, note='null', number='1000010', createtime=Wed Feb 04 13:22:35 CST 2015}
User{id=1, username='王五', sex='null', birthday=null, address='null'}