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

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

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

相关推荐
日拱一卒的小田15 小时前
ZYNQ学习笔记3-ZYNQ的IIC控制器1
笔记·单片机·学习
不会代码的小猴17 小时前
C++新增关键字
开发语言·c++·笔记
小赵AI手记19 小时前
技术拆解(十七)具身智能:机器人动作生成为何走向Diffusion Policy?
人工智能·笔记·python·机器人
疯狂打码的少年20 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
蒸蒸yyyyzwd20 小时前
后端面经学习笔记
笔记·学习
简简单单lym20 小时前
mediasou c++分析--流分析
笔记·webrtc
糖炒栗子032621 小时前
learn-claude-code 简要记录
笔记·python
PC2005-cloud1 天前
Elasticsearch 学习笔记:集群实战(3 控制节点 + 3 数据节点部署与故障转移)
笔记·学习·elasticsearch
Wang's Blog1 天前
PostgreSQL笔记8: 基于二八法则的基础性能调优
数据库·笔记·postgresql
头茬韭菜1 天前
功能点 1:项目骨架与启动流程 —— 源码阅读笔记
运维·笔记·debian·fluss