day61 JavaWeb框架阶段——Mybatis多表查询(一对一查询 ,一对多查询 ,多对多查询)

1.Mybatis多表查询

今日源码:
链接:https://pan.baidu.com/s/1ntCbe-v4yYtKgqt2MplmQw
提取码:evwm

1.1 一对一查询

1.1.1 一对一查询的模型

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

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

在这里插入图片描述

1.1.2一对一查询的语句

对应的sql语句:select * from orders o,user u where o.uid=u.id;

查询的结果如下:
在这里插入图片描述

1.1.3 创建Order和User实体
public class Order {

    private int id;
    private Date ordertime;
    private double total;

    //代表当前订单从属于哪一个客户
    private User user;
}

public class User {
    
    private int id;
    private String username;
    private String password;
    private Date birthday;

}
1.1.4 创建OrderMapper接口
public interface OrderMapper {
    List<Order> findAll();
}
1.1.5 配置OrderMapper.xml
<mapper namespace="cn.wbslz.mapper.OrderMapper">
    <resultMap id="orderMap" type="cn.wbslz.domain.Order">
        <result column="uid" property="user.id"></result>
        <result column="username" property="user.username"></result>
        <result column="password" property="user.password"></result>
        <result column="birthday" property="user.birthday"></result>
    </resultMap>
    <select id="findAll" resultMap="orderMap">
        select * from orders o,user u where o.uid=u.id
    </select>
</mapper>

其中还可以配置如下:

<resultMap id="orderMap" type="cn.wbslz.domain.Order">
    <result property="id" column="id"></result>
    <result property="ordertime" column="ordertime"></result>
    <result property="total" column="total"></result>
    <association property="user" javaType="cn.wbslz.domain.User">
        <result column="uid" property="id"></result>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>
    </association>
</resultMap>
1.1.6 测试结果
/**
     * 一对一查询
     * @throws IOException
     */
    @Test
    public void test1() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        List<Order> orderList = mapper.findAll();
        for (Order order : orderList) {
            System.out.println(order);//Order{id=1, ordertime=null, total=3000.0, user=User{id=1, username='lucy', password='123', birthday=Wed Dec 12 00:00:00 CST 2018}}
        }

        sqlSession.close();
    }

在这里插入图片描述

1.2 一对多查询

1.2.1 一对多查询的模型

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

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIzWJTIv-1582900660693)(img\图片4.png)]

1.2.2 一对多查询的语句

对应的sql语句:SELECT *,o.id oid FROM USER u,orders o WHERE u.id=o.uid;

查询的结果如下:

在这里插入图片描述

1.2.3 修改User实体
public class Order {

    private int id;
    private Date ordertime;
    private double total;

    //代表当前订单从属于哪一个客户
    private User user;
}

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

1.2.4 创建UserMapper接口
public interface UserMapper {
    List<User> findAll();
}

1.2.5 配置UserMapper.xml
	<!--封装数据-->
	 <resultMap id="userMap" type="user">
        <id column="uid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>
        <!--配置集合信息
            property:集合名称
            ofType:集合中的数据类型
        -->
        <collection property="orderList" ofType="order">
            <!--封装order的数据-->
            <id column="oid" property="id"></id>
            <result column="ordertime" property="ordertime"></result>
            <result column="total" property="total"></result>
        </collection>
    </resultMap>

    <!--一对多查询-->
    <select id="findAll" resultMap="userMap">
        select *,o.id oid from user u,orders o where u.id=o.uid
    </select>
1.2.6 测试结果
    /**
     * 一对多配置
     * @throws IOException
     */
    @Test
    public void test2() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.findAll();

        for(User user: userList){
            System.out.println(user);
        }

        sqlSession.close();
    }

在这里插入图片描述

1.3 多对多查询

1.3.1 多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用

多对多查询的需求:查询用户同时查询出该用户的所有角色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JStlfuyb-1582900660703)(img\图片7.png)]

1.3.2 多对多查询的语句

对应的sql语句:
select * from user u,sys_user_role ur,sys_role r where u.id=ur.userid and ur.roleid=r.id

查询的结果如下:

在这里插入图片描述

1.3.3 创建Role实体,修改User实体
public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
    //代表当前用户具备哪些订单
    private List<Order> orderList;
    //代表当前用户具备哪些角色
    private List<Role> roleList;
}

public class Role {

    private int id;
    private String rolename;

}

1.3.4 添加UserMapper接口方法
List<User> findUserAndRoleAll();
1.3.5 配置UserMapper.xml
 <resultMap id="userRoleMap" type="user">
        <!--user信息-->
        <id column="userid" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>

        <!--user内部的roleList信息-->
        <collection property="roleList" ofType="role">
            <id column="roleid" property="id"></id>
            <result column="rolename" property="roleName"></result>
            <result column="roledesc" property="roleDesc"></result>
        </collection>
    </resultMap>
    <!--多对多查询-->
    <select id="findUserAndRoleAll" resultMap="userRoleMap">
        select * from user u,sys_user_role ur,sys_role r where u.id=ur.userid and ur.roleid=r.id
    </select>
1.3.6 测试结果
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> all = mapper.findAllUserAndRole();
for(User user : all){
    System.out.println(user.getUsername());
    List<Role> roleList = user.getRoleList();
    for(Role role : roleList){
        System.out.println(role);
    }
    System.out.println("----------------------------------");
}

在这里插入图片描述

1.4 知识小结

MyBatis多表配置方式:

一对一配置:使用<resultMap>做配置

一对多配置:使用<resultMap>+<collection>做配置

多对多配置:使用<resultMap>+<collection>做配置


[点开我的主页系统的学习java]

发布了100 篇原创文章 · 获赞 6 · 访问量 4051

猜你喜欢

转载自blog.csdn.net/qq_38454176/article/details/104566012
今日推荐