问题:如果原本是MySQL类型的数据库,现在迁移数据库(假设test)到达梦数据库,是否依旧保持表名列名小写。
一、小写
1、实体类示例
如果数据库test下有表为user:
java
@Data
@TableName("\"test\".\"user\"")
public class User {
@TableId(value = "\"id\"", type = IdType.AUTO)
private Integer id;
@TableField("\"username\"")
private String username;
@TableField("\"password\"")
private String password;
@TableField("\"phone\"")
private String phone;
@TableField("\"email\"")
private String email;
@TableField(exist = false)
private Boolean isManager;
@TableField("\"state\"")
@TableLogic(value = "A",delval = "X")
private String state;
@TableField("\"create_time\"")
private Timestamp createTime;
@TableField("\"state_time\"")
private Timestamp stateTime;
}
如果不加@TableName/@TableField会报错找不到表/列名。
2、MyBatis示例
如果上述实体类不加注释,MyBatis/MyBatis-Plus 生成的 SQL会因为达梦数据库默认规则,不加双引号自动转为大写,然而现在数据库表名/列名都是小写,所以报错。
示例1:
java
Integer result = userMapper.insert(newJwtUser);
示例2:
java
QueryWrapper<JwtUser> usernameCheckQueryWrapper = new QueryWrapper<>();
usernameCheckQueryWrapper.eq("\"username\"",jwtUser.getUsername());
JwtUser checkUserName = userMapper.selectOne(usernameCheckQueryWrapper);
3、Mapper示例
假设数据库test下有表 authority:
java
@Select({
"SELECT \"id\", \"name\", \"method\", \"path\", \"group_id\", \"is_anonymous\"",
"FROM \"test\".\"authority\"",
"WHERE \"is_anonymous\" = 1 AND \"state\" = 'A'"
})
@Results(id="AuthorityResultMap", value={
@Result(column="id", property="id", jdbcType= JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="method", property="method", jdbcType=JdbcType.VARCHAR),
@Result(column="path", property="path", jdbcType=JdbcType.VARCHAR),
@Result(column="group_id", property="groupId", jdbcType=JdbcType.INTEGER),
@Result(column="is_anonymous", property="isAnonymous", jdbcType=JdbcType.BOOLEAN)
})
List<JwtAuthority> listAnonymous();
4、Xml示例(重点!!!)
假设数据库test下有表exam:
xml
<select id="filter" resultType="com.xj.wargame.entity.manage.Scenario">
<!-- 1. 列名加双引号转义 -->
SELECT "id", "name", "file", "state", "create_time", "state_time"
<!-- 2. 表名加模式+双引号转义,和实体类@TableName一致 -->
FROM "test"."exam"
<!-- 3. WHERE条件中的列名也加双引号 -->
WHERE "state" = 'A'
<if test="name != null and name != ''">
AND "name" like concat('%',#{name},'%')
</if>
</select>
因为XML 转义的双引号是",这样写不利于开发与维护,所以重点因为这里所以放弃迁移后的数据库表名/列名小写,改为大写。
二、大写
1、实体类示例
如果数据库test下有表为user:
java
@Data
@TableName("TEST.USER")
public class User{
@TableId(value = "ID", type = IdType.AUTO)
private Integer id;
@TableField("USERNAME")
private String username;
@TableField("PASSWORD")
private String password;
@TableField("PHONE")
private String phone;
@TableField("EMAIL")
private String email;
@TableField(exist = false)
private Boolean isManager;
@TableField("STATE")
@TableLogic(value = "A",delval = "X")
private String state;
@TableField("CREATE_TIME")
private Timestamp createTime;
@TableField("STATE_TIME")
private Timestamp stateTime;
2、MyBatis示例
如果上述实体类不加注释,MyBatis/MyBatis-Plus 生成的 SQL会因为达梦数据库默认规则,不加双引号自动转为大写,然而现在数据库表名/列名都是大写,所以不会报错。
示例1:
java
Integer result = userMapper.insert(newJwtUser);
示例2:
java
QueryWrapper<JwtUser> usernameCheckQueryWrapper = new QueryWrapper<>();
usernameCheckQueryWrapper.eq("username",jwtUser.getUsername());
JwtUser checkUserName = userMapper.selectOne(usernameCheckQueryWrapper);
这里不需要特意再加双引号大写,因为达梦数据库会自动转为大写去匹配。
3、Mapper示例
假设数据库test下有表 authority:
java
@Select({
// 修改1:所有列名改为大写
"SELECT ID, NAME, METHOD, PATH, GROUP_ID, IS_ANONYMOUS",
// 修改2:表名(含模式)改为大写
"FROM TEST.AUTHORITY",
// 修改3:条件列名改为大写,布尔值保留1
"WHERE IS_ANONYMOUS = 1 AND STATE = 'A'"
})
@Results(id="AuthorityResultMap", value={
// 注意:column属性改为大写(与SQL查询列名一致),property属性保持小驼峰(与实体类字段一致)
@Result(column="ID", property="id", jdbcType= JdbcType.INTEGER, id=true),
@Result(column="NAME", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="METHOD", property="method", jdbcType=JdbcType.VARCHAR),
@Result(column="PATH", property="path", jdbcType=JdbcType.VARCHAR),
@Result(column="GROUP_ID", property="groupId", jdbcType=JdbcType.INTEGER),
@Result(column="IS_ANONYMOUS", property="isAnonymous", jdbcType=JdbcType.BOOLEAN)
})
List<JwtAuthority> listAnonymous();
4、Xml示例
假设数据库test下有表exam:
xml
<select id="filter" resultType="com.xj.wargame.entity.manage.Scenario">
<!-- 修改1:所有列名改为大写,下划线列名保持大写分隔 -->
SELECT ID, NAME, FILE, STATE, CREATE_TIME, STATE_TIME
<!-- 修改2:表名改为大写(含模式),与实体类@TableName一致 -->
FROM WARGAME_SJZ.W_SCENARIO
<!-- 修改3:条件列名改为大写 -->
WHERE STATE = 'A'
<if test="name != null and name != ''">
<!-- 修改4:动态条件列名改为大写,保留模糊查询逻辑 -->
AND NAME like concat('%',#{name},'%')
</if>
</select>
相较而言,大写还是比小写方便的。