前置条件

在开发之前,请确保

介绍

demo需涉及到infra层的 Mapper 类以及与数据库对应的DTO类。

编写与数据库表对应的DTO类

  • DTO 类用来封装用户请求的数据信息,这里指的用户可以是另一个计算机系统,不一定是使用用户界面的人。
  • infra层的DTO类同时也是与数据库表一一对应的实体类,创建在项目模块的 xxx.infra.dto 包下。
  • 名称=表具体名称+DTO,表名中 _ 替换为驼峰命名法,首字母大写。如:TaskDTO 对应表为todo_task

指定对应表

  • @Table(name = "table_name") 指定 DTO 对应数据库中表的名称。
  • 每一个infra层的 DTO 对应数据库中的一个具体表,一般都需要继承 BaseDTO 类。

属性规范

  • 所有属性均为private属性。
  • 每一个属性需要生成对应的 gettersetter 方法。
  • 字段名称应根据驼峰命名规则从数据库列名转换过来。例如:数据库列名为 USER_NAME ,则字段名为 userName,特殊字段名称,可以在字段在添加 @Column(name = "xxx")注解,指定数据库列名。

属性的的类型与字段的 type 对应

  • 不使用基本类型,全部使用基本类型的包装类,如 Long 对应数据库中的 INTEGER,而不是使用 long
  • 数字类型主键统一采用 Long
  • 金额、数量 等精度严格浮点类型采用 BigDecimal

注意:BigDecimal 在计算、比较方面的特殊性

所有的主键字段都需要用@Id标注

  • 对于自增长、序列(SEQUENCE)类型的主键,需要添加注解@GeneratedValue(strategy = GenerationType.IDENTITY)
  • 序列命名规范:表名_S。例如:表SYS_USER对应的序列为 SYS_USER_S

非数据库字段

  • 需要用@Transient标注 javax.persistence.Transient

UserDTO.java 代码

  1. package io.choerodon.todo.infra.dto;
  2. // 省略 import
  3. @Table(name = "todo_user")
  4. public class UserDTO extends BaseDTO {
  5. @Id
  6. @GeneratedValue(strategy = GenerationType.IDENTITY) //对于自增张、序列(SEQUENCE)类型的主键,需要添加该注解
  7. private Long id;
  8. private String employeeName;
  9. private String employeeNumber;
  10. private String email;
  11. // 省略get和set方法
  12. }

TaskDTO.java 代码

  1. package io.choerodon.todo.infra.dto;
  2. // 省略 import
  3. @Table(name = "todo_task")
  4. public class TaskDTO extends BaseDTO {
  5. @Id
  6. @GeneratedValue(strategy = GenerationType.IDENTITY)
  7. private Long id;
  8. private Long employeeId;
  9. private String state;
  10. private String taskNumber;
  11. private String taskDescription;
  12. // 省略get和set方法
  13. }

编写Mapper

Mapper接口类

  • mapper 接口类即为传统意义上的 DAO,但与 interface 不同,mapper 本身就是对数据访问的具体实现,所以属于供应方的服务实现层。创建在 项目模块 的 xxx.infra.mapper 包下。
  • 每一个 mapper 接口类封装了对数据库表的操作,每一个 mapper 对应一个infra层的 DTO 类,所以命名为infra层的 DTO 类名尾缀替换为 Mapper 。如:TaskMapper 对应DTOTaskDTO 类。
  • 基础的 CRUD 操作不需要再次实现,通过继承 Mapper<T> 类实现。其中 T 为 对应的infra层的 DTO 的泛型。
  • 复杂的数据库操作需要定义具体的接口方法。

Mapper.xml

  • Mapperxml文件 是数据库的的具体映射,与 Mapper 接口同级,创建在 项目模块 resources 目录的 xxx.mapper 包下。
  • Mapperxml文件,与 Mapper 接口对应。所以命名与 Mapper 接口类相同。
  • Mapperxml文件非必须,由于继承Mapper类后基本的 CRUD 不需要进行配置,所以只有CRUD操作时不需要创建对应的 xml 文件。
  • 对于自定义的数据库方法,需要创建对应的 mapper.xml 文件。
  • Mapperxml 中的操作 id 对应 Mapper 接口类的方法名。

UserMapper.java 代码

  1. package io.choerodon.todo.infra.mapper;
  2. import io.choerodon.mybatis.common.Mapper;
  3. import io.choerodon.todo.infra.dto.UserDTO;
  4. public interface UserMapper extends Mapper<UserDTO> {
  5. }

TaskMapper.java 代码

  1. package io.choerodon.todo.infra.mapper;
  2. // 省略 import
  3. public interface TaskMapper extends Mapper<TaskDTO> {
  4. TaskDTO queryByTaskNumber(@Param("taskNumber") String taskNumber);
  5. }

TaskMapper.xml 文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="io.choerodon.todo.infra.mapper.TaskMapper">
  4. <select id="queryByTaskNumber" resultType="io.choerodon.todo.infra.dto.TaskDTO">
  5. SELECT
  6. *
  7. FROM
  8. todo_task
  9. WHERE
  10. task_number=#{taskNumber} limit 1
  11. </select>
  12. </mapper>