MyBatis复习day03多表操作

MyBatis多表操作

多表查询即是查询返回结果时它无法自动的对上号,咱就手动的给它封一个Map,手动的人为让数据映射。

以下两张表用于举例

orders表:
在这里插入图片描述

users表:
在这里插入图片描述

example:一对一查询 一个订单对应一个用户

    private int id;
    private Date ordertime;
    private double total;
    // 注意  此处没有直接使用外键   private int uid
    // 功能实现上来讲 没问题   但java讲究的是面向对象   uid此处为连接另一个表的外键
    // 表与表的关系是通过主外键达成的
    // 实体与实体的关系是通过实体的引用去达成的
    // 面向对象的思想  通过实体去引用
    // 当前订单属于哪一个用户
    private User user;

<!--    此处的type  表示封装的是谁的对象数据  此处封装order实体的
        对象数据,故type为order-->
    <resultMap id="orderMap" type="order">
<!--        手动指定字段与实体属性的映射关系
            column:数据表的字段名称
            property:实体的属性名称
     -->
<!--        此处property的属性是order的属性
            查询的结果为order的id
    -->
        <id column="oid" property="id"></id>
<!--        zhu键id的标签为id ,其他普通属性的标签为result-->
        <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,u.id uid FROM orders o,USER u WHERE o.uid=u.id
    </select>

此处是让order表与user表进行连表查询。第二种方法:

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

<!--
    property:当前实体(order)中的属性名称(private User user)
    javaType:当前实体(order)中的属性的类型(User)
    下处association 中的property中的user 为order实体中的属性
-->
        <association property="user" javaType="user">
            <id column="uid" property="id"></id>
            <result column="username" property="username"></result>
            <result column="password" property="password"></result>
        </association>

    </resultMap>

example:一对多查询 一个用户对应多个订单

   private int id;
    private String username;
    private String password;


    // 描述的是当前用于存在哪些订单
    private List<Order> orderList;



    public List<Order> getOrderList() {
        return orderList;
    }

    public void setOrderList(List<Order> orderList) {
        this.orderList = orderList;
    }
    <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>

example: 多对多查询(三张表),引入一张中间表
在这里插入图片描述

example:

在当前user表中引入集合

   //当前用户具备哪些角色
    private List<Role> roleList;

    public List<Role> getRoleList() {
        return roleList;
    }

    public void setRoleList(List<Role> roleList) {
        this.roleList = roleList;
    }

对xml文件进行编写:

    <resultMap id="userRoleMap" type="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的信息-->
        <collection property="roleList" ofType="role">
            <id column="roleId" property="id"></id>
            <result column="roleName" property="roleName"></result>
            <result column="roleDesc" property="roleDesc"></result>
        </collection>
<!--        user内部的roleList信息-->
    </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>

知识小结

  1. 一对一配置:(或者+association标签)
  2. 一对多配置:+
  3. 多对多配置:+
MyBatis注解开发
1.1MyBatis的常用注解

@Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询

@Result:实现结果集封装 @Results:可以与@Result一起使用,封装多个结果集

@One:实现一对一结果集封装 @Many:实现一对多结果集封装

example:

public interface UserMapper {

    @Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
    public void save(User user);

    @Update("update user set username=#{username},password=#{password} where id=#{id}")
    public void update(User user);

    @Delete("delete from user where id=#{id}")
    public void delete(int id);

    @Select("select * from user where id = #{id}")
    public User findById(int id);

    @Select("select * from user")
    public List<User> findAll();

}

使用注解开发,就不需要接口的映射文件,也不需要去加载映射文件。但是仍需要在mybatis核心配置文件中去加载映射关系,例如:

<!--    加载映射关系 -->
    <mappers>
<!--    指定接口所在的包-->
        <package name="com.lxz.mapper"></package>
    </mappers>
1.2MyBatis的注解实现复杂映射开发

使用@Results @One @Many注解组合完成复杂的关系的配置
在这里插入图片描述
在这里插入图片描述

example:

一对一

一个用户对应一个订单

    @Select("select * from orders o,user u where o.uid=u.id")
    @Results({
            @Result(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")
    })
    public List<Order> findAll();

第二种方式:

    @Select("select * from orders o,user u where o.uid=u.id")
    @Results({
            @Result(column="oid",property="id"),
            @Result(column="ordertime",property="ordertime"),
            @Result(column="total",property="total"),
            @Result(
                    property="user",//要封装的属性名称
                    column="uid",//根据那个字段去查询user表的数据
                    javaType = User.class, //要封装的实体类型
                    // select 属性   代表查询那个接口的方法去获得数据
                    one = @One(select = "com.lxz.mapper.UserMapper.findById")//嵌套查询  查询中又含一个查询 
            )
    })
    public List<Order> findAll();

一对多

一个用户多个订单,即上述user表里面一条数据对应order表中多条数据。

    private int id;
    private String username;
    private String password;
    private Date birthday;

    // 描述的是当前用户具有的订单
    private List<Order> orderList;
 @Select("select * from orders where uid=#{uid}")
 public List<Order> findByUid(int uid);

    @Select("select * from user")
    @Results({
            @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.lxz.mapper.OrderMapper.findByUid")  //嵌套查询
            )
})
    public List<User> findUserAndOrderAll();

多对多

一个用户有多个角色,一个角色可以被多个用户所用。

查询需求:查询用户的时候同时查出该用户的多种角色。

user表:
在这里插入图片描述

sys_user_role表:
在这里插入图片描述

sys_role表:
在这里插入图片描述

SELECT * FROM USER" 
SELECT * FROM sys_user_role ur,sys_role r WHERE ur.roleId=r.id AND ur.userId=上一句sql结果的id的值
    private int id;
    private String username;
    private String password;
    private Date birthday;

    //当前用户具备哪些角色
    private List<Role> roleList;
   @Select("SELECT * FROM sys_user_role ur,sys_role r WHERE ur.roleId=r.id AND ur.userId=#{uid}")
    public List<Role> findByUid(int uid);

    @Select("SELECT * FROM USER")
    @Results({
            @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.lxz.mapper.RoleMapper.findByUid")
            )
    })
    public List<User> findUserAndRoleAll();

总结:利用三天时间复习了之前学过的MyBatis
!还是孔子那句话,温故而知新。所以兄弟们,冲冲冲!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹤林村菠萝皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值