一对多:
背景:
一个用户有多个订单,订单的用户只有一个人。
属性:
首先是在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>
测试类:
/*** 一对多的查询*/@Testpublic 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.useridleft join occupation oc on oc.id = uo.occupation_id;</select>
测试类:
/*** 多对多的查询* 可以分为两个1对多的 因此这个写法 和上面的是类似的*/@Testpublic 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();}