Mybatis关联查询 多表查询

关联查询

  • 由于项目一般都是多个表,所以表与表的关系一般分为一对一,一对多,多对多
  • 当查询的数据来自多个表时,这时候就要需要使用多表查询了
  • 多表查询的方式包括:笛卡尔集,显示内连接inner join,左外连接left outer join,右外连接right outer join,子查询select嵌套select
  • 查询的结果要封装成JavaBean对象,在Mybatis中重点掌握resultType和resultMap

一对一查询

  • 关联查询的中的一对一是指,站在订单的角度看,一个订单有一个用户跟它对应
    数据来自两个表,使用连接查询,需要输出所有订单,使用左外连接
    查询结果可以有两种方式封装数据
    》resultType 指定一个自定义javaBean类(通常要再编写一个新的javaBean类)
    》resultMap 指定映射关系(不用编写新的javaBean类 推荐使用)
  • 案例
    编写测试
 public void test04(){
    
    
        SqlSession session = MySessionUtils.getSession();
        OrderDao orderDao = session.getMapper(OrderDao.class);
        List<OrderUser> list=orderDao.findAllOrderUser();
        System.out.println(list);
        session.commit();
        session.close();
    }

创建新类OrderUser

public class OrderUser {
    
    
    //订单的属性
    private int id;
    private Integer user_id;
    private String number;
    private Date createtime;
    private String note;
    //用户的属性
    private int uid;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    public int getId() {
    
    
        return id;

定义接口方法

List<OrderUser> findAllOrderUser();

ResultType配置映射

<select id="findAllOrderUser" resultType="OrderUser">
        select o.id as oid,
        o.user_id,
        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>

一对一查询(二)

  • association 标签 用于 成员变量的类型为自定义实体类型
  • 添加属性:autoMapping=“true”,自动映射
  • 案例
    编写测试
    public void test05(){
    
    
        SqlSession session = MySessionUtils.getSession();
        OrderDao orderDao = session.getMapper(OrderDao.class);
        List<Order> list = orderDao.findAllOrder2();
        System.out.println(list);
        session.commit();
        session.close();
    }

在order表增加另一个表user

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

编写接口方法

List<Order> findAllOrder2();

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

   <resultMap id="findAllOrder2Map" type="com.wxx.bean.Order" autoMapping="true">
        <id property="id" column="id"></id>
        <association  property="user" javaType="com.wxx.bean.User"  autoMapping="true">
            <id column="uid" property="id"/>

        </association>
    </resultMap>
    <select id="findAllOrder2" resultMap="findAllOrder2Map">
        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>

一对多查询

  • 关联查询的中的一对多是指,站在用户的角度看,一个用户会存在多个订单跟他对应。
  • 数据来自两个表,使用连接查询,需要输出每一个用户有多少个订单
  • 查询结果使用collection标签 映射List<元素>
    编写测试
public void test06(){
    
    
        SqlSession session = MySessionUtils.getSession();
        UserDao userDao = session.getMapper(UserDao.class);
        List<User> list = userDao.findAllUsers();
        System.out.println(list);
        session.commit();
        session.close();
    }

改写User对象

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

编写方法实现接口

List<User> findAllUsers();

ResultMap与collection配置映射

    <resultMap id="findAllUsersMap" type="com.wxx.bean.User" autoMapping="true">
        <id property="id" column="uid"></id>
        <collection property="orders" ofType="com.wxx.bean.Order" autoMapping="true">
            <id property="id" column="oid"></id>
        </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>

猜你喜欢

转载自blog.csdn.net/xinxin_____/article/details/108812923