Mybatis框架|高级映射查询|一对一


一、订单模型

在BtoC模式中,会有很多订单模型,以电商为例:

  • 以订单角度来讲:一张订单只会有一个对应的用户(一对一)。
  • 以用户角度来讲:一个用户会有多个对应的订单(一对多)。

在这里插入图片描述

下面按照上面的订单模型,创建两张真实的数据库表。

在这里插入图片描述

1.订单模型的用户表

创建一张用户表user,并自定义添加记录,添加后的user表如下。

CREATE TABLE `user` (
	`id` INT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
	`username` VARCHAR(50) NULL DEFAULT NULL COMMENT '姓名',
	`sex` VARCHAR(1) NULL DEFAULT NULL COMMENT '性别',
	`address` VARCHAR(200) NULL DEFAULT NULL COMMENT '住址',
	`birthday` DATE NULL DEFAULT NULL COMMENT '生日',
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;

在这里插入图片描述

2.订单模型的订单表

创建一张订单表orders,并且将user_id属性作为外键,关联上user表中的id。自定义添加记录,添加后的user表如下。

CREATE TABLE `orders` (
	`id` INT(10) NOT NULL AUTO_INCREMENT,
	`creattime` DATETIME NULL DEFAULT NULL,
	`number` VARCHAR(50) NULL DEFAULT NULL,
	`user_id` INT(10) NULL DEFAULT NULL,
	`count` INT(10) NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `FK_user_id` (`user_id`),
	CONSTRAINT `FK_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=4
;

在这里插入图片描述

3.测试订单模型

SELECT * FROM orders o,user  u WHERE u.id=o.user_id;

在这里插入图片描述
利用多表查询,成功将三个订单绑定到了一个用户上,说明订单模型创建成功。

二、一对一映射

假设现在的需求是查询订单下的所有信息及其对应的用户姓名和性别
sql语句应该是:SELECT o.id,o.creattime,o.number,o.user_id,o.count,u.username,u.sex FROM orders o,user u WHERE u.id=o.user_id;
在这里插入图片描述

1.resultType实现一对一映射

原来的两张表的pojo不需要做修改,使用resultType返回继承了订单表的扩展表的pojo类型即可。

(1)两张表的pojo

Orders_JavaBean

package com.gql.pojo;

import java.io.Serializable;
import java.util.Date;

/**
 * 类说明:
 *		Orders_JavaBean
 * @guoqianliang1998.
 */
public class Orders implements Serializable{

	private static final long serialVersionUID = 1L;
	private int id;
	private Date creattime;
	private String number;
	private int user_id;
	private int count;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Date getCreattime() {
		return creattime;
	}
	public void setCreattime(Date creattime) {
		this.creattime = creattime;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
}

User_JavaBean

package com.gql.pojo;

import java.io.Serializable;
import java.util.Date;
/**
 * 类说明:
 *		User_JavaBean
 * @guoqianliang1998.
 */
public class User implements Serializable{

	private static final long serialVersionUID = 1L;
	private int id;
	private String username;
	private String sex;
	private String address;
	private Date birthday;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

(2)扩展订单表OrdersCustom的pojo

OrdersCustom是订单表的子类,增加了两个user表中的属性,是一个新的pojo。

package com.gql.pojo.custom;

import com.gql.pojo.Orders;
/**
 * 类说明:
 *		Orders_pojo扩展类的JavaBean
 * @guoqianliang1998.
 */
public class OrdersCustom 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;
	}
}

(3)dao层接口

package com.gql.mapper.custom;
import java.util.List;

import com.gql.pojo.custom.OrdersCustom;

/**
 * 类说明:
 *		dao层接口
 * @guoqianliang1998.
 */
public interface OrdersMapperCustom {
	List<OrdersCustom> getOrders();
}

(4)使用resultType进行dao层配置

<?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.gql.mapper.custom.OrdersMapperCustom">
	<select id="getOrders" resultType="com.gql.pojo.custom.OrdersCustom">
		SELECT 
		o.id,o.creattime,o.number,o.user_id,o.count,
		u.username,u.sex
		FROM orders o, USER u
		WHERE u.id=o.user_id;
	</select>
</mapper>

(5)测试类

package com.gql.mapper.custom;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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 com.gql.pojo.custom.OrdersCustom;
/**
 * 类说明:
 *		使用扩展pojo测试dao层
 * @guoqianliang1998.
 */
public class OrdersMapperCustomTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);		
	}
	
	@Test
	public void testGetOrders(){
		SqlSession session = sqlSessionFactory.openSession();
		OrdersMapperCustom mapper = session.getMapper(OrdersMapperCustom.class);
		List<OrdersCustom> list = mapper.getOrders();
		System.out.println(list.size());
	}
}

运行测试后,成功打印如下结果:

DEBUG [main] - ==>  Preparing: SELECT o.id,o.creattime,o.number,o.user_id,o.count, u.username,u.sex FROM orders o, USER u WHERE u.id=o.user_id; 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 3

2.resultMap实现一对一映射

直接在订单类的pojo中加入用户类对象,将两张表的pojo做关联。

(1).两张表的pojo

Orders_JavaBean

package com.gql.pojo;

import java.io.Serializable;
import java.util.Date;

/**
 * 类说明:
 *		Orders_JavaBean
 * @guoqianliang1998.
 */
public class Orders implements Serializable{

	private static final long serialVersionUID = 1L;
	private int id;
	private Date creattime;
	private String number;
	private int user_id;
	private int count;
	private User user;
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Date getCreattime() {
		return creattime;
	}
	public void setCreattime(Date creattime) {
		this.creattime = creattime;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
}

User_JavaBean

package com.gql.pojo;

import java.io.Serializable;
import java.util.Date;
/**
 * 类说明:
 *		User_JavaBean
 * @guoqianliang1998.
 */
public class User implements Serializable{

	private static final long serialVersionUID = 1L;
	private int id;
	private String username;
	private String sex;
	private String address;
	private Date birthday;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

(2)dao层接口

package com.gql.mapper.custom;
import java.util.List;

import com.gql.pojo.custom.OrdersCustom;

/**
 * 类说明:
 *		dao层接口
 * @guoqianliang1998.
 */
public interface OrdersMapperCustom {
	List<OrdersCustom> getOrders();
}

(3)使用resultType进行dao层配置

  • resultTpe中有两种方式配置dao,下面两种都可以实现。

resultType标签中的几个属性

  • column:列名,数据库中对应的字段名。
  • property:属性名,pojo中对应的属性。
  • javaType:property的全限定名,如果映射到一个JavaBean,那MyBatis 通常会自行检测到。

id标签中的column对应user表中的主键的列(column也就是外键)

方式一

<?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.gql.mapper.OrdersMapper">
	<select id="getOrders" resultMap="ordersMap">
		SELECT 
		o.id,o.creattime,o.number,o.user_id,o.count,
		u.username,u.sex
		FROM orders o, USER u
		WHERE u.id=o.user_id;
	</select>
	<resultMap type="com.gql.pojo.Orders" id="ordersMap">
		<id column="id" property="id"/>
		<result column="creattime" property="creattime"></result>
		<result column="number" property="number"></result>
		<result column="user_id" property="user_id"></result>
		<result column="count" property="count"></result>
		
		<result column="username" property="user.username"></result>
		<result column="sex" property="user.sex"></result>
	</resultMap>
</mapper>

方式二

  • property=“user”,表示映射到Orders中的User user属性
  • javaType="com.gql.pojo.User"表示property中user的全限定名
<?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.gql.mapper.OrdersMapper">
	<select id="getOrders" resultMap="ordersMap">
		SELECT 
		o.id,o.creattime,o.number,o.user_id,o.count,
		u.username,u.sex
		FROM orders o, USER u
		WHERE u.id=o.user_id;
	</select>
	<resultMap type="com.gql.pojo.Orders" id="ordersMap">
		<id column="id" property="id"/>
		<result column="creattime" property="creattime"></result>
		<result column="number" property="number"></result>
		<result column="user_id" property="user_id"></result>
		<result column="count" property="count"></result>
		
		<association property="user" javaType="com.gql.pojo.User">
			<id column="user_id" property="id"/>
			<result column="username" property="username"/>
			<result column="sex" property="sex"/>			
		</association>	
	</resultMap>
</mapper>

(4)测试类

package com.gql.mapper.custom;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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 com.gql.pojo.custom.OrdersCustom;
/**
 * 类说明:
 *		使用扩展pojo测试dao层
 * @guoqianliang1998.
 */
public class OrdersMapperCustomTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);		
	}
	
	@Test
	public void testGetOrders(){
		SqlSession session = sqlSessionFactory.openSession();
		OrdersMapperCustom mapper = session.getMapper(OrdersMapperCustom.class);
		List<OrdersCustom> list = mapper.getOrders();
		System.out.println(list.size());
	}
}

上面的测试代码运行后结果如下:

DEBUG [main] - ==>  Preparing: SELECT o.id,o.creattime,o.number,o.user_id,o.count, u.username,u.sex FROM orders o, USER u WHERE u.id=o.user_id; 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 3
3

发布了413 篇原创文章 · 获赞 1081 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/104261035