This commit is contained in:
luming 2021-04-19 22:09:25 +08:00
parent 66995ca148
commit 4c1a99c746
29 changed files with 947 additions and 62 deletions

View File

@ -13,7 +13,7 @@ import java.sql.SQLException;
import java.util.List;
public class DDDGenerator {
public static void main(String[] args) throws FileNotFoundException, SQLException, ClassNotFoundException {
public static void main(String[] args) throws SQLException, FileNotFoundException, ClassNotFoundException {
GeneratorUtil.Generator();
// GeneratorUtil.package2Path(DatabaseUtil.getInstance().getConfig().getGenerate().packageName);
// List<String> timemail = DatabaseUtil.getInstance().getTable();

View File

@ -49,4 +49,23 @@ public class Config {
* 表前缀
*/
public String tablePrefix;
public String mapperPackage;
public String entityPackage;
public String poPackage;
public String servicePackage;
public String repositoryPackage;
public String resDtoPackage;
public String reqDtoPackage;
public String controllerpackage;
public String author;
}

View File

@ -11,6 +11,7 @@ import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 工具类
@ -21,7 +22,7 @@ public class GeneratorUtil {
// 类型映射
private final static Map<String, String> SQL_TYPE_TO_JAVA_TYPE = new HashMap<>();
// 文件后缀
private final static String SUFFIX = ".java";
private static String SUFFIX = ".java";
private final static Config CONFIG = DatabaseUtil.getInstance().getConfig().getGenerate();
@ -153,15 +154,13 @@ public class GeneratorUtil {
// System.out.println("<<<<< table" + t + " >>>>>");
try {
List<Column> column = instance.getColumn(t);
generatorPo(column, t);
generatorCode(column, t);
} catch (SQLException throwables) {
throwables.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
@ -180,49 +179,76 @@ public class GeneratorUtil {
}
/**
* 生成po实体
* 生成实体
*/
public static void generatorPo(List<Column> list, String table) throws IOException, TemplateException {
//如果有前缀去除
String className = table;
if (StringUtils.isNotEmpty(CONFIG.getTablePrefix())) {
className = formatTableName(table);
}
// 类名首字母大写
className = toUpperCaseFist(className);
Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
Template template = configuration.getTemplate("src/main/resources/template/po.ftl");
String path = CONFIG.getProjectName() + "-server/" + package2Path(CONFIG.getPackageName() + ".infrastructure.persistence.po/");
String filepath = path + className + SUFFIX;
// 文件夹不存在创建
if (!new File(path).exists()) {
if (new File(path).mkdirs()) {
// System.out.println("PO 文件夹创建成功");
}
if (new File(filepath).createNewFile()) {
System.out.println("=== PO:[" + className + " ] 创建成功 ===");
}
}
Map<String, Object> data = new HashMap<>();
data.put("package", CONFIG.getPackageName() + ".infrastructure.persistence.po");
data.put("table_name", table);
data.put("class_name", className);
data.put("columns", list);
File file = new File(filepath);
template.process(data, new FileWriter(file));
public static void generatorCode(List<Column> list, String tableName){
generatorByTemplate(list,tableName,"po");
generatorByTemplate(list,tableName,"entity");
generatorByTemplate(list,tableName,"resDto");
generatorByTemplate(list,tableName,"reqDto");
// generatorByTemplate(list,tableName,"repository");
// generatorByTemplate(list,tableName,"service");
generatorByTemplate(null,tableName,"mapper");
generatorByTemplate(null,tableName,"mapper.xml");
// generatorByTemplate(list,tableName,"controller");
}
// public static void generatorPo_bak(List<Column> list, String table) throws IOException, TemplateException {
// //如果有前缀去除
// String className = table;
// if (StringUtils.isNotEmpty(CONFIG.getTablePrefix())) {
// className = formatTableName(table);
// }
// // 类名首字母大写
// className = toUpperCaseFist(className);
// Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
// Template template = configuration.getTemplate("src/main/resources/template/po.ftl");
// String path = CONFIG.getProjectName() + "-server/" + package2Path(CONFIG.getPackageName() + ".infrastructure.persistence.po/");
// String filepath = path + className + SUFFIX;
// // 文件夹不存在创建
// if (!new File(path).exists()) {
// if (new File(path).mkdirs()) {
// // System.out.println("PO 文件夹创建成功");
// }
// if (new File(filepath).createNewFile()) {
// System.out.println("=== PO:[" + className + " ] 创建成功 ===");
// }
//
// }
// Map<String, Object> data = new HashMap<>();
// data.put("package", CONFIG.getPackageName() + ".infrastructure.persistence.po");
// data.put("table_name", table);
// data.put("class_name", className);
// data.put("columns", list);
// File file = new File(filepath);
// template.process(data, new FileWriter(file));
// }
/**
* @param packageName 主包名
* @param secondaryPackageName 二级包名称实体所在的包位置除去主包名后的位置
* create template file
*
* @param type 类型 po entity dto mapper service repository controller
*/
public static void generatorByTemplate(List<Column> list, String tableName, String packageName, String secondaryPackageName, String type) {
public static void generatorByTemplate(List<Column> list, String tableName, String type) {
String templatePath = String.format("src/main/resources/template/%s.ftl", toLowerCase(type));
String moduleName;
//如果有前缀去除
String secondaryPackage;
String className = tableName;
// data
Map<String, Object> data = new HashMap<>();
// add base data
data.put("mapper_package",CONFIG.getMapperPackage());
data.put("entity_package",CONFIG.getEntityPackage());
data.put("po_package",CONFIG.getPoPackage());
data.put("service_package",CONFIG.getServicePackage());
data.put("repository_package",CONFIG.getRepositoryPackage());
data.put("res_dto_package",CONFIG.getResDtoPackage());
data.put("req_dto_package",CONFIG.getReqDtoPackage());
data.put("controller_package",CONFIG.getControllerpackage());
data.put("package", CONFIG.getPackageName());
data.put("author",CONFIG.getAuthor());
// 如果有前缀去除
if (StringUtils.isNotEmpty(CONFIG.getTablePrefix())) {
className = formatTableName(tableName);
}
@ -230,24 +256,57 @@ public class GeneratorUtil {
className = toUpperCaseFist(className);
switch (type) {
case "po":
case "service":
case "mapper":
case "repository":
case "entity":
secondaryPackage = CONFIG.getPoPackage();
moduleName = "server";
break;
case "dto":
case "service":
secondaryPackage = CONFIG.getServicePackage();
moduleName = "server";
break;
case "mapper":
secondaryPackage = CONFIG.getMapperPackage();
moduleName = "server";
break;
case "mapper.xml":
//todo detal
SUFFIX = ".xml";
moduleName = "server";
break;
case "repository":
secondaryPackage = CONFIG.getRepositoryPackage();
moduleName = "server";
break;
case "entity":
secondaryPackage = CONFIG.getMapperPackage();
moduleName = "server";
break;
case "resDto":
secondaryPackage = CONFIG.getResDtoPackage();
moduleName = "dto";
break;
case "reqDto":
secondaryPackage = CONFIG.getReqDtoPackage();
moduleName = "dto";
break;
case "controller":
secondaryPackage = CONFIG.getControllerpackage();
moduleName = "facade";
break;
default:
System.out.println("=== 没有匹配的类型 ===");
return;
}
String dir = String.format("%s-%s/%s/%s/", CONFIG.getProjectName(), moduleName, package2Path(CONFIG.getPackageName()), package2Path(secondaryPackageName));
String filePath = dir + className + SUFFIX;
String dir = "";
String filePath = "";
// mapper.xml file deal
if (Objects.equals(type,"mapper.xml")){
dir = String.format("%s-%s/src/main/resources/mapper/",CONFIG.getProjectName(),moduleName);
filePath = dir + className + toUpperCaseFist(type) + SUFFIX;
} else {
dir = String.format("%s-%s/src/main/java/%s/%s/", CONFIG.getProjectName(), moduleName, package2Path(CONFIG.getPackageName()), package2Path(secondaryPackage));
filePath = dir + className + toUpperCaseFist(type) + SUFFIX;
}
File file = new File(filePath);
try {
// 文件夹不存在创建
@ -264,8 +323,6 @@ public class GeneratorUtil {
}
Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
Template template = configuration.getTemplate(templatePath);
Map<String, Object> data = new HashMap<>();
data.put("package", packageName + '.' + secondaryPackageName);
data.put("table_name", tableName);
data.put("class_name", className);
data.put("columns", list);
@ -292,6 +349,7 @@ public class GeneratorUtil {
* @return
*/
public static String toUpperCaseFist(String str) {
str = str.split("\\.")[0];
char[] chars = str.toCharArray();
chars[0] = toUpperCase(chars[0]);
return String.valueOf(chars);
@ -317,7 +375,10 @@ public class GeneratorUtil {
* @return
*/
public static String package2Path(String packageName) {
return "src/main/java/" + packageName.replace(".", "/");
if (packageName == null){
return "";
}
return packageName.replace(".", "/");
}
public static String formatTableName(String str) {

View File

@ -0,0 +1,20 @@
package com.baomidou.ant.timemail.controller;
// import org.springframework.web.bind.annotation.RequestMapping;
// import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author jobob
* @since 2021-04-19
*/
// @RestController
// @RequestMapping("/timemail/tm-user")
public class TmUserController {
}

View File

@ -0,0 +1,81 @@
package com.baomidou.ant.timemail.entity;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author jobob
* @since 2021-04-19
*/
@Data
public class TmUser{
private static final long serialVersionUID = 1L;
/**
* 账户
*/
private String account;
/**
* 用户名
*/
private String name;
/**
* 用户邮箱
*/
private String mail;
/**
* 密码
*/
private String password;
/**
* salt
*/
private String salt;
/**
* 用户状态(0正常 10禁用)
*/
private Integer status;
/**
* 逻辑删除
*/
private Boolean deleted;
/**
* 注册方式(0:邮箱注册,10:手机号注册,20:系统添加)
*/
private Integer regiterType;
/**
* 注册者IP
*/
private Long registerIp;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 手机号
*/
private String phone;
}

View File

@ -0,0 +1,16 @@
package com.baomidou.ant.timemail.mapper;
import com.baomidou.ant.timemail.entity.TmUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author jobob
* @since 2021-04-19
*/
public interface TmUserMapper extends BaseMapper<TmUser> {
}

View File

@ -0,0 +1,16 @@
package com.baomidou.ant.timemail.service;
import com.baomidou.ant.timemail.entity.TmUser;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author jobob
* @since 2021-04-19
*/
public interface ITmUserService extends IService<TmUser> {
}

View File

@ -0,0 +1,20 @@
package com.baomidou.ant.timemail.service.impl;
import com.baomidou.ant.timemail.entity.TmUser;
import com.baomidou.ant.timemail.mapper.TmUserMapper;
import com.baomidou.ant.timemail.service.ITmUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author jobob
* @since 2021-04-19
*/
@Service
public class TmUserServiceImpl extends ServiceImpl<TmUserMapper, TmUser> implements ITmUserService {
}

View File

@ -14,4 +14,22 @@ generate:
# 项目名称
projectName: timemail
# 前缀
tablePrefix: tm_
tablePrefix: tm_
# mapper
mapperPackage: infrastructure.persistence.mapper
# entity
entityPackage: domain.model
# po
poPackage: infrastructure.persistence.po
# service
servicePackage: domain.service
# repository
repositoryPackage: infrastructure.repository
# resdto
resDtoPackage: dto.response
# reqdto
reqDtoPackage: dto.request
# controller
controllerpackage: interfaces.rest
# author
author: rainerosion

View File

@ -0,0 +1,5 @@
<?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="com.baomidou.ant.timemail.mapper.UserMapper">
</mapper>

View File

@ -1,26 +1,28 @@
package ${package_name};
package ${package}.${entity_package};
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
/**
* ${table_name}
*
* @author rainerosion
* entity
* @author ${author}
* @date ${.now?datetime}
*/
@Data
@Table(name = "${table_name}")
@Entity(name = "${table_name}")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ${class_name} implements Serializable {
<#list columns as column>
/**
* ${column.columnComment}
* ${column.remarks!'Todo Add comments'}
*/
private ${column.columnType} ${column.columnName};
private ${column.javaType} ${column.columnName};
</#list>
}

View File

@ -0,0 +1,16 @@
package ${package}.${po_package};
import ${package}.${po_package}.${class_name};
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ${author}
* @since 2021-04-19
*/
public interface ${class_name}Mapper extends BaseMapper<${class_name}> {
}

View File

@ -0,0 +1,5 @@
<?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="${package}.${po_package}.${class_name}Mapper">
</mapper>

View File

@ -1,4 +1,4 @@
package ${package};
package ${package}.${po_package};
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -9,8 +9,8 @@ import java.io.Serializable;
/**
* ${table_name}
*
* @author rainerosion
* po
* @author ${author}
* @date ${.now?datetime}
*/
@Data

View File

@ -0,0 +1,28 @@
package ${package};
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* ${table_name}
* entity
* @author ${author}
* @date ${.now?datetime}
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ${class_name} implements Serializable {
<#list columns as column>
/**
* ${column.remarks!'Todo Add comments'}
*/
private ${column.javaType} ${column.columnName};
</#list>
}

View File

@ -0,0 +1,28 @@
package ${package};
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* ${table_name}
* entity
* @author ${author}
* @date ${.now?datetime}
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ${class_name} implements Serializable {
<#list columns as column>
/**
* ${column.remarks!'Todo Add comments'}
*/
private ${column.javaType} ${column.columnName};
</#list>
}

View File

View File

@ -0,0 +1,41 @@
package cn.timemail.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* tm_content
* entity
* @author rainerosion
* @date 2021-4-19 22:06:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Content implements Serializable {
/**
* 主键编号
*/
private Long id;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* Todo Add comments
*/
private Object createTime;
}

View File

@ -0,0 +1,86 @@
package cn.timemail.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* tm_user
* entity
* @author rainerosion
* @date 2021-4-19 22:06:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {
/**
* 主键ID
*/
private Long id;
/**
* 账户
*/
private String account;
/**
* 用户名
*/
private String name;
/**
* 用户邮箱
*/
private String mail;
/**
* 密码
*/
private String password;
/**
* salt
*/
private String salt;
/**
* 用户状态(0正常 10禁用)
*/
private Short status;
/**
* 逻辑删除
*/
private Boolean deleted;
/**
* 注册方式(0:邮箱注册,10:手机号注册,20:系统添加)
*/
private Short regiterType;
/**
* 注册者IP
*/
private Long registerIp;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 手机号
*/
private Object phone;
}

View File

@ -0,0 +1,41 @@
package cn.timemail.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* tm_content
* entity
* @author rainerosion
* @date 2021-4-19 22:06:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Content implements Serializable {
/**
* 主键编号
*/
private Long id;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* Todo Add comments
*/
private Object createTime;
}

View File

@ -0,0 +1,86 @@
package cn.timemail.email;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* tm_user
* entity
* @author rainerosion
* @date 2021-4-19 22:06:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {
/**
* 主键ID
*/
private Long id;
/**
* 账户
*/
private String account;
/**
* 用户名
*/
private String name;
/**
* 用户邮箱
*/
private String mail;
/**
* 密码
*/
private String password;
/**
* salt
*/
private String salt;
/**
* 用户状态(0正常 10禁用)
*/
private Short status;
/**
* 逻辑删除
*/
private Boolean deleted;
/**
* 注册方式(0:邮箱注册,10:手机号注册,20:系统添加)
*/
private Short regiterType;
/**
* 注册者IP
*/
private Long registerIp;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 手机号
*/
private Object phone;
}

View File

@ -0,0 +1,41 @@
package cn.timemail.email.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* tm_content
* entity
* @author rainerosion
* @date 2021-4-19 22:06:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Content implements Serializable {
/**
* 主键编号
*/
private Long id;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* Todo Add comments
*/
private Object createTime;
}

View File

@ -0,0 +1,16 @@
package cn.timemail.email.infrastructure.persistence.po;
import cn.timemail.email.infrastructure.persistence.po.Content;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author rainerosion
* @since 2021-04-19
*/
public interface ContentMapper extends BaseMapper<Content> {
}

View File

@ -0,0 +1,86 @@
package cn.timemail.email.domain.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* tm_user
* entity
* @author rainerosion
* @date 2021-4-19 22:06:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {
/**
* 主键ID
*/
private Long id;
/**
* 账户
*/
private String account;
/**
* 用户名
*/
private String name;
/**
* 用户邮箱
*/
private String mail;
/**
* 密码
*/
private String password;
/**
* salt
*/
private String salt;
/**
* 用户状态(0正常 10禁用)
*/
private Short status;
/**
* 逻辑删除
*/
private Boolean deleted;
/**
* 注册方式(0:邮箱注册,10:手机号注册,20:系统添加)
*/
private Short regiterType;
/**
* 注册者IP
*/
private Long registerIp;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 手机号
*/
private Object phone;
}

View File

@ -0,0 +1,16 @@
package cn.timemail.email.infrastructure.persistence.po;
import cn.timemail.email.infrastructure.persistence.po.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author rainerosion
* @since 2021-04-19
*/
public interface UserMapper extends BaseMapper<User> {
}

View File

@ -0,0 +1,41 @@
package cn.timemail.email.infrastructure.persistence.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* tm_content
* po
* @author rainerosion
* @date 2021-4-19 22:06:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Content implements Serializable {
/**
* 主键编号
*/
private Long id;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* Todo Add comments
*/
private Object createTime;
}

View File

@ -0,0 +1,86 @@
package cn.timemail.email.infrastructure.persistence.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* tm_user
* po
* @author rainerosion
* @date 2021-4-19 22:06:49
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {
/**
* 主键ID
*/
private Long id;
/**
* 账户
*/
private String account;
/**
* 用户名
*/
private String name;
/**
* 用户邮箱
*/
private String mail;
/**
* 密码
*/
private String password;
/**
* salt
*/
private String salt;
/**
* 用户状态(0正常 10禁用)
*/
private Short status;
/**
* 逻辑删除
*/
private Boolean deleted;
/**
* 注册方式(0:邮箱注册,10:手机号注册,20:系统添加)
*/
private Short regiterType;
/**
* 注册者IP
*/
private Long registerIp;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 手机号
*/
private Object phone;
}

View File

@ -0,0 +1,5 @@
<?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="cn.timemail.email.infrastructure.persistence.po.ContentMapper">
</mapper>

View File

@ -0,0 +1,5 @@
<?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="cn.timemail.email.infrastructure.persistence.po.UserMapper">
</mapper>