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

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

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

相关推荐
策案案案33 分钟前
YOLO: 将AI Agents嵌入到IntelliJ IDEA
java·大数据·人工智能·笔记·yolo·microsoft·intellij-idea
啵啵啵鱼3 小时前
DS-顺序表
java·数据结构·笔记·后端·链表·obsidian
xian_wwq4 小时前
【学习笔记】深度认知系列-第13讲AI Agent时代到来——从“回答问题”到“执行任务”
人工智能·笔记·学习
程序猿炎义4 小时前
【llm-algo-leetcode学习笔记】量化优化手段
笔记·学习
xian_wwq5 小时前
【学习笔记】深度认知系列- 第15讲 AI算力战争——GPU、光通信与太空数据中心
笔记·学习
雨田言炎5 小时前
2026/9/5 C复习笔记(一)
c语言·笔记
zhangrelay5 小时前
答疑-是否软件源问题都必须更换为国内呢-
linux·笔记·学习·ubuntu·ros2
zhangrelay5 小时前
《ROS 机器人程序设计》课程教学大纲-2026- kinetic-lyrical
linux·笔记·学习·ubuntu·机器人
路弥行至6 小时前
Linux (ARM64 / Jetson) 挂载 exFAT 移动硬盘排障与离线安装指南
linux·运维·服务器·经验分享·笔记·jetson·exfat
知产xiao_xin7 小时前
《伯尔尼公约》适用的特殊情形
经验分享·笔记·知识产权