ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-10 14:55:33  阅读:316  来源: 互联网

标签:多表 orderdetail private orders 表及 userinfo MyBatis java id


一、构建测试表

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

1.1、用户表:USERINIFO

1.2、添加用户表测试数据

1.3、商品表:items

1.4、添加商品表测试数据

1.5、订单表:orders

1.6、添加订单表测试数据

1.7、订单明细表:orderdetail

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

二、创建测试工程

2.1、创建工程

2.2、搭建mybatis依赖环境

mybatis、数据库、junit依赖包

2.3、创建工程测试源文件

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、测试,运行测试类,出现结构,环境搭建成功

三、一对一关系查询

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

主表:订单表

关联表:用户表

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

关联方式:通过关联字段(订单表的用户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

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

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()方法

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

3.1.7、测试类,测试成功

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

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

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

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

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映射类

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

标签:多表,orderdetail,private,orders,表及,userinfo,MyBatis,java,id
来源: https://www.cnblogs.com/lnboxue/p/13085071.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有