文章目录
- 善用<typeAliases>标签为全限定包名起别名
- Mybatis中byte[]对应数据库的类型
- 实体类中不要使用基本类型
- <mappers>标签搜索接口细节
- SQL标签的id属性值中不能出现英文句点 .
- <resultMap>中的automapping属性实现自动映射
- Mybatis自动映射
- resultType指定返回值为对象时属性和字段名要一致
- 多表关联查询返回对象包含不同表中字段设计思想
- useGeneratedKeys获取自动生成后的主键
- <selectKey>标签获取数据库生成的主键值
- jdbcType指定入库特殊类型
- @param注解使用Map来为多参数赋值
- <set>使用<if>标签要注意条件全不满足的情况
- <bind>标签增加可移植性
- 可移植性的最优解:<databaseIdProvider>
- OGNL的特殊用法
- 嵌套对象属性映射的两种方式
- <association>标签的一对一嵌套查询
- mybatis懒加载导致的报错
- 懒加载情况下暂时加载全部数据的需求
- 二级缓存引起的脏数据问题
善用<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[]"。这个类型一般对应数据库中的BLOB
、LONGVARBINARY
以及一些和二进制流有关的字段类型。
实体类中不要使用基本类型
由于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
: