博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MyBatis - 07多表查询

Posted on 2020-11-24 09:41  Kingdomer  阅读(106)  评论(0编辑  收藏  举报

MyBatis - 07多表查询

(1)一对一查询

用户表和订单表: 一个用户可以有多个订单,一个订单只属于一个用户。

需求: 查询一个订单,及订单所属的用户信息

(1.1)实体类User、Order

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;// 省略其他代码
}
public class Order {
    private int id;
    private String ordertime;
    private double total;

    private User user;
    // 省略其他代码
}

(1.2)核心配置文件

    <!--加载映射文件-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"></mapper>
        <mapper resource="mapper/OrderMapper.xml"></mapper>
    </mappers>

(1.3)映射文件 OrderMapper.xml

    <select id="findAll" resultType="order">   // 能够查询出所有数据,却不能映射到Order类的User属性上
        select *,o.id oid from orders o, user u where o.uid = u.id;
    </select>

 

    <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 *,o.id oid from orders o, user u where o.uid = u.id;
    </select>

 

    <resultMap id="orderMap" type="order">
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
// 方式二 <association property="user" javaType="user"> // order实例类中的属性名称user 属性类型User(private User 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>

 

Order{id=1, ordertime=2020-11-14 21:58:18, total=3000.0, user=User{id=1, username='zhangsan', password='123', birthday=null}}
Order{id=2, ordertime=2020-11-14 21:58:29, total=5800.0, user=User{id=1, username='zhangsan', password='123', birthday=null}}
Order{id=3, ordertime=2020-11-14 21:58:44, total=323.0, user=User{id=2, username='lisi', password='456', birthday=null}}
Order{id=4, ordertime=2020-11-14 21:58:47, total=2345.0, user=User{id=1, username='zhangsan', password='123', birthday=null}}
Order{id=5, ordertime=2020-11-14 21:58:56, total=100.0, user=User{id=2, username='lisi', password='456', birthday=null}}
Order{id=6, ordertime=2020-11-14 21:59:07, total=2009.0, user=User{id=5, username='firefly', password='222222', birthday=null}}

 

(2)一对多查询

需求: 查询用户信息,同时查询出用户的订单。  一个用户,多个订单。

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

    private List<Order> orderList;
    // 省略其他代码
}

 

    <resultMap id="userMap" type="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>
        <!--配置集合信息   property: 集合名称    ofType: 当前集合中的数据类型  -->
        <collection property="orderList" ofType="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>

 

public class MapperTest {

    private UserMapper userMapper;

    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        userMapper = sqlSession.getMapper(UserMapper.class);
    }
@Test
public void testFindUserAndOrderAll(){ List<User> all = userMapper.findAll(); for (User user: all) { System.out.println(user); } } }

 

(3)多对多查询

用户表和角色表的关系: 一个用户有多个角色,一个角色被多个用户使用。 数据库表: 用户表 、 角色表、  用户角色绑定表

需求:查询所有用户,并同时查询用户所具有的角色信息

public class Role {
    private int id;
    private String roleName;
    private String roleDesc;
    // 省略其他代码
}
public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;

    private List<Role> roleList;
    // 省略其他代码
}
    <resultMap id="userMap" type="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>

        <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="userMap">
        select *,u.id uid from user u, sys_user_role ur, sys_role r where u.id = ur.userId and ur.roleId = r.id
    </select>

 

List<User> userList = userMapper.findUserAndRoleAll();
for(User user:userList){
    System.out.println(user);
}

 

(4)小结

一对一配置: 使用<resultMap>

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

多对多配置: 使用<resultMap> + <collectiion>