• 前置条件
    • 介绍
    • 编写dataobject类
      • 指定对应表
      • 属性规范
      • 属性的的类型与字段的 type 对应
      • 所有的主键字段都需要用@Id标注
      • 非数据库字段
      • UserDO.java 代码
      • TaskDO.java 代码
    • Mapper
      • mapper接口类
      • mapper.xml
      • UserMapper.java 代码
      • TaskMapper.java 代码
      • UserMapper.xml 文件
      • TaskMapper.xml 文件

    前置条件

    在开发之前,请确保

    • 本地项目已经创建成功,详见 新建项目
    • 数据库创建成功,详见 初始化数据库

    介绍

    demo需涉及到infra层的 dataobject 类以及 mapper 类。

    编写dataobject类

    • DO 类不需要提供任何实现,所以属于供应方的服务接口层。创建在项目模块的 xxx.infra.dataobject 包下。
    • 每一个DO 类即为一个实体类,对应数据库中的一个具体表。
    • 名称=表具体名称+DO,表名中 _ 替换为驼峰命名法,首字母大写。如:TaskDO 对应表为todo_task

    指定对应表

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

    属性规范

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

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

    • 不使用基本类型,全部使用基本类型的包装类,如 Long 对应数据库中的 INTEGER,而不是使用 long
    • 数字类型主键统一采用 Long
    • 金额、数量 等精度严格浮点类型采用 BigDecimal
    注意:BigDecimal 在计算、比较方面的特殊性

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

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

    非数据库字段

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

    UserDO.java 代码

    1. package io.choerodon.todo.infra.dataobject;
    2. // 省略 import
    3. @ModifyAudit //在类上使用,启用审计字段支持,实体类加上该注解后,插入和更新会启动对creationDate、createdBy、lastUpdateDate、lastUpdatedBy自维护字段支持
    4. @VersionAudit //在类上使用,启用objectVersionNumber自维护支持,插入一条数据objectVersionNumber默认为1,每次update后objectVersionNumber自增1
    5. @Table(name = "todo_user")
    6. public class UserDO extends AuditDomain { //AuditDomain包含5个自维护字段,使用@ModifyAudit和@VersionAudit的实体类要继承该类
    7. @Id
    8. @GeneratedValue //对于自增张、序列(SEQUENCE)类型的主键,需要添加该注解
    9. private Long id;
    10. private String employeeName;
    11. private String employeeNumber;
    12. private String email;
    13. // 省略get和set方法
    14. }

    TaskDO.java 代码

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

    Mapper

    mapper接口类

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

    mapper.xml

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

    UserMapper.java 代码

    1. package io.choerodon.todo.infra.mapper;
    2. // 省略 import
    3. public interface UserMapper extends BaseMapper<UserDO> {
    4. }

    TaskMapper.java 代码

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

    UserMapper.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.UserMapper">
    4. </mapper>

    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.dataobject.TaskDO">
    5. SELECT * FROM TODO_TASK
    6. WHERE
    7. TASH_NUMBER=#{taskNumber} limit 1
    8. </select>
    9. </mapper>