Mybatis实现多表查询(一对一、一对多、多对多)

一、一对一查询

1.1 模型

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

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
在这里插入图片描述

1.2 SQL语句

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

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

1.3 创建Order和User实体类

Order.java

public class Order {    
	private int id;    
	private Date ordertime;    
	private double total;    
	//代表当前订单从属于哪一个客户    
	private User user;
	// 省略get set方法
}

User.java

public class User {
   private int id;    
   private String username;    
   private String password;    
   private Date birthday;
   // 省略get set方法
}

1.4 创建OrderMapper接口

public interface OrderMapper {    
	List<Order> findAll();
}

1.5 配置OrderMapper.xml

通过sql查询并封装数据,此处返回类型使用的resultMap,在这里完成数据的封装。

<mapper namespace="com.happy.mapper.OrderMapper">
    <resultMap id="orderMap" type="order">
        <!--手动指定字段与实体属性的映射关系
            column: 数据表的字段名称
            property:实体的属性名称
        -->
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
        <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>

当然,除了改方式外,还可通过association完成对象封装,如下:

<resultMap id="orderMap" type="order">
    <!--手动指定字段与实体属性的映射关系
        column: 数据表的字段名称
        property:实体的属性名称
    -->
    <id column="oid" property="id"></id>
    <result column="ordertime" property="ordertime"></result>
    <result column="total" property="total"></result>
    <result column="uid" property="user.id"></result>
    <!--
        property: 当前实体(order)中的属性名称(private User user)
        javaType: 当前实体(order)中的属性的类型(User)
    -->
    <association property="user" javaType="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>
    </association>
</resultMap>

1.6 测试

执行测试代码,如下:

@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);
    }

    sqlSession.close();
}

输出结果为:
在这里插入图片描述

二、一对多查询

2.1 模型

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

一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
在这里插入图片描述

2.2 SQL语句

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

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

2.3 修改User和Order实体类

Order.java

public class Order {    
	private int id;    
	private Date ordertime;    
	private double total;    
	//代表当前订单从属于哪一个客户    
	private User user;
	// 省略get set方法
}

User.java

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

2.4 创建UserMapper接口

public interface UserMapper {    
	List<User> findAll();
}

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>

2.6 测试

执行如下测试代码:

@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> all = mapper.findAll();
    for(User user : all){    
    	System.out.println(user.getUsername());    
    	List<Order> orderList = user.getOrderList();    
    	for(Order order : orderList){        
    		System.out.println(order);    
    	}    
    	System.out.println("----------------------------------");
    }
    sqlSession.close();
}

输出结果为:
在这里插入图片描述

三、多对多查询

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

多对多查询的需求:查询用户同时查询出该用户的所有角色
在这里插入图片描述

3.2 SQL语句

对应的sql语句:select u.*,r.*,r.id rid from user u left join user_role ur on u.id=ur.user_id inner join role r on ur.role_id=r.id;

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

3.3 修改User类,创建Role类

public class Role {    
	private int id;    
	private String rolename;
	// 省略get set方法
}
public class User {    
	private int id;    
	private String username;    
	private String password;    
	private Date birthday;
    //代表当前用户具备哪些订单    
    private List<Order> orderList;
    //代表当前用户具备哪些角色    
    private List<Role> roleList;
    // 省略get set方法
}

3.4 UserMapper接口添加方法

添加查询方法,如下:

List<User> findAllUserAndRole();

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>

3.6 测试

执行如下测试代码:

@Test
public void test3() 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> 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("----------------------------------");}
    sqlSession.close();
}

输出结果为:
在这里插入图片描述

四、小结

Mybatis多表配置方式:

  • 一对一,使用<resultMap>做配置
  • 一对多,使用<resultMap><collection>做配置
  • 多对多,使用<resultMap><collection>做配置
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值