一:一对一查询
1、商品订单数据模型
2、一对一查询,需求:查询一个订单信息,关联查询下单用户信息。【这里的表结构会打包打给大家】
3、开发步骤:
3.1、在navicat中写sql语句,验证一下语句是否正确。
3.2、引入podo
3.3、在UserMapper中写映射文件。当然你可以新建一个OrdersMapper.xml,我觉得麻烦就写在一起了
注意了:返回的结果集必须是resultMap。这是因为在Order中有关联对象user,但是数据库不会知道user_id–>找到user对象—>映射到user里面去。所以需要手动映射。手动映射跟之前的映射方法是一样的。我们这里主要学习一对一的映射使用的是< association >标签。其实到末尾总结的时候,你会发现,一对已映射,跟一对多映射我们只需要掌握两个标签
<!--
//一对一关联 查询 以订单为中心 关联用户
public List<Orders> selectOrders();
-->
<resultMap type="orders" id="ordersOne">
<!--这里你需要映射的字段都不能省略,一个个都必须写出来-->
<id column="id" property="id"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="user_id" property="userId"/>
<!-- 以下是一对一的映射,采用的是association标签配置 -->
<association property="user" javaType="user">
<!--这里你需要映射的字段都不能省略,一个个都必须写出来-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="address" property="address"/>
</association>
</resultMap>
<!-- 测试1对1查询 -->
<select id="selectOrdersByUserId" parameterType="int" resultMap="ordersOne">
select o.id,
o.number,
o.user_id,
o.createtime,
u.username,
u.address
from orders o
LEFT JOIN user u
on o.user_id = u.id
where o.id = #{id}
</select>
4.4 、在UserMapper接口中,配置该方法
public Orders selectOrdersByUserId(Integer id);
4.5、写测试用例
@Test
public void selectOrdersByUserId(){
SqlSessionFactory sqlSessionFactory = MybatisUtilsForMe.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
UserMapper ordersMapper = session.getMapper(UserMapper.class);
Orders orders = ordersMapper.selectOrdersByUserId(3);
System.out.println("===========");
System.out.println("orders 的id = "+orders.getId());
System.out.println("orders 的userId = "+orders.getUserId());
System.out.println("orders 的number = "+orders.getNumber());
System.out.println("orders 的createtime = "+orders.getCreatetime());
System.out.println("-------------------");
System.out.println("user 的username = "+orders.getUser().getUsername());
System.out.println("user 的address = "+orders.getUser().getAddress());
System.out.println("user 的id = "+orders.getUser().getId());
System.out.println("===========");
session.commit();
session.close();
}
4.6、测试结果如下
4.7、自此,我们就学会了一对一映射
二:一对多的查询
1、商品订单数据模型
2、需求:查询所有用户信息及用户关联的订单信息。一个用户有多个订单,也就是一对多
3、开发步骤
3.1、在navicat中写sql语句,验证一下语句是否正确。
//查询用户id为1的订单,下述查询出来有两个订单哦
3.2、引入podo,podo跟上面是一样的,但是在User.podo中添加一个List< Orders >,如图
3.3、在UserMapper中写映射文件。当然你可以新建一个OrdersMapper.xml,我觉得麻烦就写在一起了 。注意了:返回的结果集必须是resultMap。这是因为在User中有关联对象orders,但是数据库不会知道u.id –>找到orders对象—>映射到user里面去。所以需要手动映射。手动映射跟之前的映射方法是一样的。我们这里主要学习一对一的映射使用的是< collection >标签。其实到末尾总结的时候,你会发现,一对一映射,跟一对多映射我们只需要掌握两个标签
<!--
//一对多关联
public List<User> selectUserList(); -->
<resultMap type="user" id="userOne">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<!-- 一对多 -->
<collection property="ordersList" javaType="list" ofType="orders">
<id property="id" column="oid"/>
<result column="createtime" property="createtime"/>
<result column="number" property="number"/>
</collection>
</resultMap>
<select id="selectUserList" parameterType="int" resultMap="userOne">
select
u.id,
u.username,
u.address,
o.number,
o.createtime,
o.id as oid
from user u
LEFT JOIN orders o
on o.user_id = u.id
where u.id = #{id}
</select>
3.4 、在UserMapper接口中,配置该方法
public User selectUserList(Integer id);
3.5、写测试用例
@Test
public void selectUserList(){
SqlSessionFactory sqlSessionFactory = MybatisUtilsForMe.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
UserMapper ordersMapper = session.getMapper(UserMapper.class);
User user = ordersMapper.selectUserList(1);
System.out.println("---打印user信息");
System.out.println("user 的id = "+user.getId());
System.out.println("user 的 username = "+user.getUsername());
System.out.println("user 的 address = "+user.getAddress());
System.out.println("--------------");
List<Orders> ordersList = user.getOrdersList();
for (Orders orders : ordersList) {
System.out.println("订单的id = "+orders.getId()+"--订单编码 = "+orders.getNumber());
}
session.commit();
session.close();
}
3.6、测试结果如下
3.7 、自此,我们就学会了一对多映射
【总结:】其实上述的代码跟前面写的代码没有什么区别,只是需要学习两个新的标签。一对多跟多对多的配置标签而已。