一、构建测试表
创建用户表、商品表、订单表、订单详情表
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