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

问题:如果原本是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>

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

相关推荐
今儿敲了吗1 小时前
46| FBI树
数据结构·c++·笔记·学习·算法
苦瓜小生2 小时前
【黑马点评学习笔记 | 实战篇 】| 6-Redis消息队列
redis·笔记·后端
sheeta19983 小时前
LeetCode 每日一题笔记 日期:2025.03.19 题目:3212.统计X和Y频数相等的子矩阵数量
笔记·leetcode·矩阵
巧克力味的桃子4 小时前
国名排序题笔记(字符串函数 + fgets 详解)
笔记
四谎真好看4 小时前
Redis学习笔记(实战篇3)
redis·笔记·学习·学习笔记
bennybi5 小时前
Openclaw 实践笔记
笔记·ai·openclaw
AI视觉网奇5 小时前
aigc 生成几何图 整理笔记
笔记·aigc
今儿敲了吗5 小时前
python基础学习笔记第五章——容器
笔记·python·学习
三水不滴5 小时前
Elasticsearch 实战系列(二):SpringBoot 集成 Elasticsearch,从 0 到 1 实现商品搜索系统
经验分享·spring boot·笔记·后端·elasticsearch·搜索引擎
Ynchen. ~5 小时前
快速复习笔记(随笔)
笔记