文章目录
一、订单模型
在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