Spring之Mybatis2 输入输出映射 关联映射查询 学习笔记

新建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’}]

发布了47 篇原创文章 · 获赞 1 · 访问量 1280

猜你喜欢

转载自blog.csdn.net/weixin_41750142/article/details/102147493