SSM(一对多和多对多)
一对多:
背景:
一个用户有多个订单,订单的用户只有一个人。
属性:
首先是在User实体类里面封装一个Order(订单类)的集合。
userMapper接口:
/**
* 查看该用户的全部订单
* 一对多的关系 因此返回的是 List类型
* @return
*/
List<User>findAllWithOrders();
userMapper.xml:
在之前一对一的时候,用的是association,但是咱们这个是一对多的关系,返回的是集合,用的是collection标签。里面的属性和之前的association里面是一样的。
<?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.findyou.mapper.UserMapper">
<resultMap id="userMap" type="com.findyou.entity.User">
<!--这个是属性是集合的 其他对象-->
<id column="id" property="id"/>
<result column="username" property="username"/>
<!--这里是一对多 属性是集合类别的 因此 用的是 collection -->
<collection property="ordersList" ofType="Orders">
<id column="oid" property="id"/>
<result column="ordertime" property="ordertime"/>
<result column="total" property="total"/>
</collection>
</resultMap>
<select id="findAllWithOrders" resultMap="userMap">
select u.*, o.id oid, ordertime, total, uid from user u left join orders o on u.id = o.uid;
</select>
</mapper>
测试类:
/**
* 一对多的查询
*/
@Test
public void test02() {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
throw new RuntimeException(e);
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(); /*默认的是手动的提交 如果里面的参数是true的话 就为自动提交了*/
// 这个是获取mapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.findAllWithOrders();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
运行的结果:
多对多:
背景:
一个用户可能有多个职位,每个职位可能对应多个用户。
多对多可以拆分为两个一对多的。
属性:
首先是在User实体类里面封装一个occupation(职称类)的集合。
userMapper接口:
/**
* 查找用户的职业 一个用户对应多个职业
* @return
*/
List<User> findAllWithOccupation();
userMapper.xml:
<resultMap id="occupationMap" type="com.findyou.entity.User">
<!--这个是属性是集合的 其他对象-->
<id column="id" property="id"/>
<result column="username" property="username"/>
<collection property="occupationList" ofType="Occupation">
<id column="oid" property="id"/>
<result column="name" property="name"/>
<result column="d" property="desc"/>
</collection>
</resultMap>
<select id="findAllWithOccupation" resultMap="occupationMap">
select u.*, oc.id oid, name, oc.desc d from user u left join user_occupation uo on u.id = uo.userid
left join occupation oc on oc.id = uo.occupation_id;
</select>
测试类:
/**
* 多对多的查询
* 可以分为两个1对多的 因此这个写法 和上面的是类似的
*/
@Test
public void test03() {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
throw new RuntimeException(e);
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(); /*默认的是手动的提交 如果里面的参数是true的话 就为自动提交了*/
// 这个是获取mapper对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.findAllWithOccupation();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}