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 +
'}';
}
}
在这种对应情况下,当程序执行成功,启动功能的时候,报错了。
为何会报空指针错误呢,表字段一共就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官网。