一对一查询(一个订单对应一个用户)
修改Order.class
Order.class添加用户信息
public class Order {
private int id;
private int userId;
private int orderNo;
private String address;
private User user;
@Override
public String toString(){
return "Order.id:"+id+"Order.userId:"+userId+"Order.orderNo:"+orderNo+"Order.address:"+address+"Order.user:"+user;
}
}
在OrderMapper.xml中编写一对一(一个订单对应一个用户)sql
<!-- 一对一关系(一个订单对应一个人) -->
<resultMap type="Order" id="key">
<!--
id和result都是映射单列值到一个属性或字段的简单数据类型。
唯一不同的是,id是作为唯一标识的,当和其他对象实例对比的时候,这个id很有用
-->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="orderNo" property="orderNo"/>
<result column="address" property="address"/>
<!-- association :配置一对一属性 -->
<!-- property:order里面的User属性名 -->
<!-- javaType:属性类型 -->
<association property="user" javaType="User">
<!-- 我的疑惑点:不明白映射关系,到底哪个字段映射到哪个里边 -->
<!-- 连表查询后,两张表的信息合成一张表c展示,把c表中的单列值user_id映射到user的id属性 -->
<!-- 如果此处不配置映射关系,下边sql即使写了,查出来也是默认值,因为没映射 -->
<id column="user_id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</association>
</resultMap>
<select id="getAllOrders" resultMap="key">
select
o.id,
o.user_id,
o.orderNo,
o.address,
u.id as uid,
u.name ,
u.age
from order2 o left join user2 u
on o.user_id = u.id
</select>
我最开始不明白映射关系,不知道最终bean对象中的数据是怎么映射过来的。
- column代表数据库表的列名,property代表bean对象中的属性。从数据库中的column映射到bean对象中对应的属性。result与id作用相同,都是将数据库字段和bean的属性关联起来
- 结合相同sql语句在navcat查询的结果(图一)和
<result column="user_id" property="userId"/>
<result column="orderNo" property="orderNo"/>
对比即可明显发现,将user_id跟Order中的userId属性关联;orderNo和Order中的orderNo属性关联,很容易就能搞清楚映射关系了
在OrderMapper.java中添加getAllOrders方法
/**
* 测试一对一查询
* */
public List<Order> getAllOrders();
在测试类中添加测试方法
/**
* 测试一对一查询
*/
@Test
public void getAllOrder() throws Exception {
// 基本操作
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// sqlSession获取Mapper
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<Order> order = mapper.getAllOrders();
for (int i = 0; i < order.size(); i++) {
System.out.println(order.get(i));
}
}
查询结果如下
一对多查询(一个用户多个订单)
User.class添加订单列表
public class User {
private int id;
private int age;
private String name;
private List<Order> orderList;
@Override
public String toString() {
if(orderList!=null &&orderList.size()>0){
for(int i=0 ;i<orderList.size();i++){
System.out.println(orderList.get(i).toString());
}
}
return "id:" + id + "name:" + name + "age:" + age;
}
}
修改OrderMapper.xml文件
<!-- 一个人对应多个订单 -->
<resultMap type="User" id="key2">
<!-- sql语句给user的id起了一个别名叫uid。此处就可以把user的id映射到User对象的id中,而不必担心与Order的id冲突 -->
<id column="uid" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<!-- property对应bean对象中List<Order> 属性, -->
<collection property="orderList" javaType="List" ofType="Order">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="orderNo" property="orderNo"/>
<result column="address" property="address"/>
</collection>
</resultMap>
<select id="getUsers" resultMap="key2">
select
u.id as uid,
u.name ,
u.age,
o.id,
o.user_id,
o.orderNo,
o.address
from user2 u left join order2 o
on o.user_id = u.id
</select>
- 注意:此处有个细节点,多表查询的时候很容易出现重复字段,比如id,navcat会默认添加id(1),如下图二所示。这样不方便我们编写映射关系。大神告诉我可以给重复字段起别名,比如u.id as uid,这样就避免了字段重复,方便我们编写映射关系了如图三。
在OrderMapper.java中添加getAllOrders方法
/**
* 测试一对多查询(一个用户多个订单)
* */
public List<User> getUsers();
在测试类中添加测试方法
/**
* 测试一对多查询
*/
@Test
public void getAllUsers() throws Exception {
// 基本操作
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// sqlSession获取Mapper
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
List<User> order = mapper.getUsers();
for (int i = 0; i < order.size(); i++) {
System.out.println(order.get(i));
}
}
查询结果如下