最近开始上手参与一个已经搭建起来的项目。
新增需求,需要从下至上添加代码。即model,dao,xml,service,serviceimpl,controller层都需要添加一个新的板块。
此次想要记录的主要集中在实体类和dao层与xml文件的调用过程中发现的一些问题以及解决办法。
实体类的属性命名问题
由于数据库中的属性都是大写的,中间还带有_,刚开始写的时候直接把数据库中的属性名照着抄了下来,然后写get、set方法,但是发现有报错。问题在于实体类中的属性应该使用Java规范的书写方法,即驼峰写法,属性的首字母不能大写。java实体类的属性名首字母不能大写,不然el表达式无法取值。
具体的问题
参考链接:https://www.cnblogs.com/superman-21/p/14077356.html
这个算是个前辈的经验,直接告诉我了,避开了这个坑。
DAO层调用xml文件的问题
还有一个问题是dao层与xml文件的调用问题。使用xml写SQL、写动态SQL的相关问题可以参考其他文章。
众所周知,dao层是用来访问数据库的,而访问数据库就需要使用SQL。最普通的高级SQL的书写在实际工程中似乎并不常见,取而代之的是使用注解或者xml的形式来书写SQL。此次工程主要使用xml书写动态SQL的形式,来实现对数据库的访问。
因为实体类的属性由于上面所阐述的原因,实体类的私有属性与实际数据库中的列名并不完全相同,导致xml中对实体类进行的SQL操作无法匹配到数据库的对应列,最终SQL报错无法执行。
(神通数据库中表的属性)
为了解决这个问题,需要使用在xml中手动定义resultMap。
在 mybatis 中, resultMap 节点定义了结果集和结果对象(JavaBean)之间的映射规则
参考链接:resultMap的用法以及关联结果集映射_正在努力的陈序员的博客-CSDN博客_resultmap
此处举了两个例子,把数据库前两个列名与实体类的两个属性对应起来,在执行SQL的时候就可以让其知道数据库中的列名与实体类的属性名的映射关系,进而顺利执行SQL语句。
这个问题还有另一种解决方法,不使用resultMap。在写的SQL语句以select column as properties形式出现。Column就写数据库中的真实列名,as后面跟实体类所对应的属性名。
例:
<select resultType="SysDbInfo" id="findById">
select
DB_NAME as dbName
from sys_dbinfo where id=#{id}
</select>
很显然,这种方法不太适合较大的工程。每一个列后面都需要跟上as+属性,编写时比较麻烦,所以大部分工程使用的是第一种方法,即手动定义resultMap,编写属性名与列名的映射关系。