1,对于一对一对应关系,有两种方式来实现
(1)一种是使用resultType,这个有一个要求就是查询出来的列和返回的java对象的列的名称需要对应,这里我们想要实现依据订单来查询对应订单的下单用户的信息的查询,因此需要们自己建立pojo,首先给出客户,订单,商品的定义类如下:
package com.ajin.mybatis.model;
/**
* Created by ajin on 16-12-19.
*/
public class Customer {
private int cno;
private String cname;
private String csex;
private String cphone;
public int getCno() {
return cno;
}
public void setCno(int cno) {
this.cno = cno;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCsex() {
return csex;
}
public void setCsex(String csex) {
this.csex = csex;
}
public String getCphone() {
return cphone;
}
public void setCphone(String cphone) {
this.cphone = cphone;
}
public String getCaddress() {
return caddress;
}
public void setCaddress(String caddress) {
this.caddress = caddress;
}
private String caddress;
}
package com.ajin.mybatis.model;
/**
* Created by ajin on 16-12-19.
*/
public class Orders {
private int ono;
private String otime;
private int cno;
private int gno;
public int getOno() {
return ono;
}
public void setOno(int ono) {
this.ono = ono;
}
public String getOtime() {
return otime;
}
public void setOtime(String otime) {
this.otime = otime;
}
public int getCno() {
return cno;
}
public void setCno(int cno) {
this.cno = cno;
}
public int getGno() {
return gno;
}
public void setGno(int gno) {
this.gno = gno;
}
@Override
public String toString() {
return "Orders{" +
"ono=" + ono +
", otime='" + otime + '\'' +
", cno=" + cno +
", gno=" + gno +
'}';
}
}
package com.ajin.mybatis.model;
/**
* Created by ajin on 16-12-19.
*/
public class Goods {
private int gno;
private String gname;
public int getGno() {
return gno;
}
public void setGno(int gno) {
this.gno = gno;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getGtype() {
return gtype;
}
public void setGtype(String gtype) {
this.gtype = gtype;
}
public float getGprice() {
return gprice;
}
public void setGprice(float gprice) {
this.gprice = gprice;
}
private String gtype;
private float gprice;
}
下面我们主查询是订单,并附属查询用户的姓名和电话,因此定义自己的pojo如下:继承Orders类
package com.ajin.mybatis.model;
/**
* Created by ajin on 16-12-19.
*/
public class OrdersCustomer extends Orders {
private String cname;
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCphone() {
return cphone;
}
public void setCphone(String cphone) {
this.cphone = cphone;
}
private String cphone;
@Override
public String toString() {
return "OrdersCustomer{" +
"ono='" + this.getOno() + '\'' +
"otime='" + this.getOtime() + '\'' +
"cno='" + this.getCno() + '\'' +
"gno='" + this.getGno() + '\'' +
"cname='" + cname + '\'' +
", cphone='" + cphone + '\'' +
'}';
}
}
然后写我们的mapper.xml如下:
<?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.ajin.mybatis.mapper.OrdersCustomerMapper">
<!--一对一查询,查询订单的时候,附带查出订单的用户信息
1.首先编写输入参数类型,比如依据订单的编号
2.返回类型:单独的model依据上面的要求肯定不能满足,需要自己定义pojo
(1)第一种方式:使用resultType 在定义pojo时,要看以那个为主,这样可以选择继承一个类,然后再把其它的属性加入
因为resultType要求在使用的时候查询出来的属性名和pojo的对象属性名称对应
-->
<select id="selectOrdersCustomerById" parameterType="int" resultType="com.ajin.mybatis.model.OrdersCustomer">
select orders.*,customer.cname,customer.cphone from orders,customer
where orders.cno =customer.cno
and orders.ono =#{value}
</select>
</mapper>
它所对应的mapper接口定义如下:
package com.ajin.mybatis.mapper;
import com.ajin.mybatis.model.OrdersCustomer;
/**
* Created by ajin on 16-12-19.
*/
public interface OrdersCustomerMapper {
public OrdersCustomer selectOrdersCustomerById(int id);
}
然后将我们的mapper.xml文件加到mybatis的配置文件中,最后测试代码如下:
package com.ajin.mybatis.mapper;
import com.ajin.mybatis.model.OrdersCustomer;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import static org.junit.Assert.*;
/**
* Created by ajin on 16-12-19.
*/
public class OrdersCustomerMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
String resource = "config/SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void selectOrdersCustomerById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
OrdersCustomerMapper ordersCustomerMapper = sqlSession.getMapper(OrdersCustomerMapper.class);
OrdersCustomer ordersCustomer=ordersCustomerMapper.selectOrdersCustomerById(2);
System.out.println(ordersCustomer);
}finally {
}
}
}
(2)第二种方式,使用resultMap,这种方式就是需要定义resultMap,并适用与需要延迟加载的情况
主要就是resultmap的编写如下:
<?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.ajin.mybatis.mapper.OrdersCustomerMapper">
<!--一对一查询,查询订单的时候,附带查出订单的用户信息
1.首先编写输入参数类型,比如依据订单的编号
2.返回类型:单独的model依据上面的要求肯定不能满足,需要自己定义pojo
(1)第一种方式:使用resultType 在定义pojo时,要看以那个为主,这样可以选择继承一个类,然后再把其它的属性加入
因为resultType要求在使用的时候查询出来的属性名和pojo的对象属性名称对应
-->
<!--<select id="selectOrdersCustomerById" parameterType="int" resultType="com.ajin.mybatis.model.OrdersCustomer">-->
<!--select orders.*,customer.cname,customer.cphone from orders,customer-->
<!--where orders.cno =customer.cno-->
<!--and orders.ono =#{value}-->
<!--</select>-->
<!--(2)第二种方式:使用resultMap,自己定义resultMap-->
<resultMap id="selectOrdersCustomerMap" type="com.ajin.mybatis.model.OrdersCustomerMap">
<!-- 配置orders的id和一般属性-->
<id column="ono" property="ono"></id>
<result column="otime" property="otime"></result>
<result column="gno" property="gno"></result>
<result column="cno" property="cno"></result>
<!-- 配置关联的Customer的属性,将下面查询出来的Customer的属性映射到orderCustomermap里面的customer属性中-->
<association property="customer" javaType="com.ajin.mybatis.model.Customer">
<id column="cno" property="cno"></id>
<result column="cname" property="cname"></result>
<result column="cphone" property="cphone"></result>
</association>
</resultMap>
<select id="selectOrdersCustomerMapById" parameterType="int" resultMap="selectOrdersCustomerMap">
select orders.*,customer.cname,customer.cphone from orders,customer
where orders.cno =customer.cno
and orders.ono =#{value}
</select>
</mapper>
返回类型定义如下:
package com.ajin.mybatis.model;
/**
* Created by ajin on 16-12-19.
*/
public class OrdersCustomerMap extends Orders {
private Customer customer;
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}
对应的接口和测试如下:
package com.ajin.mybatis.mapper;
import com.ajin.mybatis.model.OrdersCustomerMap;
import com.ajin.mybatis.model.OrdersCustomer;
/**
* Created by ajin on 16-12-19.
*/
public interface OrdersCustomerMapper {
public OrdersCustomer selectOrdersCustomerById(int id);
public OrdersCustomerMap selectOrdersCustomerMapById(int id);
}
@Test
public void selectOrdersCustomerMapById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
try{
OrdersCustomerMapper ordersCustomerMapper = sqlSession.getMapper(OrdersCustomerMapper.class);
OrdersCustomerMap ordersCustomer=ordersCustomerMapper.selectOrdersCustomerMapById(5);
System.out.println(ordersCustomer);
}finally {
sqlSession.close();
}
}
一对一对应关系resultmap中,主要使用到了association这个标签,