zoukankan      html  css  js  c++  java
  • 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. 测试

  • 相关阅读:
    《计算学科系统导论》系列路线图
    “知行合一”的高职计算机教学观
    文化的概念
    关于班级博客地址
    一个字符编码处理小程序(一)
    关于计应151/152《软件工程》课程实践的安排
    人人都要学一点系统论
    我与软件工程
    关于本人与本博客
    THUWC前集训9
  • 原文地址:https://www.cnblogs.com/mingriyingying/p/13639622.html
Copyright © 2011-2022 走看看