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

项目启动成功,接下来我们通过存储的功能来实践一番。
上篇已经讲述过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 +
                '}';
    }
}

在这种对应情况下,当程序执行成功,启动功能的时候,报错了。
nullException
为何会报空指针错误呢,表字段一共就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功能,不会报错,但是字段值不会插入成功,只会通过主键增添一条空记录而已。
存储
当然,使用哪种映射处理,都是凭借自己习惯或者公司规定的规范来的。除了这几种以外,还可以通过JPA标签来帮助解析实体类到数据库的转换,具体可以去参考官网,beetlSQL官网

posted on 2018-05-25 11:47  huohuoL  阅读(439)  评论(0编辑  收藏  举报

导航