JavaWeb【Mybatis】关联查询***

关联查询

  • (1)项目不可能只有一个表,一般是多表
  • (2)多表关系为,一对一,一对多,多对多
  • (3)查询的数据来自多个表,要使用多表查询
    笛卡尔集,显示内连接inner join,左外连接left outer join,右外连接right outer join,子查询select嵌套select
  • (4)查询的结果要封装成javaBean对象 ,在Mybatis中重点掌握resultMap

关联查询-一对一

(1)关联查询的中的一对一是指,站在订单的角度看,一个订单有一个用户跟它对应
(2)数据来自两个表,使用连接查询,需要输出所有订单,使用左外连接

  • association 标签 用于 成员变量的类型为自定义实体类型
  • 添加属性:autoMapping=“true”,自动映射

编写测试

src\test\java\com\lfy\pack01\Test02.java

public class Test02 {
    @Test
    public void test01(){
        //ResultMap=>原来的Order类
        SqlSession session = MySessionUtils.getSession();

        OrderDao orderDao = session.getMapper(OrderDao.class);
        List<Order> list=orderDao.findAllOrder();
        System.out.println(list);
        //关闭资源
        session.commit();
        session.close();
    }
}

改造Order类

src\main\java\com\lfy\bean\Order.java

public class Order {
    // 订单id
    private int id;
    // 用户id
    private Integer userId;
    // 订单号
    private String number;
    // 订单创建时间
    private Date createtime;
    // 备注
    private String note;
    //增加User成员变量来接收一条记录的用户的查询字段
    private User user;

定义接口

src\main\java\com\lfy\dao\OrderDao.java

public interface OrderDao {
    //select * from `order`
    public List<Order> findAll();
    /*select o.id as id,
    o.user_id as userId,
    o.number,
    o.createtime,
    o.note,
    u.id as uid,
    u.username,
    u.birthday,
    u.sex,
    u.address
    from `order` o left join `user` u
    on o.user_id=u.id;*/
    List<Order> findAllOrder();
}

resultMap与association 配置映射***

  • 映射配置的重点是 Order类中的 User user 成员变量,它的类型User是自定义实现类的类型
  • autoMapping:表示如果字段名和属性名一致,则自动映射

src\main\resources\com\lfy\dao\OrderDao.xml

<mapper namespace="com.lfy.dao.OrderDao">
<!-- resultMap必须指定order类与连接查询的结果的字段的对应关系
         property指定java中的变量
         column指定数据库中的字段
         相同的可以不写
         association 关联标签,表示自定义类的类型
    -->
    <resultMap id="findAllOrderMap" type="com.lfy.bean.Order" autoMapping="true">
        <id property="id" column="id" />
        <association property="user" javaType="com.lfy.bean.User" autoMapping="true">
            <id property="id" column="uid" />
        </association>
    </resultMap>
    <select id="findAllOrder" resultMap="findAllOrderMap">
    select o.id as id,
    o.user_id as userId,
    o.number,
    o.createtime,
    o.note,
    u.id as uid,
    u.username,
    u.birthday,
    u.sex,
    u.address
    from `order` o left join `user` u
    on o.user_id=u.id;
    </select>
</mapper>

关联查询-一对多

  • (1)关联查询的中的一对多是指,站在用户的角度看,一个用户会存在多个订单跟他对应。

  • (2)数据来自两个表,使用连接查询,需要输出每一个用户有多少个订单

  • (3)查询结果使用collection标签 映射List<元素>

编写测试

src\test\java\com\lfy\pack01\Test03.java

public class Test03 {
    @Test
    public void test01(){
        //ResultMap=>原来的User类
        SqlSession session = MySessionUtils.getSession();

        UserDao userDao = session.getMapper(UserDao.class);
        List<User> list = userDao.findAllUsers();
        System.out.println(list);
        //关闭资源
        session.commit();
        session.close();
    }
}

改造User类

src\main\java\com\lfy\bean\User.java

public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    //变量类型是集合List
    private List<Order> orders;

定义接口

src\main\java\com\lfy\dao\UserDao.java

public interface UserDao {
    /*select u.id as id,
    u.username,
    u.birthday,
    u.sex,
    u.address,
    o.id as oid,
    o.user_id as userId,
    o.number,
    o.createtime,
    o.note
    from `user` u left join `order` o
    on u.id=o.user_id;*/
    List<User> findAllUsers();
}

ResultMap与collection配置映射***

src\main\resources\com\lfy\dao\UserDao.xml

<mapper namespace="com.lfy.dao.UserDao">
    <!--如果一个类成员变量出现集合类型,List,则需要使用collection标签了映射,字段与变量的关系
    ofType指定的集合List<元素> 元素的类型,不要写成javaType-->
    <resultMap id="findAllUsersMap" type="com.lfy.bean.User" autoMapping="true">
        <id column="id" property="id" />
        <collection property="orders" ofType="com.lfy.bean.Order" autoMapping="true">
            <id property="id" column="oid" />
        </collection>
    </resultMap>
    <select id="findAllUsers" resultMap="findAllUsersMap">
    select u.id as uid,
    u.username,
    u.birthday,
    u.sex,
    u.address,
    o.id as oid,
    o.user_id as userId,
    o.number,
    o.createtime,
    o.note
    from `user` u left join `order` o
    on u.id=o.user_id;
    </select>
</mapper>

配置核心配置文件

src\main\resources\SqlMapConfig.xml

<!--   一个mapper标签可以指定一个映射文件-->
    <mappers>
         <mapper resource="com/lfy/dao/UserDao.xml"/>
         <mapper resource="com/lfy/dao/OrderDao.xml"/>
    </mappers>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值