Mybatis复杂映射开发

102 阅读2分钟

Mybatis复杂映射开发

一对一

⽤户表和订单表的关系为,⼀个⽤户有多个订单,⼀个订单只从属于⼀个⽤户
⼀对⼀查询的需求:查询⼀个订单,与此同时查询出该订单所属的⽤户

用户表
在这里插入图片描述

订单表 uid表示用户id
在这里插入图片描述

⼀对⼀查询的语句

对应的sql语句:

select * from orders o,user u where o.uid=u.id;

查询结果

在这里插入图片描述

实际开发需要将其封装在Java对象里

创建Order和User实体

Order


public class Order {

    private Integer id;
    private String orderTime;
    private Double total;

    // 表明该订单属于哪个用户
    private User user;

    public User getUser() {
        return user;
    }
//get set 省略。。

User

public class User implements Serializable {

    private Integer id;

    private String username;
// get set 省略。。。
}
创建OrderMapper接⼝
public interface OrderMapper {
List<Order> findAll();
}
IOrderMapper.xml
<mapper namespace="com.lagou.mapper.IOrderMapper">
    <!--   1对1 查询结果映射集-->
    <resultMap id="orderMap1" type="com.lagou.pojo.Order">
        <result  property="id" column="id"></result>
        <result  property="orderTime" column="orderTime"></result>
        <result  property="total" column="total"></result>
        <!--        当前类型-->
        <!--            配置user属性的映射  uid 实际就是 用户id-->
        <association property="user" javaType="com.lagou.pojo.User">
            <result  property="id" column="uid"></result>
            <result  property="username" column="orderTime"></result>
        </association>
    </resultMap>

    <select id="findOrder2User" resultMap="orderMap1">
        select * from orders o,user u where o.uid = u.id
    </select>
</mapper>
测试
   @Test
    public void findOrder2User() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        IOrderMapper mapper = sqlSession.getMapper(IOrderMapper.class);
        List<Order> orderAndUser = mapper.findOrder2User();
        for (Order order : orderAndUser) {
            System.out.println(order);
        }
    }

可以看到结果
在这里插入图片描述

一对多映射

⽤户表和订单表的关系为,⼀个⽤户有多个订单,⼀个订单只从属于⼀个⽤户

对应的sql语句:

select *,o.id oid from user u left join orders o on u.id=o.uid;

可以看到用户id为1 的有两个订单
在这里插入图片描述

User实体

我们用 orderList 来表示接收多个的订单集合即一个用户对应多个订单

public class User {
private int id;
private String username;
private String password;
private Date birthday;
//代表当前⽤户具备哪些订单
private List<Order> orderList;

 }
创建UserMapper接⼝
public interface UserMapper {
List<User> findAll();
}
UserMapper.xml
<mapper namespace="com.mapper.IUserMapper">


    <resultMap id="userMap2" type="com.lagou.pojo.User">
        <result column="id" property="id"></result>
        <result column="username" property="username"></result>
        <!--    一对多 属性类型需要用 ofType 来指定-->
        <collection property="orderList" ofType="com.lagou.pojo.Order">
            <result property="id" column="oid"></result>
            <result property="orderTime" column="ordertime"></result>
            <result property="total" column="total"></result>
        </collection>
    </resultMap>

    <select id="findAll2" resultMap="userMap2">
       select u.*,o.id oid,o.ordertime,o.total,o.uid from user u left join orders o on o.uid = u.id
   </select>
</mapper>
测试
    @Test
    public void findAll2() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);

        List<User> users = mapper.findAll2();
        for (User user : users) {
            System.out.println(user.getUsername());
            System.out.println(user.getOrderList());
            System.out.println("============");

        }
    }

可以看到lucy 有两个订单,tom有一个
在这里插入图片描述

多对多

⽤户表和⻆⾊表的关系为,⼀个⽤户有多个⻆⾊,⼀个⻆⾊被多个⽤户使⽤
多对多查询的需求:查询⽤户同时查询出该⽤户的所有⻆⾊

用户表
在这里插入图片描述
用户角色关联表

在这里插入图片描述

角色表
在这里插入图片描述

对应的sql语句:

SELECT
	u.*,
	r.rolename,
	r.id as rid 
FROM
	USER u
	LEFT JOIN sys_user_role ur ON u.id = ur.userid
	INNER JOIN sys_role r ON ur.roleid = r.id;

在这里插入图片描述

添加UserMapper接⼝⽅法

   public List<User>  manyUser2ManyRole();

xml

<mapper namespace="com.lagou.mapper.IUserMapper">
    <resultMap id="userMap2" type="com.lagou.pojo.User">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>

        <collection property="roleList" ofType="com.lagou.pojo.Role">

            <id property="id" column="rid"/>
            <result column="rolename" property="rolename"></result>
        </collection>
    </resultMap>

   <select id="manyUser2ManyRole" resultMap="userMap2" >
    SELECT
        u.*,
        r.rolename,
        r.id as rid
    FROM
        USER u
        LEFT JOIN sys_user_role ur ON u.id = ur.userid
        INNER JOIN sys_role r ON ur.roleid = r.id;
   </select>
</mapper>
测试
 @Test
    public void test3() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);

        List<User> users = mapper.manyUser2ManyRole();
        for (User user : users) {
            for (Role role : user.getRoleList()) {
                System.out.println(user.getUsername() + " -->  " + role.getRolename());
            }
            System.out.println("============");

        }


    }

可以看到结果

在这里插入图片描述