-
-
-
-
-
-
-
-
-
-
-
Components
-
General
-
Layout
-
Navigation
-
Data Entry
-
Data Display
-
Feedback
-
Other
-
-
-
-
前置条件
在开发之前,请确保
介绍
此demo
需涉及到infra
层的 Mapper
类以及与数据库对应的DTO
类。
编写与数据库表对应的DTO
类
DTO
类用来封装用户请求的数据信息,这里指的用户可以是另一个计算机系统,不一定是使用用户界面的人。infra
层的DTO
类同时也是与数据库表一一对应的实体类,创建在项目模块的xxx.infra.dto
包下。- 名称=
表具体名称+DTO
,表名中_
替换为驼峰命名法,首字母大写。如:TaskDTO
对应表为todo_task
。
指定对应表
@Table(name = "table_name")
指定 DTO 对应数据库中表的名称。- 每一个infra层的
DTO
对应数据库中的一个具体表,一般都需要继承BaseDTO
类。
属性规范
- 所有属性均为
private
属性。 - 每一个属性需要生成对应的
getter
和setter
方法。 - 字段名称应根据驼峰命名规则从数据库列名转换过来。例如:数据库列名为
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
代码
package io.choerodon.todo.infra.dto;
// 省略 import
@Table(name = "todo_user")
public class UserDTO extends BaseDTO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //对于自增张、序列(SEQUENCE)类型的主键,需要添加该注解
private Long id;
private String employeeName;
private String employeeNumber;
private String email;
// 省略get和set方法
}
TaskDTO.java
代码
package io.choerodon.todo.infra.dto;
// 省略 import
@Table(name = "todo_task")
public class TaskDTO extends BaseDTO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long employeeId;
private String state;
private String taskNumber;
private String taskDescription;
// 省略get和set方法
}
编写Mapper
Mapper
接口类
mapper
接口类即为传统意义上的DAO
,但与interface
不同,mapper
本身就是对数据访问的具体实现,所以属于供应方的服务实现层。创建在 项目模块 的xxx.infra.mapper
包下。- 每一个
mapper
接口类封装了对数据库表的操作,每一个mapper
对应一个infra层的DTO
类,所以命名为infra层的DTO
类名尾缀替换为Mapper
。如:TaskMapper
对应DTO
为TaskDTO
类。 - 基础的
CRUD
操作不需要再次实现,通过继承Mapper<T>
类实现。其中T
为 对应的infra层的DTO
的泛型。 - 复杂的数据库操作需要定义具体的接口方法。
Mapper.xml
Mapper
的xml
文件 是数据库的的具体映射,与Mapper
接口同级,创建在 项目模块resources
目录的xxx.mapper
包下。Mapper
的xml
文件,与Mapper
接口对应。所以命名与Mapper
接口类相同。Mapper
的xml
文件非必须,由于继承Mapper类后基本的CRUD
不需要进行配置,所以只有CRUD
操作时不需要创建对应的xml
文件。- 对于自定义的数据库方法,需要创建对应的
mapper.xml
文件。 Mapper
的xml
中的操作id
对应Mapper
接口类的方法名。
UserMapper.java
代码
package io.choerodon.todo.infra.mapper;
import io.choerodon.mybatis.common.Mapper;
import io.choerodon.todo.infra.dto.UserDTO;
public interface UserMapper extends Mapper<UserDTO> {
}
TaskMapper.java
代码
package io.choerodon.todo.infra.mapper;
// 省略 import
public interface TaskMapper extends Mapper<TaskDTO> {
TaskDTO queryByTaskNumber(@Param("taskNumber") String taskNumber);
}
TaskMapper.xml
文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="io.choerodon.todo.infra.mapper.TaskMapper">
<select id="queryByTaskNumber" resultType="io.choerodon.todo.infra.dto.TaskDTO">
SELECT
*
FROM
todo_task
WHERE
task_number=#{taskNumber} limit 1
</select>
</mapper>