记录一下从 hibernate 改成 mybatis 遇到的一些问题
小问题一
运行的时候忽然发现的报错:
查看过几遍之后才发现起因:之前的时候不小心在前面减少了一个斜杠
因为编译器不会对 sql 语句进行查看,所以运行后盾的时候并没有报错。所以过后没发现。
而过几天之后,当运行到这条 sql 语句的时候,后盾才报了错。
所以,咱们写 sql 语句的时候要小心。
以防咱们写的不对,还能够进入 mysql 执行一下这条语句看看后果。
二
发现问题
背景:分页的时候发现这三列数据为空
效果图:
排查问题:
外部编号这一列的问题很快就排查了进去:
后盾与数据库字段名不统一
数据库:
后盾实体:
所以在咱们执行上面这条语句时,在进行实体映射的时候对应不上,所以为 null
<select id="findAll" resultType="equipmentManagementSystem.entity.Equipment">
select * from equipment
</select>
以往的解决办法
我想起了以前 前后台字段不对应时 的解决办法:
@JsonProperty("internal_number")
private String internalNumber;
然而这个正文并没有用。
因为 这个注解是 json 序列化时,序列化为另一个名称。前后台就是通过 json 传递数据信息。
而目前状况是后盾与数据库的交互,ORM 把数据库映射成对象, 用不到 Json。
所以此时咱们须要用到 myBatis 的另一个标签 resultMap。
resultMap
resultMap 属于 mybatis 返回操作后果的一个标签,能够用来映射 select 查问进去后果的汇合。
次要作用是 将实体类中的字段与数据库表中的字段进行关联映射。
resultMap 属性:
属性 | 形容 |
---|---|
id | 以后命名空间中的一个惟一标识,用于标识一个后果映射。 |
type | 类的齐全限定名 |
extends | 能够继承其余 resultMap 的一些写好的属性 |
result 属性:
属性 | 形容 |
---|---|
id | 一个 ID 后果;标记出作为 ID 的后果能够帮忙进步整体性能 |
result | 注入到字段或 JavaBean 属性的一般后果 |
association | 一个简单类型的关联;许多后果将包装成这种类型 |
collection | 一个简单类型的汇合 |
例子:
<mapper namespace="equipmentManagementSystem.Mybatis.EquipmentMapper">
<!--type 指向 javabean 类,id 可自定义 -->
<resultMap id="equipmentMap" type="equipmentManagementSystem.entity.Equipment">
<id column="id" property="id"></id>
<!-- property 对应实体类的属性名称,column 为数据库字段名 -->
<result column="name" property="name"/>
<result column="model" property="model"/>
<result column="place" property="place"/>
<result column="states" property="states"/>
<result column="sale_time" property="saleTime"/>
<result column="internal_number" property="internalNumber"/>
</resultMap>
<select id="findAll" resultMap="equipmentMap">
select * from equipment
</select>
</mapper>
这个时候,咱们就能够在 column 属性写上 实体名, 在 property 属性写上数据库名。
最初就映射胜利。在列表中能够看到这列。
一对一,一对多
剩下两列还为空。起因是:剩下两个属性都是对象
这时候就须要用到下面提到过的 association 标签了。
association
它其实就相当于: 一对一OneToOne
用法有两种:
- resultMap
<association property="type" column="type_id" resultMap="equipmentManagementSystem.Mybatis.TypeMapper.typeResultMap"/>
- select
<association property="user" column="user_id" select="equipmentManagementSystem.Mybatis.UserMapper.findById"/>