欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

beetlSQL实践 (二) 命名转换及表和列名映射

程序员文章站 2022-05-31 23:08:16
...

项目启动成功,接下来我们通过存储的功能来实践一番。
上篇已经讲述过beetlSQL基本使用,本篇则不再过多的介绍。
刚开始创建的表,语句如下:

CREATE TABLE `exam` (
  `exam_d` int(10) NOT NULL AUTO_INCREMENT,
  `exam_ame` varchar(60) NOT NULL DEFAULT '',
  `subject_d` int(20) NOT NULL DEFAULT '0',
  `score` int(10) DEFAULT '0',
  `evaluation_evel` int(3) DEFAULT '0',
  PRIMARY KEY (`exam_d`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4;

examID为自增主键,字段都是下划线命名;其对应的实体是驼峰式命名.

public class Exam implements Serializable {

    private Integer examId;

    private String examName;

    private Integer subjectId;

    private Integer score;

    private Integer evaluationLevel;

    public Integer getExamId() {
        return examId;
    }

    public void setExamId(Integer examId) {
        this.examId = examId;
    }

    public String getExamName() {
        return examName;
    }

    public void setExamName(String examName) {
        this.examName = examName;
    }

    public Integer getSubjectId() {
        return subjectId;
    }

    public void setSubjectId(Integer subjectId) {
        this.subjectId = subjectId;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    public Integer getEvaluationLevel() {
        return evaluationLevel;
    }

    public void setEvaluationLevel(Integer evaluationLevel) {
        this.evaluationLevel = evaluationLevel;
    }

    @Override
    public String toString() {
        return "Exam{"
                + "examId=" + examId +
                "examName=" + examName +
                "subjectId=" + subjectId +
                "score=" + score +
                "evaluationLevel=" + evaluationLevel +
                '}';
    }
}

在这种对应情况下,当程序执行成功,启动功能的时候,报错了。
beetlSQL实践 (二) 命名转换及表和列名映射
为何会报空指针错误呢,表字段一共就5个,两个可以为空,剩余的三个明明已经赋值了,真是为何?
这是因为在配置SqlManagerFactoryBean工厂类配置的时候,没有明确beetlSQL的映射类。在报错的情况下,我的SqlManagerFactoryBean是这样配置的:

 @Bean(name = "examSqlManager")
    @Primary
    public SqlManagerFactoryBean getSqlManagerFactoryBean(@Qualifier("examDB")DataSource master){
        SqlManagerFactoryBean factoryBean=new SqlManagerFactoryBean();
        BeetlSqlDataSource source=new BeetlSqlDataSource();
        source.setMasterSource(master);
        factoryBean.setCs(source);
        factoryBean.setDbStyle(new MySqlStyle());
        //sql文件路径
        factoryBean.setSqlLoader(new ClasspathLoader("/sql"));
        return factoryBean;
    }

缺少了factoryBean.setNc()映射的处理。
Beetlsql 默认提供了三种列明和属性名的映射类

映射 说明
DefaultNameConversion 数据库名和java属性名保持一致,如数据库表User,对应Java类也是User,数据库列是sysytemId,则java属性也是systemId,反之亦然
UnderlinedNameConversion 将数据库下划线去掉,首字母大写,如数据库是SYS_USER(oralce数据库的表和属性总是大写的), 则会改成SysUser
JPA2NameConversion 支持JPA方式的映射,适合不能用确定的映射关系

一般情况下推荐使用UnderlinedNameConversion,实体为驼峰命名,表字段为下划线命名。

@Bean(name = "examSqlManager")
    @Primary
    public SqlManagerFactoryBean getSqlManagerFactoryBean(@Qualifier("examDB")DataSource master){
        SqlManagerFactoryBean factoryBean=new SqlManagerFactoryBean();
        BeetlSqlDataSource source=new BeetlSqlDataSource();
        source.setMasterSource(master);
        factoryBean.setCs(source);
        factoryBean.setDbStyle(new MySqlStyle());
        //开启驼峰
        factoryBean.setNc(new UnderlinedNameConversion());
        //sql文件路径
        factoryBean.setSqlLoader(new ClasspathLoader("/sql"));
        return factoryBean;
    }

假设设置了驼峰配置,而数据库却也弄得驼峰式,这种情况下,自己通过beetlSQL实现插入方法则不会有任何影响,但是这种情况下,假设你要调用beetlSQL API的insert功能,不会报错,但是字段值不会插入成功,只会通过主键增添一条空记录而已。
beetlSQL实践 (二) 命名转换及表和列名映射
当然,使用哪种映射处理,都是凭借自己习惯或者公司规定的规范来的。除了这几种以外,还可以通过JPA标签来帮助解析实体类到数据库的转换,具体可以去参考官网,beetlSQL官网

相关标签: beetlSQL 命名