首页 > 其他 > 详细

Mybatis关联查询

时间:2020-04-01 16:05:34      阅读:59      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

一对一查询

需求:查询所有订单信息,关联查询下单用户信息。

 

注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。(订单表为主表 一对一)

如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。(用户表为主表 一堆多)

sql语句:

SELECT
    o.id,
    o.user_id userId,
    o.number,
    o.createtime,
    o.note,
    u.username,
    u.address
FROM
    `order` o
LEFT JOIN `user` u ON o.user_id = u.id

 

因为要查询的数据两个表都有,所以这里直接写一个封装继承订单表,但是写用户表的 用户名和地址属性

技术分享图片

 

在写toString的时候要吧

技术分享图片

 

 也选上才行

因为这里是订单表为主表 所以这里的mapper写到OrdersMappers里面去

技术分享图片

 

 这里的resultType(返回值)写的是我们所刚创建的封装类

技术分享图片

 

 因为这里的字段名和我们封装类的属性不一致 所以为了遍历取的别名

然后在去接口里写方法:

技术分享图片

 

 然后去测试类测试

@Test
    public void get2() throws IOException {
        // 1.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 3. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        // 4. 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取UserMapper的动态代理对象(实现类对象)
        OrdersMapper ordersMapper=sqlSession.getMapper(OrdersMapper.class);
        List<OrdersUser> list=ordersMapper.getoradersUser();
        
        System.out.println(list);
        // 7. 释放资源
        sqlSession.close();

    }

 方法二:使用resultMap

使用resultMap,定义专门的resultMap用于映射一对一查询结果。

先改造一下我们之前封装的订单表orders表

技术分享图片

 

 加一个user对象,然后get set tostring都点出来

 然后因为orders是主表所以取ordersmapper.xml里

    <resultMap type="orders" id="getOuser">
        <id property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <result property="number" column="number"/>
        <result property="createtime" column="createtime"/>
        <result property="note" column="note"/>
        <!-- 一对一 -->
        <association property="user" javaType="user">
        <id property="id" column="user_id"/>
        <result property="username" column="username"/>
        <result property="address" column="address"/>
        </association>
    </resultMap>
    <!-- 查询所有订单信息关联用户(一对一)(resultMap) -->
    <select id="getOrdersAndUser" resultMap="getOuser">
        SELECT
        o.id,
        o.user_id,
        o.number,
        o.createtime,
        o.note,
        u.username,
        u.address
        FROM
        orders o
        LEFT JOIN  user u ON o.user_id = u.id

    </select>

 

技术分享图片

 

 然后到接口里写方法:

技术分享图片

 

 在到测试类:

@Test
    public void get3() throws IOException {
        // 1.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 3. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        // 4. 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取UserMapper的动态代理对象(实现类对象)
        OrdersMapper ordersMapper=sqlSession.getMapper(OrdersMapper.class);
        List<Orders> list=ordersMapper.getOrdersAndUser();
        
        System.out.println(list);
        // 7. 释放资源
        sqlSession.close();

    }

 一对多查询

案例:查询所有用户信息及用户关联的订单信息。

用户信息和订单信息为一对多关系。

sql语句:

SELECT
    u.id,
    u.username,
    u.birthday,
    u.sex,
    u.address,
    o.id oid,
    o.number,
    o.createtime,
    o.note
FROM
    `user` u
LEFT JOIN `order` o ON u.id = o.user_id

先改造User类:

技术分享图片

 

 然后吧get set tostring都点出来

在到UserMapper.xml里写(因为主表是用户表)

<resultMap type="user" id="getUser">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="birthday" column="birthday"/>
    <result property="sex" column="sex"/>
    <result property="address" column="address"/>
    <collection property="list" javaType="list" ofType="Orders">
    <id property="id" column="oid"/>
    <result property="number" column="number"/>
    <result property="createtime" column="createtime"/>
    <result property="note" column="note"/>
    
    </collection>
    
    </resultMap>
    <!-- 查有用户信息并关联查询订单信息 -->
    <select id="getUserAndOrders" resultMap="getUser">
        SELECT
        u.id,
        u.username,
        u.birthday,
        u.sex,
        u.address,
        o.id oid,
        o.number,
        o.createtime,
        o.note
        FROM
        user u
        LEFT JOIN order o ON u.id = o.user_id

    </select>

上面还是照常封装

然后下面封装list property是你封装类的里变量名,javatype:声明你的集合是个什么类型,java里面是个什么类型 oftype:泛型

在接口:

技术分享图片

 

 在到测试类:

@Test
    public  void get12() throws IOException {
        // 1.创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 3. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        // 4. 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取UserMapper的动态代理对象(实现类对象)
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        
        List<User> list=userMapper.getUserAndOrders();
        System.out.println(list);
        // 7. 释放资源
        sqlSession.close();
        

    }

 

Mybatis关联查询

原文:https://www.cnblogs.com/www1842564021/p/12612441.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!