达梦数据库笔记之使用教程以及不推荐迁移选择小写

问题:如果原本是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 &quot;id&quot;, &quot;name&quot;, &quot;file&quot;, &quot;state&quot;, &quot;create_time&quot;, &quot;state_time&quot;
    <!-- 2. 表名加模式+双引号转义,和实体类@TableName一致 -->
    FROM &quot;test&quot;.&quot;exam&quot;
    <!-- 3. WHERE条件中的列名也加双引号 -->
    WHERE &quot;state&quot; = 'A'
    <if test="name != null and name != ''">
        AND &quot;name&quot; like concat('%',#{name},'%')
    </if>
</select>

因为XML 转义的双引号是&quot,这样写不利于开发与维护,所以重点因为这里所以放弃迁移后的数据库表名/列名小写,改为大写。

二、大写

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>

相较而言,大写还是比小写方便的。

相关推荐
andyweike5 小时前
php笔记
开发语言·笔记·php
xian_wwq6 小时前
【学习笔记】等保合规安全基线核查实战
笔记·学习
M78佐菲8 小时前
ARM学习笔记(11)
linux·arm开发·笔记·嵌入式硬件·学习
M78佐菲8 小时前
ARM学习笔记(10)
linux·arm开发·笔记·嵌入式硬件·学习
李游Leo8 小时前
HarmonyOS 7 + ArkUI + RelationalStore 学习笔记:本地数据分层存储与状态持久化架构实践【鸿蒙心迹】
笔记·学习·架构·harmonyos
我命由我123458 小时前
经纪人的职业定义
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
摇滚侠9 小时前
《On Java 中文版 基础卷》阅读笔记 对象无处不在 03
java·笔记·python
知产xiao_xin10 小时前
地理标志权
经验分享·笔记·知识产权
摆烂z12 小时前
多模态大模型微调笔记
笔记
胡二拉二胡12 小时前
抗遗忘单词表深度评测:FSRS 算法与学练考闭环实测
经验分享·笔记