关联查询
- (1)项目不可能只有一个表,一般是多表
- (2)多表关系为,一对一,一对多,多对多
- (3)查询的数据来自多个表,要使用多表查询
笛卡尔集,显示内连接inner join,左外连接left outer join,右外连接right outer join,子查询select嵌套select - (4)查询的结果要封装成javaBean对象 ,在Mybatis中重点掌握resultMap
关联查询-一对一
(1)关联查询的中的一对一是指,站在订单的角度看,一个订单有一个用户跟它对应
(2)数据来自两个表,使用连接查询,需要输出所有订单,使用左外连接
- association 标签 用于 成员变量的类型为自定义实体类型
- 添加属性:autoMapping=“true”,自动映射
编写测试
src\test\java\com\lfy\pack01\Test02.java
public class Test02 {
@Test
public void test01(){
//ResultMap=>原来的Order类
SqlSession session = MySessionUtils.getSession();
OrderDao orderDao = session.getMapper(OrderDao.class);
List<Order> list=orderDao.findAllOrder();
System.out.println(list);
//关闭资源
session.commit();
session.close();
}
}
改造Order类
src\main\java\com\lfy\bean\Order.java
public class Order {
// 订单id
private int id;
// 用户id
private Integer userId;
// 订单号
private String number;
// 订单创建时间
private Date createtime;
// 备注
private String note;
//增加User成员变量来接收一条记录的用户的查询字段
private User user;
定义接口
src\main\java\com\lfy\dao\OrderDao.java
public interface OrderDao {
//select * from `order`
public List<Order> findAll();
/*select o.id as id,
o.user_id as userId,
o.number,
o.createtime,
o.note,
u.id as uid,
u.username,
u.birthday,
u.sex,
u.address
from `order` o left join `user` u
on o.user_id=u.id;*/
List<Order> findAllOrder();
}
resultMap与association 配置映射***
- 映射配置的重点是 Order类中的 User user 成员变量,它的类型User是自定义实现类的类型
- autoMapping:表示如果字段名和属性名一致,则自动映射
src\main\resources\com\lfy\dao\OrderDao.xml
<mapper namespace="com.lfy.dao.OrderDao">
<!-- resultMap必须指定order类与连接查询的结果的字段的对应关系
property指定java中的变量
column指定数据库中的字段
相同的可以不写
association 关联标签,表示自定义类的类型
-->
<resultMap id="findAllOrderMap" type="com.lfy.bean.Order" autoMapping="true">
<id property="id" column="id" />
<association property="user" javaType="com.lfy.bean.User" autoMapping="true">
<id property="id" column="uid" />
</association>
</resultMap>
<select id="findAllOrder" resultMap="findAllOrderMap">
select o.id as id,
o.user_id as userId,
o.number,
o.createtime,
o.note,
u.id as uid,
u.username,
u.birthday,
u.sex,
u.address
from `order` o left join `user` u
on o.user_id=u.id;
</select>
</mapper>
关联查询-一对多
-
(1)关联查询的中的一对多是指,站在用户的角度看,一个用户会存在多个订单跟他对应。
-
(2)数据来自两个表,使用连接查询,需要输出每一个用户有多少个订单
-
(3)查询结果使用collection标签 映射List<元素>
编写测试
src\test\java\com\lfy\pack01\Test03.java
public class Test03 {
@Test
public void test01(){
//ResultMap=>原来的User类
SqlSession session = MySessionUtils.getSession();
UserDao userDao = session.getMapper(UserDao.class);
List<User> list = userDao.findAllUsers();
System.out.println(list);
//关闭资源
session.commit();
session.close();
}
}
改造User类
src\main\java\com\lfy\bean\User.java
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
//变量类型是集合List
private List<Order> orders;
定义接口
src\main\java\com\lfy\dao\UserDao.java
public interface UserDao {
/*select u.id as id,
u.username,
u.birthday,
u.sex,
u.address,
o.id as oid,
o.user_id as userId,
o.number,
o.createtime,
o.note
from `user` u left join `order` o
on u.id=o.user_id;*/
List<User> findAllUsers();
}
ResultMap与collection配置映射***
src\main\resources\com\lfy\dao\UserDao.xml
<mapper namespace="com.lfy.dao.UserDao">
<!--如果一个类成员变量出现集合类型,List,则需要使用collection标签了映射,字段与变量的关系
ofType指定的集合List<元素> 元素的类型,不要写成javaType-->
<resultMap id="findAllUsersMap" type="com.lfy.bean.User" autoMapping="true">
<id column="id" property="id" />
<collection property="orders" ofType="com.lfy.bean.Order" autoMapping="true">
<id property="id" column="oid" />
</collection>
</resultMap>
<select id="findAllUsers" resultMap="findAllUsersMap">
select u.id as uid,
u.username,
u.birthday,
u.sex,
u.address,
o.id as oid,
o.user_id as userId,
o.number,
o.createtime,
o.note
from `user` u left join `order` o
on u.id=o.user_id;
</select>
</mapper>
配置核心配置文件
src\main\resources\SqlMapConfig.xml
<!-- 一个mapper标签可以指定一个映射文件-->
<mappers>
<mapper resource="com/lfy/dao/UserDao.xml"/>
<mapper resource="com/lfy/dao/OrderDao.xml"/>
</mappers>