mybatis关系映射

1.用户与订单的关系

  • 一个用户有多个订单,一个订单只属于一个用户

    • 查询一个用户的所有订单

      属于一对多查询示例

      public interface UserMapper {
          @Select("select * from user")
          @Result({
              @Result(id=true, column="id", property="id"),
              @Result(column="username", property="username"),
              @Result(column="password", property="password"),
              @Result(
                  property="orderList",
                  column="id",
                  javaType=List.class,
                  many=@Many(select="com.miaokela.mapper.OrderMapper.findByUid")  // 通过订单Mapper查询当前用户id对应的订单信息
              )
          })
          public List<User> findAllUserAndOrder();  // 查询所有用户以及用户下的订单
      }
      

      根据用户ID查询所有订单的Mapper

      public interface OrderMapper {
          @Select("select * from order where uid=#{uid}")
          public List<Order> findByUid(int uid);
      }
      
      • 用户模型

        public class User {
            private int id;
            private String username;
            private String password;
            private Date birthday;
        }
        
      • 订单模型

        public class Order {
            private int id;
            private Date ordertime;
            private double total;
        
            // 属于哪个用户
            private User user;
        }
        
      • xml的通过resultMap实现mapper接口,查询所有用户以及用户下的订单

        <resultMap id="userMap" type="com.miaokela.domain.User">
            <id column="id" property="id"/>
            <result column="username" property="username"/>
            <result column="password" property="password"/>
            <result column="birthday" property="birthday"/>
            <collection property="orderList" ofType="com.miaokela.domain.Order">
                <id column="id" property="id"/>
                <result column="ordertime" property="ordertime"/>
                <result column="total" property="total"/>
            </collection>
        </resultMap>
        
    • 查询订单信息以及关联用户(一个)信息

      • 两张表分开查

        属于多对一查询示例

        public interface OrderMapper {
            @Select("select * from order")
            @Result({
                @Result(id=true, column="id", property="id"),
                @Result(column="ordertime", property="ordertime"),
                @Result(column="total", property="total"),
                @Result(
                    property="user",
                    column="uid",
                    one=@One(select="com.miaokela.mapper.UserMapper.findById")  // 通过用户Mapper查询当前订单id对应的用户信息
                )
            })
            public List<Order> findAllOrderAndUser();  // 查询所有订单以及订单下的用户
        }
        

        根据用户ID查询用户信息的Mapper

        public interface UserMapper {
            @Select("select * from user where id=#{id}")
            public User findById(int id);
        }
        
        • xml的方式实现mapper接口,查询订单信息以及对应用户的信息
          <resultMap id="orderMap" type="com.miaokela.domain.Order">
              <id column="id" property="id"/>
              <result column="ordertime" property="ordertime"/>
              <result column="total" property="total"/>
              <association property="user" column="uid" select="com.miaokela.mapper.UserMapper.findById"/>
          </resultMap>
          
      • 两张表一起查

        属于多对一查询示例

        public interface OrderMapper {
            @Select("select o.*, u.username, u.password, u.birthday from order o, user u where o.uid=u.id")
            @Result({
                @Result(id=true, column="id", property="id"),
                @Result(column="ordertime", property="ordertime"),
                @Result(column="total", property="total"),
                @Result(column="uid", property="uid"),
                @Result(column="username", property="user.username"),
                @Result(column="password", property="user.password"),
            })
            public List<Order> findAll();  // 查询所有订单以及订单下的用户信息
        }
        
        • xml的方式实现mapper接口,两张表一起查
          <resultMap id="orderMap" type="com.miaokela.domain.Order">
              <id column="id" property="id"/>
              <result column="ordertime" property="ordertime"/>
              <result column="total" property="total"/>
              <result column="uid" property="uid"/>
              <result column="username" property="user.username"/>
              <result column="password" property="user.password"/>
          </resultMap>
          
  • 一个用户有多个角色,一个角色可以属于多个用户

    查询一个用户信息以及其属于的所有角色
    属于多对多查询示例,操作等同于一对多查询

    public interface UserMapper {
        @Select("select * from user")
        @Result({
            @Result(id=true, column="id", property="id"),
            @Result(column="username", property="username"),
            @Result(column="password", property="password"),
            @Result(
                property="roleList",
                column="id",
                javaType=List.class,
                many=@Many(select="com.miaokela.mapper.RoleMapper.findByUid")  // 通过角色Mapper查询当前用户id对应的角色信息
            )
        })
        public List<User> findAllUserAndRole();  // 查询所有用户以及用户下的角色
    }
    

    根据用户ID查询所有角色的Mapper

    // 用户关联的角色表信息: 通过第三张表的roleId和userId分别关联到role和user表中的id的条件,查询出角色表的数据
    public interface RoleMapper {
        @Select("select * from user_role ur, role r where ur.roleId=r.id and ur.userId=#{uid}")
        public List<Role> findByUid(int uid);
    }
    
    • 用户模型

      public class User {
          ...
          private List<Role> roleList;
      }
      
    • xml的方式实现mapper接口,查询用户信息以及对应角色的信息

      <resultMap id="userMap" type="com.miaokela.domain.User">
          <id column="id" property="id"/>
          <result column="username" property="username"/>
          <result column="password" property="password"/>
          <collection property="roleList" ofType="com.miaokela.domain.Role">
              <id column="id" property="id"/>
              <result column="roleName" property="roleName"/>
              <result column="roleDesc" property="roleDesc"/>
          </collection>
      </resultMap>
      
posted on 2022-10-29 10:39  _tiny_coder  阅读(39)  评论(0编辑  收藏  举报