Mybatis拾遗

本文详述了Mybatis的使用细节,包括<typeAliases>的配置、byte[]的映射、实体类避免使用基本类型、<mappers>标签的扫描机制、SQL标签id的注意事项、自动映射特性及其配置、resultMap的automapping属性、自动映射策略、多表关联查询的设计、主键获取方式、<selectKey>标签的应用、jdbcType的指定、多参数赋值的处理、<set>标签与<if>标签的使用策略、<bind>标签提高可移植性以及<databaseIdProvider>的使用。此外,还探讨了OGNL的特殊用法、嵌套对象属性映射、懒加载的报错及解决方案,以及二级缓存可能导致的脏数据问题。
摘要由CSDN通过智能技术生成

善用<typeAliases>标签为全限定包名起别名

  <typeAliases>元素下面配置了一个包的别名,通常确定一个类的时候需要使用类的全限定名称,这样配置后,在使用类的时候不需要写包名的部分,只使用包的别名即可。这样可以使大量的全限定名缩短,使代码更简洁漂亮。
  1、<package>标签会将指定全限定名的包下所有的JavaBean扫描一遍,并默认将javaBean的非限定类名首字母小写后作为它的全限定名的别名,使用时只用将类名首字母小写即可访问到。

<typeAliases>
    <package name="com.dy.entity"/>
</typeAIiases>

  2、typeAlias>标签用于对特定类取别名,使用alias属性中的值进行访问。

<typeAliases>
    <typeAlias alias="StudentEntity" type="com.dy.entity.Student"/>
</typeAIiases>

  3、也可以在JavaBean上加@Alias注解取别名,如@Alias(user)

Mybatis中byte[]对应数据库的类型

  在MyBatis中,关于数据库字段和Java类型的对应关系,不需要刻意去记,但需要注意一个特殊的类型"byte[]"。这个类型一般对应数据库中的BLOBLONGVARBINARY以及一些和二进制流有关的字段类型。

实体类中不要使用基本类型

  由于Java中的基本类型会有默认值,例如当某个类中存在private int age;字段时,创建这个类时,age会有默认值0。当使用age属性时,它总会有值。因此在某些情况下,便无法实现使age为null,并且在动态SQL的部分,如果使用age != null进行判断,结果总会为true,因而会导致很多隐藏的问题。所以,在实体类中不要使用基本类型。基本类型包括byte、int、short、long、float、double、char、boolean。

<mappers>标签搜索接口细节

  可以使用两种方式实现接口的扫描,第一种是在mybatis配置文件中一个一个地手动配置xml文件的全路径,每增加一个新的xml文件都要去改变mybatis配置文件:

<mappers>
    <mapper resource="com/mybatis/simple/StudentMapper.xml"/>
    <mapper resource="com/mybatis/simple/RoleMapper.xml"/>
    ...
</mappers>

  第二种是在mybatis配置文件中配置DAO层Mapper接口的包的全限定名,然后根据包中接口去反向搜索对应xml文件。具体细节为:mybatis会扫描该包下所有接口,并循环对每个接口如下操作:
  1、判断接口对应的命名空间是否已存在(防止接口重复,或者xml中namespace写错),如果存在则抛异常,不存在则继续;
  2、加载接口对应的xml文件。需要先将接口全限定名转换为文件路径,并去搜索该xml,如果找到就解析xml;
  3、处理接口中的注解方法。

<mappers>
    <package name="com.mybatis.simple.mapper"/>
</mappers>

SQL标签的id属性值中不能出现英文句点 .

<resultMap>中的automapping属性实现自动映射

  通常我们需要在<resultMap>中写<result>来实现查询结果的字段和实体类的属性之间的映射。但还可以通过autoMapping属性有更简便的写法。autoMapping用于配置是否启用非映射字段(没有在resultMap中配置的字段)的自动映射功能,该配置可以覆盖全局的aut0MappingBehavior配置。即我们可以将:

<resultMap id="studentInfoMap" type="com.mybatis.simple.Student">
    <id column="id" property="id"/>
    <result column="student_name" property="studentName"/>
    <result column="student_age" property="studentAge"/>
    ...
</resultMap>

中的<result>全部省略,加入autoMapping属性。Mybatis会自动映射。请注意是否需要开启驼峰映射,并保证类中属性名与结果字段名一致。

<resultMap id="studentInfoMap" type="com.mybatis.simple.Student" automapping="true">
    <id column="id" property="id"/>
</resultMap>

  事实上Mybatis默认开启了全局自动映射,因此我们往往考虑某些特殊的resultMap是否需要关闭而使用此属性。

Mybatis自动映射

  Mybatis的自动映射策略是默认开启的,它会忽略大小写,并默认只对在非嵌套resultMap未映射的字段进行自动映射。如果一个resultMap使用了嵌套,则自动映射策略将对该resultMap所有字段均不生效,即使是未嵌套的字段。
  但我们可以通过全局配置autoMappingBehavior来左右mybatis的自动映射行为。autoMappingBehavior有三种级别可选:
  NONE:不启用自动映射;
  PARTIAL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值