0
点赞
收藏
分享

微信扫一扫

mybatis:多表查询&&注解开发

mybatis:多表操作

1. 一对一查询

  • 关键:如何在mapper中定义一个对象的映射

  • 解决:resultMap(+association)

  • 实体:
    order.class
    public class Order {
    private int id;
    private Date ordertime;
    private double total;
    private User user; ♥
    }

  • 模型:
    在这里插入图片描述

  • 查询数据库语句:select *,o.oid oid from orders o,user u where o.oid=u.uid

  • mapper文件中:

1. 错误示范(因为查询到的结果无法自动填充到order的成员变量User中)
<select id="findAll" resultType="order">
         SELECT *,o.id oid FROM orders o,USER u WHERE o.uid=u.id
</select>

2. 正确示范(添加resultMap)

	<!--1.resultMap标签:
		id:方便select标签引用
		type:要封装的java对象,即order的路径
    -->
    <resultMap id="orderMap" type="order">
    
       	<!--2.手动指定字段与实体属性的映射关系:
        	标签:	主键有id标签,其它字段用result标签
            属性:	column: 数据表的字段名称
            		property:实体的属性名称
        -->
        <id column="oid" property="id"></id>
        <result column="ordertime" property="ordertime"></result>
        <result column="total" property="total"></result>
        
        <!--法一:直接法,user.属性-->
        <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>

        <!--法二:为user添加一个association
            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>

    <select id="findAll" resultMap="orderMap">
         SELECT *,o.id oid FROM orders o,USER u WHERE o.uid=u.id
    </select>


2. 一对多查询

  • 关键:如何在mapper中定义一个对象集合的映射
  • 解决:resultMap+collection
  • 模型:查询一个用户,与此同时查询出该用户具有的订单。一个用户的多个订单
  • 实体:
    User:
    private int id;
    private String username;
    private String password;
    private Date birthday;
    //描述的是当前用户存在哪些订单
    private List orderList;♥
    }
  • mapper定义
    • collection标签:配置集合信息
      • property:集合名称
      • ofType:当前集合中的数据类型
   <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>

3. 多对多查询(三个表)

  • 关键:如何在mapper中定义一个对象集合的映射,涉及三个表

  • 解决:resultMap+collection

  • 模型:用户表和角色表关系为:一个用户有多个角色,一个角色被多个人使用。查询用户,与此同时查询出该用户的所有角色。三表查询
    在这里插入图片描述

  • 实体:
    Role:
    private int id;
    private String roleName;
    private String roleDesc;

    User:
    private int id;
    private String username;
    private String password;
    private Date birthday;
    //描述的是当前用户具备哪些角色
    private List(Role) roleList;

  • sql语句:
    SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id

  • mapper定义

 <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>

mybatis:注解开发

1. 常用注解

注解名称作用
@Insert
@Upadte
@Delete
@Select
@Result实现结果集封装
@Results封装多个结果集
@One一对一结果集封装
@Many一对多结果集封装

2. 开发步骤

  • 在核心文件SqlMapConfig.xml中加载映射关系
    (之前xml方式是加载映射文件UserMapper.xml)
    在这里插入图片描述
  1. 在UserMapper接口中的方法上添加注解

    • 简单增删改查
      在这里插入图片描述
    • 复杂查询

    1).自定义为Order封装一个User对象

    法一在这里插入图片描述
    标明为主键:id=true

    法二

    其中one = @One(…)中的为已经实现的操作
    findById:要传参数[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imblog.csdnimgF/BnyT1792f62647694f23b492f0e68aaa1bbe.png?x-oss-process=image/watermark,type_d3FLXplbmhlaQ,shadow_50,text_Q5NETiBA5pit5pit5pit5pit,size_30,color_FFFFFF,t_70,g_se,x_167(https://img-是blog.csdnimg.cn/1792f62647694f23b492f0e68aaa1bbe.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pit5pit5pit5pit,size_20,color_FFFFFF,t_70,g_se,x_16)]2).自定义为User封装一个List(Order)集合find在这里插入图片描述
    3).多对多查询(三表的一对多)
    在这里插入图片描述
    在这里插入图片描述

举报

相关推荐

0 条评论