MyBatis(7)-多表关联(1)-测试数据表及测试工程

一、构建测试表

创建用户表、商品表、订单表、订单详情表

1.1、用户表:USERINIFO

MyBatis(7)-多表关联(1)-测试数据表及测试工程

1.2、添加用户表测试数据

MyBatis(7)-多表关联(1)-测试数据表及测试工程

1.3、商品表:items

MyBatis(7)-多表关联(1)-测试数据表及测试工程

1.4、添加商品表测试数据

MyBatis(7)-多表关联(1)-测试数据表及测试工程

1.5、订单表:orders

MyBatis(7)-多表关联(1)-测试数据表及测试工程

1.6、添加订单表测试数据

MyBatis(7)-多表关联(1)-测试数据表及测试工程

1.7、订单明细表:orderdetail

MyBatis(7)-多表关联(1)-测试数据表及测试工程

1.8、添加订单明细表测试数据

MyBatis(7)-多表关联(1)-测试数据表及测试工程

二、创建测试工程

2.1、创建工程

MyBatis(7)-多表关联(1)-测试数据表及测试工程

2.2、搭建mybatis依赖环境

mybatis、数据库、junit依赖包

MyBatis(7)-多表关联(1)-测试数据表及测试工程

2.3、创建工程测试源文件

MyBatis(7)-多表关联(1)-测试数据表及测试工程

2.4、db.properties文件内容

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatisdemo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=999999

2.5、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>
  <!-- 全局参数配置-懒加载 -->
  <settings>
    <setting name="lazyLoadingEnabled" value="true"/>
  </settings>
  <!-- 添加别名 -->
  <typeAliases>
    <package name="com.boxue.mybatis.entity"/>
  </typeAliases>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <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.boxue.mybatis.mapper"/>
  </mappers>
</configuration>

2.6、Userinfo.java文件

package com.boxue.mybatis.entity;

import java.sql.Date;

public class Userinfo {
  private int id;
  private String username;
  private String sex;
  private Date birthday;
  private String address;
  //提供get、set、toString方法
}

2.7、UserinfoMapper.java接口里的内容

package com.boxue.mybatis.mapper;

import com.boxue.mybatis.entity.Userinfo;

public interface UserinfoDao {
  public Userinfo findUserById(int id);

}

2.8、UserinfoMapper.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.boxue.mybatis.mapper.UserinfoDao">

  <!-- 根据id查询用户信息 -->
  <select id="findUserById" parameterType="int" resultType="com.boxue.mybatis.entity.Userinfo">
    select * from userinfo where id=#{id}
  </select>

</mapper>

2.9、UserinfoMapperTest.java类里的内容

package com.boxue.mybatis.test;

import java.io.IOException;
import java.io.InputStream;

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.boxue.mybatis.entity.Userinfo;
import com.boxue.mybatis.mapper.UserinfoDao;

public class UserinfoMapperTest{
  private SqlSessionFactory sqlSessionFactory;
  @Before
  public void setUp() throws IOException{
    String resource="SqlMapConfig.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  }

  @Test
  public void TestMethod(){
    //根据id查询用户信息

    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserinfoMapper ud = sqlSession.getMapper(UserinfoMapper.class);
    Userinfo u = ud.findUserById(1);
    System.out.println(u);

  }
}

2.10、测试,运行测试类,出现结构,环境搭建成功

MyBatis(7)-多表关联(1)-测试数据表及测试工程

三、一对一关系查询

需求:查询订单信息,关联查询创建订单的用户信息

主表:订单表

关联表:用户表

关联关系:一对一关联关系

关联方式:通过关联字段(订单表的用户id和用户表的id),进行关联

sql语句:

select orders.*,userinfo.username,userinfo.sex,userinfo.address

from orders,userinfo

where orders.user_id=userinfo.id

获取数据的方式:resultType、resultMap

3.1、resultType方式的一对一关系测试

3.1.1、创建订单表对应的映射对象Orders.java

MyBatis(7)-多表关联(1)-测试数据表及测试工程

3.1.2、映射对象Orders.java的内容

package com.boxue.mybatis.entity;

import java.sql.Date;

import java.util.List;

public class Orders {

private int id;

private int user_id;

private String number;

private Date createtime;

private String note;

  //添加get、set、toString方法

}

3.1.3、创建订单表的拓展类OrdersCustom.java

MyBatis(7)-多表关联(1)-测试数据表及测试工程

3.1.4、OrdersCustom.java类里的内容

package com.boxue.mybatis.entity;

//注意:理解继承的含义

public class OrdersCustom extends Orders{

private String username;

private String sex;

private String address;

  //为属性提供get、set、toString方法

}

3.1.5、UserinfoMapper.java映射接口中添加findOrdersUser()方法

MyBatis(7)-多表关联(1)-测试数据表及测试工程

3.1.6、UserinfoMapper.xml映射文件中添加查询标记

MyBatis(7)-多表关联(1)-测试数据表及测试工程

3.1.7、测试类,测试成功

MyBatis(7)-多表关联(1)-测试数据表及测试工程

3.2、resultMap方式的一对一关系测试

3.2.1、Orders.java类型中添加Userinfo用户属性

提供get、set方法,在toString方法中调用用户的toString方法

MyBatis(7)-多表关联(1)-测试数据表及测试工程

3.2.2、UserinfoMapper.java接口中添加方法

//查询订单信息关联查询用户信息resultMap方式

public List<Orders> findOrdersUserResultMap();

3.2.3、UserinfoMapper.xml映射文件中添加

<!-- resultMap方式 -->

<resultMap type="orders" id="ordersUserResultMap">

<id column="id" property="id"/>

<result column="user_id" property="user_id"></result>

<result column="number" property="number"></result>

<result column="createtime" property="createtime"></result>

<result column="note" property="note"></result>

<!-- association用于配置包含的用户对象

property属性的引用名

javaType包含的对象的类型

-->

<association property="userinfo" javaType="userinfo">

<id column="user_id" property="id"></id>

<result column="username" property="username"/>

<result column="sex" property="sex"/>

<result column="address" property="address"/>

</association>

</resultMap>

<select id="findOrdersUserResultMap" resultMap="ordersUserResultMap">

 select orders.*,userinfo.username,userinfo.sex,userinfo.address

from orders,userinfo

where orders.user_id=userinfo.id

 </select>

3.2.4、测试方法中添加

//1对1关联关系查询订单信息关联查询用户信息,resultMap方式

List<Orders> oList = ud.findOrdersUserResultMap();

System.out.println(oList);

4、一对多关系查询

需求:查询订单及订单明细信息

主表:订单表

关联表:订单明细表

关联关系:一对多的关联关系

关联方式:订单表单id与订单明细表的订单id进行关联,一张订单对应多个明细

sql语句:

select orders.*,

userinfo.username,userinfo.sex,userinfo.address,

orderdetail.id orderdetail_id,orderdetail.ITEMS_ID,orderdetail.ITEMS_NUM

from orders,userinfo,orderdetail

where orders.user_id=userinfo.id

and orders.ID=orderdetail.ORDERS_ID

4.1、一对多关系查询测试

4.1.1、添加订单明细映射类Orderdetail.java

MyBatis(7)-多表关联(1)-测试数据表及测试工程

4.1.2、Orderdetail.java类里的内容

package com.boxue.mybatis.entity;

public class Orderdetail {

private int id;

private int orders_id;

private int items_id;

private int items_num;

  //添加get、set、toString方法

}

4.1.3、UserinfoMapper.java映射接口添加

//查询订单信息关系查询订单明细信息,使用resultMap

public List<Orders> findOrdersAndOrderDetailResultMap();

4.1.4、UserinfoMapper.xml映射文件添加

<!-- 查询订单信息关系查询订单明细信息,使用resultMap -->

 <resultMap type="orders" id="OrdersAndOrderDetailResultMap" extends="ordersUserResultMap">

 <!-- 继承ordersUserResultMap的匹配过程,订单及用户的匹配过程就不用在写了,运行时依照继承原理,现在执行父级在执行子级 -->

 <!--collection用于匹配集合

 property:订单对象中集合的引用名

 ofType:集合可以存放数据的类型  -->

 <collection property="orderdetails" ofType="Orderdetail">

 <id column="orderdetail_id" property="id"></id>

<result column="ITEMS_ID" property="items_id"/>

<result column="ITEMS_NUM" property="items_num"/>

 </collection>

 </resultMap>

 <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">

  select orders.*,

    userinfo.username,userinfo.sex,userinfo.address,

    orderdetail.id orderdetail_id,orderdetail.ITEMS_ID,orderdetail.ITEMS_NUM

  from orders,userinfo,orderdetail

  where orders.user_id=userinfo.id

  and orders.ID=orderdetail.ORDERS_ID

 </select>

4.1.5、UserinfoMapperTest.java测试方法中添加测试代码,测试成功

//1对多的关联查询,查询订单信息关系查询订单明细信息,使用resultMap

List<Orders> odList = ud.findOrdersAndOrderDetailResultMap();

System.out.println(odList);

5、多对多关系查询

需求:用户购买的商品

主表:用户表

关联表:商品表,订单表,订单详情表。由于用户表和商品表是两个独立的表,没有关联字段。所以,要通过订单表的和订单明细表进行关联

关联关系:多对多关联

关联方式:用户表的id与订单表的用户id关联,订单表的id与订单详情表的订单id关联,订单详情表的商品id与商品表的id关联

sql语句:

select orders.*,

userinfo.username,userinfo.sex,userinfo.address,

orderdetail.id orderdetail_id,orderdetail.ITEMS_ID,orderdetail.ITEMS_NUM,

items.name,items.PRICE,items.DETAIL,items.PIC

from orders,userinfo,orderdetail,items

where orders.user_id=userinfo.id

and orders.ID=orderdetail.ORDERS_ID

and orderdetail.ITEMS_ID=items.ID

5.1、多对多关系查询测试

5.1.1、创建items.java映射类

MyBatis(7)-多表关联(1)-测试数据表及测试工程

5.1.2、items.java类内容

package com.boxue.mybatis.entity;

import java.sql.Timestamp;

public class Items {

private int id;

private String name;

private float price;

private String detail;

private String pic;

private Timestamp createtime;

  //添加get、set、toString方法

}

5.1.3、Userinfo.java添加属性

//订单属性

private List<Orders> orders;

5.1.4、修改toString方法

@Override

public String toString() {

return "Userinfo [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday

+ ", address=" + address +orders+ "]";

}

5.1.3、Orders.java添加属性

//订单明细信息

private List<Orderdetail> orderdetails;

5.1.4、修改toString方法

@Override

public String toString() {

return "Orders [id=" + id + ", user_id=" + user_id + ", number=" + number + ", createtime=" + createtime

+ ", note=" + note +orderdetails+"]";

}

5.1.5、Orderdetail.java添加属性

//商品信息

private Items items;

5.1.6、修改toString方法

@Override

public String toString() {

return "Orderdetail [id=" + id + ", orders_id=" + orders_id + ", items_id=" + items_id + ", items_num="

+ items_num + items.toString()+"]";

}

5.1.7、UserinfoMapper.java映射接口添加方法

//查询用户信息关联查询商品信息,多对多关系,resultMap

public List<Userinfo> findUserinfoAndItemsResultMap();

5.1.8、UserinfoMapper.xml映射文件添加

 <!-- 查询用户信息关联查询商品信息,多对多关系,resultMap -->

 <resultMap type="userinfo" id="UserinfoAndItemsResultMap">

 <id column="user_id" property="id"></id>

<result column="username" property="username"/>

<result column="sex" property="sex"/>

<result column="address" property="address"/>

<collection property="orders" ofType="Orders">

<id column="id" property="id"/>

<result column="user_id" property="user_id"></result>

<result column="number" property="number"></result>

<result column="createtime" property="createtime"></result>

<result column="note" property="note"></result>

<collection property="orderdetails" ofType="Orderdetail">

<id column="orderdetail_id" property="id"></id>

<result column="ITEMS_ID" property="items_id"/>

<result column="ITEMS_NUM" property="items_num"/>

<association property="items" javaType="Items">

<id column="ITEMS_ID" property="id"/>

<result column="name" property="name"></result>

<result column="PRICE" property="price"></result>

<result column="DETAIL" property="detail"></result>

<result column="PIC" property="pic"></result>

</association>

</collection>

</collection>

 </resultMap>

 <select id="findUserinfoAndItemsResultMap" resultMap="UserinfoAndItemsResultMap">

 select orders.*,

userinfo.username,userinfo.sex,userinfo.address,

orderdetail.id orderdetail_id,orderdetail.ITEMS_ID,orderdetail.ITEMS_NUM,

items.name,items.PRICE,items.DETAIL,items.PIC

from orders,userinfo,orderdetail,items

where orders.user_id=userinfo.id

and orders.ID=orderdetail.ORDERS_ID

and orderdetail.ITEMS_ID=items.ID

 </select>

 

 

主表:订单表

关联表:用户表

关联关系:一对一关联关系

关联方式:通过关联字段进行关联

sql:

select orders.*,userinfo.username,userinfo.sex,userinfo.address

from orders,userinfo

where orders.user_id=userinfo.id

 

获取数据的方式:resultType、resultMap

上一篇:MyBatis(3)-开发dao的方式


下一篇:Servlet+jdbc完成CRUD操作