支持的 JDBC 类型,这是Mybatis描述的JDBC类型

为了以后可能的使用场景,MyBatis 通过内置的 jdbcType 枚举类型支持下面的 JDBC 类型。

BITFLOATCHARTIMESTAMPOTHERUNDEFINED
TINYINTREALVARCHARBINARYBLOBNVARCHAR
SMALLINTDOUBLELONGVARCHARVARBINARYCLOBNCHAR
INTEGERNUMERICDATELONGVARBINARYBOOLEANNCLOB
BIGINTDECIMALTIMENULLCURSORARRAY

高级进阶 必然有 表与表之间的关系

  • 一对一 关系 :表与表 共用一个主键,或者两张表各有一个字段对应
  • 一对多 关系 :
  • 多对多 关系 :有中间表 维护 其他表之间的主键关系

一对一查询

表关系:用户表 与 订单表 模型

一个订单 只属于一个用户:即 我想查询一个订单,顺便获取用户数据

引入 一个 新标签 resultMap、id、result 、association标签

2个Pojo

@Data
public class Order {
    private Long id;
    private String orderName;

    private Double double;
    private User userAAA;
}
@Data
public class User {
    private Long id;
    private String username;
    private String password;
    private String birthday;
}
<!--
<resultMap/> 标签
> id 自己随便定义,目的是为了其他sql引用
> type Java对象,建议写全限定类名。如果配置别名,则可以使用小驼峰的类名,不需要包名,不推荐
-->

<!--
<resultMap /> 下的标签
> <id>:主键字段映射的标签
> <result> :非主键的字段映射的标签
-->

<!--
results下标签的属性
> column:sql查询出来的字段名
> property:Java对象的属性名
-->


<!-- 第一步 通过订单查询用户ID -->
<select id = "byOrderFindUser" resultMap = "orderMap1">
    select * ,u.id from order o,user u where o.id = u.id
</select>

<!-- 
第二步 创建一个resultMap,映射数据库结果到Java对象,这里就体验了一对一
因为User对象无法直接封装其username,所以直接指定全限定类名.属性
-->
<resultMap id = "orderMap1" type = "com.package.projectName.pojo.Order">
  <id column="`" property="id"></id>
  <result column = "total" property = "total"></result>
  <result column = "username" property = "user.username"></result>
  <result column = "password" property = "user.password"></result>
</resultMap>

<!-- 
第三步 association 标签体验一对一
-->
<resultMap id = "orderMap2" type = "order">
  <id column="oid" property="id"></id>
  <result column = "total" property = "total"></result>
  <!--  
     property :当前实体中的属性名,这里实体是order,Order对象的属性名是userAAA
     javaType :当前实体中的属性类型 建议使用全限定类名
   -->
  <association property= "userAAA" javaType = "com.package.projectName.pojo.User">
    <id column = "uid" property = "id"></id>
    <result column = "username" property = "user.username"></result>
    <result column = "password" property = "password"></result>
  </association>

</resultMap>

一对多查询

表关系:用户表 与 订单表 模型

需求场景:我想通过一个 用户 查询他的所有订单

引入 新标签 collection 用于集合

@Data
public class Order {
    private Long id;
    private String orderName;

    private Double double;
    private User userAAA;
}
@Data
public class User {
    private Long id;
    private String username;
    private String password;
    private String birthday;
    // 添加用户的所有订单
    private List<Order> orderSSS;
}
<!--
第一步,通过用户查询所有订单
-->
<select id = "byUserFindOrders" resultMap = "userDiyMap1">
    select * ,o.id , u.id from user o,user u where o.id = u.id
</select>

<resultMap id = "userDiyMap1" type = "com.package.projectName.pojo.User">
  <id column="uid" property="id"></id>
  <result column = "username" property = "user.username"></result>
  <result column = "password" property = "user.password"></result>
  <!--
      <collection> 标签属性 property:集合对象名称  ofType:集合中的数据类型
  -->
  <collection property="orderSSS" ofType="Order">
       <id column="oid" property="id"></id>
       <result column = "total" property = "total"></result>
  </collection>
</resultMap>

多对多查询

表关系:用户表 与 角色表 与 用户和角色表的内容 模型

@Data
public class Role {
    private Integer id;
    private String roleName;
    private String roleDesc;
}
@Data
public class User {
    private Long id;
    private String username;
    private String password;
    private String birthday;
    // 添加用户的所有订单
    private List<Order> orderSSS;
    private List<Role> roleSSS;
}
<!--
第一步,通过用户查询所有订单、查询所有的角色
-->
<select id = "byUserFindOrdersAndRoles" resultMap = "userRole">
    select * from 
        user as u,
        sys_user_role as ur,
        sys_role as r,
        where u.id = ur.userId and ur.userId = r.id
</select>
其结果有:用户ID,用户名称,用户密码,用户生日,角色Id,角色名称,角色描述

<!--
  第二步,学会一对一、一对多,多对多就是多表查询,而已,然后多处理封装数据而已
-->
<resultMap id = "userDiyMap1" type = "com.package.projectName.pojo.User">
  <id column="uid" property="id"></id>
  <result column = "username" property = "user.username"></result>
  <result column = "password" property = "user.password"></result>
  <!--
      <collection> 标签属性 property:集合对象名称  ofType:集合中的数据类型
  -->
  <collection property="orderSSS" ofType="Order">
       <id column="oid" property="id"></id>
       <result column = "total" property = "total"></result>
  </collection>
</resultMap>

发表评论

您的电子邮箱地址不会被公开。