16mybatis多表操作

一对一

  1. 定义一个用户user表(id, username, password)

    定义一个订单orders表 (id, ordertime, total, uid)

  2. 在domain包中编写User和Order类

    • Order中有属性 private User user;
  3. 在dao包中编写UserMapper、OrderMapper接口,并在OrderMapper中定义findAll方法

  4. 编写UserMapper.xml和OrderMapper.xml文件,并在OrderMapper.xml实现联合查询

    • resultType改成resultMap
    • resultMap中定义联合查询字段和实体属性的映射关系
    <mapper namespace="com.dao.OrderMapper">
        <resultMap id="orderMap" type="order">
    <!--    手动指定字段与实体属性的映射关系-->
            <id column="oid" property="id"/>
            <result column="ordertime" property="ordertime"/>
            <result column="total" property="total"/>
            <result column="uid" property="user.id"/>
            <result column="username" property="user.username"/>
            <result column="password" property="user.password"/>
        </resultMap>
    <!--联合查询-->
        <select id="findAll" resultMap="orderMap">
            select *, o.id oid from user u, orders o where o.uid=u.id
        </select>
    </mapper>
    
  5. 定义核心配置文件

  6. 测试

    //  获取核心配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    // 获取session工厂对象
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    // 获得session会话对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
    // 执行操作(参数就是配置文件中的id)
    List<Order> all = mapper.findAll();
    for (Order o : all) {
        System.out.println(o);
    }
    
    // 释放资源
    sqlSession.close();
    

一对一2

OrderMapper.xml映射文件中,第二种联合数据的封装方式:

  • 有些鸡肋,个人感觉上面那种更简单。
<mapper namespace="com.dao.OrderMapper">
    <resultMap id="orderMap" type="order">
<!--    手动指定字段与实体属性的映射关系-->
        <id column="oid" property="id"/>
        <result column="ordertime" property="ordertime"/>
        <result column="total" property="total"/>
<!--    属性为user, javaType表示User实体-->
        <association property="user" javaType="user">
            <id column="uid" property="id"/>
            <result column="username" property="username"/>
            <result column="password" property="password"/>
        </association>
    </resultMap>
<!--联合查询-->
    <select id="findAll" resultMap="orderMap">
        select *, o.id oid from user u, orders o where o.uid=u.id
    </select>
</mapper>

一对多

用到的数据表和上面一样,因为一个用户可以有多个订单。

  1. 在User类中定义订单属性private List<Order> orderList;

  2. 在UserMapper接口中定义findAll方法

  3. 在UserMapper.xml中写查询

    <mapper namespace="com.dao.UserMapper">
        <resultMap id="userMap" type="user">
            <id column="uid" property="id"/>
            <result column="username" property="username"/>
            <result column="password" property="password"/>
    <!--    订单集合-->
            <collection property="orderList" ofType="order">
                <id column="oid" property="id"/>
                <result column="ordertime" property="ordertime"/>
                <result column="total" property="total"/>
            </collection>
        </resultMap>
    <!--联合查询-->
        <select id="findAll" resultMap="userMap">
            select *, o.id oid from user u, orders o where u.id=o.uid
        </select>
    </mapper>
    
  4. 测试

多对多

多对多关系需要引入一个中间表,所以有三个数据表:一个用户对应多个角色,一个角色对应多个用户

user(id, username, password)
user_role(user_id, role_id)
role(id, rolename)

多对多形式上和一对多一样。主要代码如下:

  1. 建上面三个表

  2. 编写Role和User类,并在User中定义属性角色集合private List<Role> roleList;

  3. 在UserMapper接口中定义方法public List<User> findAllUserAndRole();

  4. 定义UserMapper.xml映射文件

    <mapper>
        <resultMap id="userRoleMap" type="user">
            <id column="userId" property="id"/>
            <result column="username" property="username"/>
            <result column="password" property="password"/>
            <collection property="roleList" ofType="role">
                <id column="roleId" property="id"/>
                <result column="rolename" property="rolename"/>
            </collection>
        </resultMap>
        <select id="findAllUserAndRole" resultMap="userRoleMap">
            select * from user u, role r, user_role ur where u.id=ur.userId and r.id=ur.roleId
        </select>
    </mapper>
    
  5. 定义核心配置文件

  6. 测试

原文地址:https://www.cnblogs.com/mingriyingying/p/13639622.html