新建project:
先在pom.xml中导入依赖(mysql5.1.38,Mybatis3.4):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bit</groupId>
<artifactId>MybatisSynthe</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
</project>
使用数据库,自然需要db.perporties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false
jdbc.password=jdpy1229jiajia
新建sqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
使用sql语句建表:
create database mybatis;
use mybatis;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '下单用户id',
`number` varchar(32) NOT NULL COMMENT '订单号',
`createtime` datetime NOT NULL COMMENT '创建订单时间',
`note` varchar(100) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `FK_orders_1` (`user_id`),
CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE cascade ON UPDATE cascade
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
CREATE TABLE `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL COMMENT '商品名称',
`price` float(10,1) NOT NULL COMMENT '商品定价',
`detail` text COMMENT '商品描述',
`pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
`createtime` datetime NOT NULL COMMENT '生产日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `orderdetail` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`orders_id` int(11) NOT NULL COMMENT '订单id',
`items_id` int(11) NOT NULL COMMENT '商品id',
`items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',
PRIMARY KEY (`id`),
KEY `FK_orderdetail_1` (`orders_id`),
KEY `FK_orderdetail_2` (`items_id`),
CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE cascade ON UPDATE cascade,
CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE cascade ON UPDATE cascade
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
再通过data.sql插入数据:
use mybatis;
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`)
values (1,'arvin',NULL,'2',NULL),
(10,'tom','2014-07-10','1','BJ'),
(16,'jerry',NULL,'1','HN'),
(22,'tonny',NULL,'1','SD'),
(24,'jessica',NULL,'1','SX'),
(25,'siemens',NULL,'1','DL'),
(26,'ken',NULL,NULL,NULL);
insert into `orders`(`id`,`user_id`,`number`,`createtime`,`note`)
values (3,1,'1000010','2015-02-04 13:22:35',NULL),
(4,1,'1000011','2015-02-03 13:22:41',NULL),
(5,10,'1000012','2015-02-12 16:13:23',NULL);
insert into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`)
values (1,'thinkpad',3000.0,'good',NULL,'2019-08-03 13:22:53'),
(2,'tv',6000.0,'good',NULL,'2019-08-01 13:22:57'),
(3,'phone',90000.0,'good',NULL,'2019-08-06 13:23:02');
insert into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`)
values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);
使用mapper代理的方式,因此改变项目结构:
并在po包下新建由数据库表映射成的类:
package com.bit.po;
import java.util.Date;
public class Items
{
private Integer id;
private String name;
private Float price;
private String pic;
private Date createtime;
private String detail;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public Float getPrice()
{
return price;
}
public void setPrice(Float price)
{
this.price = price;
}
public String getPic()
{
return pic;
}
public void setPic(String pic)
{
this.pic = pic;
}
public Date getCreatetime()
{
return createtime;
}
public void setCreatetime(Date createtime)
{
this.createtime = createtime;
}
public String getDetail()
{
return detail;
}
public void setDetail(String detail)
{
this.detail = detail;
}
@Override
public String toString() {
return "Items{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", pic='" + pic + '\'' +
", createtime=" + createtime +
", detail='" + detail + '\'' +
'}';
}
}
package com.bit.po;
public class Orderdetail
{
private Integer id;
private Integer itemsId;
private Integer itemsNum;
private Integer ordersId;
public Orderdetail()
{
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public Integer getOrdersId()
{
return ordersId;
}
public void setOrdersId(Integer ordersId)
{
this.ordersId = ordersId;
}
public Integer getItemsId()
{
return itemsId;
}
public void setItemsId(Integer itemsId)
{
this.itemsId = itemsId;
}
public Integer getItemsNum()
{
return itemsNum;
}
public void setItemsNum(Integer itemsNum)
{
this.itemsNum = itemsNum;
}
@Override
public String toString() {
return "Orderdetail{" +
"id=" + id +
", itemsId=" + itemsId +
", itemsNum=" + itemsNum +
", ordersId=" + ordersId +
'}';
}
}
package com.bit.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 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;
}
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;
}
@Override
public String toString() {
return "Orders{" +
"id=" + id +
", userid=" + userid +
", number='" + number + '\'' +
", createtime=" + createtime +
", note='" + note + '\'' +
'}';
}
}
package com.bit.po;
import java.util.Date;
import java.util.List;
public class User
{
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
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 Date getBirthday()
{
return birthday;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", address='" + address + '\'' +
'}';
}
}
除了以上4个类外,还需要新建一个UserEx类——扩展自User的类,如果后续再给user增加属性,直接写到这个类中来。
package com.bit.po;
public class UserEx extends User {
}
再来一个Pack包,其中新建包装类UserPacking,放超过User范围的东西:
package com.bit.Pack;
import com.bit.po.Orderdetail;
import com.bit.po.UserEx;
public class UserPacking {
private UserEx userEx;
public UserEx getUserEx() {
return userEx;
}
public void setUserEx(UserEx userEx) {
this.userEx = userEx;
}
}
需求一:通过user表的username、sex属性,查询元组。
首先,插入一些元组:
接下来,通过sql语句select * from user where username like '%vin%' and sex='2'
查询:
如上所示,可以查询到4条记录。
在mapper包中写UserMapper接口和UserMapper.xml:
package com.bit.mapper;
import com.bit.Pack.UserPacking;
import com.bit.po.UserEx;
import java.util.List;
public interface UserMapper {
public List<UserEx> queryUserComp(UserPacking userPacking)throws Exception;
}
UserPacking中userEx这个属性
<mapper namespace="com.bit.mapper.UserMapper">
<select id="queryUserComp" parameterType="com.bit.Pack.UserPacking"resultType="com.bit.po.UserEx">
select * from user
where username like '%${userEx.username}%'
and sex=#{userEx.sex};
</select>
</mapper>
在sqlMapConfig.xml中写:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties">
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.bit.mapper"/>
</mappers>
</configuration>
使之可以通过扫描包的方式。
需要新建db.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.password=jdpy1229jiajia
进行单元测试:
import com.bit.Pack.UserPacking;
import com.bit.mapper.UserMapper;
import com.bit.po.User;
import com.bit.po.UserEx;
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 java.util.List;
public class MybatisTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() {
try {
InputStream in= Resources.getResourceAsStream("sqlMapConfig.xml");
sqlSessionFactory =new SqlSessionFactoryBuilder().build(in);
}
catch (Exception e){e.printStackTrace();}
}
@Test
public void test()
{
try{
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper= sqlSession.getMapper(UserMapper.class);
UserPacking userPacking=new UserPacking();
UserEx userEx=new UserEx();
userEx.setSex("2");
userEx.setUsername("vin");
userPacking.setUserEx(userEx);
List<UserEx> userList=userMapper.queryUserComp(userPacking);
System.out.println(userList);
}
catch (Exception ex){ex.printStackTrace();}
}
}
运行结果为:
出现这种"Invaild bound statement(not found)"的错误,需要在pom.xml中添加
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
运行结果为:
需求二:要想知道符合条件的元组有多少个:
sql语句:
select count(*) from user where sex="2" and username like '%vin%';
结果应是:
在UserMapper.xml中写:
<select id="queryUserByCount" parameterType="com.bit.Pack.UserPacking" resultType="int">
select count(*) from user where sex="2" and username like '%vin%';
</select>
接口中的方法需要与之对应:
public int queryUserCount(UserPacking userPacking)throws Exception;
在单元测试中写:
int result=userMapper.queryUserByCount(userPacking);
System.out.println(result);
运行结果:输出4。
在需求1中,如果将UserMapper.xml中的改成
<select id="queryUserComp" parameterType="com.bit.Pack.UserPacking" resultType="com.bit.po.UserEx">
select * from user
<where>
<if test="userEx!=null">
<if test="userEx.sex!=null">
sex=#{userEx.sex}
</if>
</if>
<if test="userEx.username">
and username like '%${userEx.username}%'
</if>
</where>
</select>
进行单元测试,通过。
如果不给userEx对象set name和sex,就相当于进行全查,会输出全部的元组,单元测试通过。
可以把这个片段提取出来,在UserMapper.xml中写:
<sql id="mySQL">
<if test="userEx!=null">
<if test="userEx.sex!=null">
sex=#{userEx.sex}
</if>
</if>
<if test="userEx.username">
and username like '%${userEx.username}%'
</if>
</sql>
注意:这种提取不能加,不能是多表。
这样调用即可:
<select id="queryUserComp" parameterType="com.bit.Pack.UserPacking" resultType="com.bit.po.UserEx">
select * from user
<where>
<include refid="mySQL"/>
<where>
</select>
单元测试通过。
需求三:通过别名查询。
select username as MyName,sex Mysex,address MyAddress from user;
select username as MyName,sex Mysex,address MyAddress from user;
在UserMapper.xml中写:
<select id="queryUserByAlis" resultType="com.bit.po.UserEx">
select username as MyName,sex Mysex,address MyAddress from user;
</select>
在接口中的方法需要与之对应:
public List<UserEx> queryUserByAlis() throws Exception;
在测试中写:
List<UserEx> userExes=userMapper.queryUserByAlis();
System.out.println(userExes);
运行结果为:
需要用resultMap才能把值匹配上:
<resultMap id="myResultMap" type="com.bit.Pack.UserPacking">
<id column="id" property="id"/>
<result column="MyName" property="username"/>
<result column="MySex" property="sex"/>
<result column="MyAddress" property="address"/>
</resultMap>
<select id="queryUserByAlis" resultMap="myResultMap">
select username as MyName,sex Mysex,address MyAddress from user;
</select>
执行单元测试,报错:
如果把返回值类型由UserEx类改为User类,可以通过。
resultMap标签不能拿到User类的set方法。
用Map会比ResultType多。
需求三:查找多个ID,sql语句为:
select * from user where id='25' or id='26' or id='30';
在UserPacking类中添加List ids属性及其get、set方法。
为了把id部分包起来,可以将sql语句写成:
select * from user where (1=1) and (id='25' or id='26' or id='30');
在UserMapper.xml中写:
<select id="queryUserMultyIds" parameterType="com.bit.Pack.UserPacking"resultType="com.bit.po.User">
select * from user
<where>
<foreach collection="ids" item="everyId"
open="and ("
close=")"
separator="or">
</foreach>
id=#{everyId}
</where>
</select>>
从"and (“开始,以”)"结束,执行foreach循环。
在接口中提供一致的方法:
public List<User> queryUserMultyIds(UserPacking userPacking)
throws Exception;
运行单元测试,通过
List<User> user=userMapper.queryUserMultyIds(userPacking);
System.out.println(user);
输入映射,自定义输入映射
输出映射,自定义输出映射
还可以写成`select * from user where id in(25,26,30);
在UserMapper.xml中写:
<select id="queryUserMultyIds2" parameterType="com.bit.Pack.UserPacking" resultType="com.bit.po.User">
select * from user
<where>
<foreach collection="ids" item="everyId" open="id in (" close=")" separator=",">
#{everyId}
</foreach>
</where>
</select>
单元测试通过。
把<foreach collection="ids" item="everyId" open="and (" close=")" separator="or"> id=#{everyId} </foreach>
提取出来,放到之前的<sql></sql>
中,并加上<if>
判断:
<if test="ids!=null">
<foreach collection="ids" item="everyId"
open="and ("
close=")"
separator="or">
id=#{everyId}
</foreach>
</if>
执行单元测试:
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper= sqlSession.getMapper(UserMapper.class);
UserPacking userPacking=new UserPacking();
UserEx userEx=new UserEx();
userEx.setSex("2");
userEx.setUsername("vin");
userPacking.setUserEx(userEx);
List<Integer> queryList=new ArrayList<>();
queryList.add(25);
queryList.add(26);
queryList.add(30);
userPacking.setIds(queryList);
List<User> user=userMapper.queryUserMultyIds(userPacking);
System.out.println(user);
}
这样的话只输出id=30的元组,而如果注释掉
userEx.setSex("2");
userEx.setUsername("vin");
会输出id=25,26和30的元组。
把<foreach collection="ids" item="everyId" open="id in (" close=")" separator=","> #{everyId} </foreach>
也提到<sql>
中.在<mySQL>
中已经有了一段<if test="ids!=null">
的了,而这一段的开头也应是<if test="ids!=null">
,重复的话是不合法的,因此需要把它放在另一个<sql>
中。
提取如下:
<sql id="mySQL2">
<if test="ids!=null">
<foreach collection="ids" item="everyId"
open="id in (" close=")" separator=",">
#{everyId}
</foreach>
</if>
</sql>
<select id="queryUserMultyIds2" parameterType="com.bit.Pack.UserPacking" resultType="com.bit.po.User">
select * from user
<where>
<include refid="mySQL2"/>
</where>
</select>
单元测试通过。
关联映射:
以order表为主表。
订单与用户之间是一对一的关系。新建OrderMapper接口和OrderMapper.xml。
连接有两种:内连接和外连接,如果使用内连接,返回的是两个表共同有的那部分(相当于交集)。
sql语句为:
select orders.*,user.username,user.address,user.sex from orders,user where orders.user_id=user.id;
新建个OrderEx(Order的扩展类):
package com.bit.po;
public class OrdersEx extends Orders{
private String username;
private String sex;
private String address;
}
在OrderMapper中写:
package com.bit.mapper;
import com.bit.po.OrdersEx;
import java.util.List;
public interface OrderMapper {
public List<OrdersEx> queryOrdersByUser() throws Exception;
}
其xml与之对应:
<select id="queryOrdersByUser" resultType="com.bit.po.OrdersEx">
select orders.*,user.username,user.address,user.sex
from orders,user
where orders.user_id=user.id;
</select>
在单元测试中写:
SqlSession sqlSession=sqlSessionFactory.openSession();
OrderMapper orderMapper= sqlSession.getMapper(OrderMapper.class);
List<OrdersEx> result=orderMapper.queryOrdersByUser();
System.out.println(result); }
catch (Exception ex){ex.printStackTrace();}
}}
通过。
我们要查的是Order表,使用resultMap来实现一对一的操作。
在resultMap中将Order的信息补充完整:首先,是Orders表中的信息:
<resultMap id="queryOrdersByUserResultMap" type="com.bit.po.Orders">
<id column="id" property="id"/>
<result column="user_id" property="userid"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
</resultMap>
再在<resultMap>
中添加<association>
来表示一对一的关系,
其中property表示的是ResultMap的Type中的属性值,因此此时还需要在Order类中新增User类型的属性user,(并生成其getter、setter方法)把user放到property中,而JavaType指的是这个user所属的类型,<id column>
指的是orders表和user表关联的关键字段:
<association property="user" javaType="com.bit.po.User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="adress" property="adress"/>
</association>
单元测试通过。
用resultMap和resultType都可以实现一对一的映射,最好使用resultMap,返回的是真正的需求对象。
接下来,还是以订单表为主,订单到订单明细表是一对多的关系,仍然使用内连接。
这时的订单明细表orderdetail,它既关联着user表的id,又关联着item表的id,如下所示:
先写sql语句:
select
-> orders.*,
-> user.username,
-> user.address,
-> user.sex,
-> orderdetail.id as ordertail_id,
-> orderdetail.items_id,
-> orderdetail.items_num
-> from
-> orders,
-> user,
-> orderdetail
-> where
-> orders.user_id=user.id
-> and orders.id=orderdetail.id;
查询结果如下所示:
但凡用resultMap,它的type一定不是包装类和扩展类,用的是原类。
在resultMap中,首先定义Order类的信息:
<resultMap id="queryOrderByOrderdetailsResultMap" type="com.bit.po.Orders">
<id column="id" property="id"/>
<result column="user_id" property="useid"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
</resultMap>
接下来,定义User类的相关信息:
<association property="user" javaType="com.bit.po.User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
再下来,需要Orderdetail的相关信息,从Order到Orderdetail是一对多的关系,只要有一边是多(无论是一对多还是多对多)都需要使用Collection。
需要在Order类中定义一个List类型的属性(并且需要getter、setter方法)。
在中写:
<collection property="orderdetails" ofType="com.bit.po.Orderdetail">
<id column="orderdetail_id" property="id"/>
<result column="orders_id" property="id"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
</collection>
以上的是看Orderdetail表中的关键字段,即表中的列名orderdetai_id。
是返回的结果List中的那个Orderdetail。
返回的都是Map<>或者List<>,<>中包的类型。
在相应的OrderMapper接口中声明相应方法,并进行测试:
List<Orderdetail> result=orderMapper.queryOrderByOrderdetails();
System.out.println(result);
运行结果为:
[Orders{id=1, userid=25, number=‘1000018’, createtime=Tue Sep 27 18:03:20 CST 2016, note=‘null’},
Orders{id=2, userid=26, number=‘1000014’, createtime=Mon Dec 29 13:32:22 CST 2014, note=‘null’},
Orders{id=3, userid=32, number=‘1000032’, createtime=Fri Feb 07 06:23:34 CST 2014, note=‘null’}]
与用sql所查结果一致:
接下来,还是以Order表为主,查商品,是多对多的关系。
先写sql语句,
select orders.*,user.username,user.address,user.sex,orderdetail.id,orderdetail.items_id,orderdetail.items_num, items.name,items.detail,items.price from orders,user,orderdetail,items where orders.user_id=user.id and orders.id=orderdetail.id and orderdetail.items_id=items.id;
查询结果为:
表最多可以有1024列,无限行。
在OrderMapper.xml中依次定义Order、user(用association)、orderdetail(用collection)、items(用association):
<resultMap id="queryOrderByItemsResultMap" type="com.bit.po.Orders">
<id column="id" property="id"/>
<result column="user_id" property="userid"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<association property="user" javaType="com.bit.po.User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
<collection property="orderdetails" ofType="com.bit.po.Orderdetail">
<id column="orderdetail_id" property="id"/>
<result column="orders_id" property="id"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
<association property="items" javaType="com.bit.po.Items">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="price" property="price"/>
<result column="detail" property="detail"/>
</association>
</collection>
</resultMap>
<select id="queryOrderByItems" resultMap="queryOrderByItemsResultMap">
select orders.*,user.username,user.address,user.sex,orderdetail.id,orderdetail.items_id,orderdetail.items_num,
items.name,items.detail,items.price
from orders,user,orderdetail,items
where orders.user_id=user.id and
orders.id=orderdetail.id
and orderdetail.items_id=items.id;
</select>
</mapper>
这里的items只能和orderdetail进行关联,所以需要写到orderdetail中:
那么需要在OrderDetail类中添加items属性(及其getter、setter方法)(因为是一对一关系,所以不需要List类型)。
<collection property="orderdetails" ofType="com.bit.po.Orderdetail">
<id column="orderdetail_id" property="id"/>
<result column="orders_id" property="id"/>
<result column="items_id" property="itemsId"/>
<result column="items_num" property="itemsNum"/>
<association property="items"javaType="com.bit.po.Items">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="price" property="price"/>
<result column="detail" property="detail"/>
</association>
</collection>
单元测试结果为:
[Orders{id=1, userid=25, number=‘1000018’, createtime=Tue Sep 27 18:03:20 CST 2016, note=‘null’},
Orders{id=2, userid=26, number=‘1000014’, createtime=Mon Dec 29 13:32:22 CST 2014, note=‘null’},
Orders{id=3, userid=32, number=‘1000032’, createtime=Fri Feb 07 06:23:34 CST 2014, note=‘null’}]