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

问题:如果原本是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 天前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
航Hang*1 天前
第3章:Linux系统安全管理——第2节:部署代理服务
linux·运维·服务器·开发语言·笔记·系统安全
zjnlswd1 天前
tkinter学习案例--笔记代码
笔记·学习
独小乐1 天前
009.中断实践之实现按键测试|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·arm
无聊大侠hello world1 天前
Yu-AI-Agent 项目(AI 恋爱大师智能体) · 学习笔记
人工智能·笔记·学习
CheerWWW1 天前
C++学习笔记——箭头运算符、std::vector的使用、静态链接、动态链接
c++·笔记·学习
ZhiqianXia1 天前
Pytorch 学习笔记(17):decompositions.py —— 算子分解的百科全书
pytorch·笔记·学习
xian_wwq1 天前
【学习笔记】大模型如何理解图片
笔记·学习
talen_hx2961 天前
《零基础入门Spark》学习笔记 Day 13
笔记·学习·spark
Flittly1 天前
【SpringAIAlibaba新手村系列】(15)MCP Client 调用本地服务
java·笔记·spring·ai·springboot