MyBatis 源码分析系列文章导读 (7)

上面简单分析了一下枚举类型处理器,接下来,继续往下看。下面是 ArticleMapper.xml 的配置内容:

<!-- ArticleMapper.xml --> <mapper namespace="xyz.coolblog.dao.ArticleDao"> <resultMap type="Author"> <id property="id" column="author_id"/> <result property="name" column="name"/> <result property="age" column="age"/> <result property="sex" column="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/> <result property="email" column="email"/> </resultMap> <resultMap type="Article"> <id property="id" column="id" /> <result property="title" column="title"/> <result property="type" column="type" typeHandler="xyz.coolblog.mybatis.ArticleTypeHandler"/> <result property="content" column="content"/> <result property="createTime" column="create_time"/> <association property="author" javaType="Author" resultMap="authorResult"/> </resultMap> <select resultMap="articleResult"> SELECT ar.id, ar.author_id, ar.title, ar.type, ar.content, ar.create_time, au.name, au.age, au.sex, au.email FROM article ar, author au WHERE ar.author_id = au.id AND ar.id = #{id} </select> </mapper>

如上,ArticleMapper.xml 中包含了一个一对一的配置<association/>,这个配置引用了另一个 id 为authorResult的 。除了一对一的配置外,这里还有一个自定义类型处理器ArticleTypeHandler需要大家注意。这个自定义类型处理器用于处理ArticleTypeEnum枚举类型。大家如果注意看前面贴的ArticleTypeEnum的源码,会发现每个枚举值有自己的编号定义。比如JAVA的编号为1,DUBBO的编号为2,SPRING的编号为8。所以这里我们不能再使用EnumOrdinalTypeHandler对ArticleTypeHandler进行类型转换,需要自定义一个类型转换器。那下面我们来看一下这个类型转换器的定义。

public class ArticleTypeHandler extends BaseTypeHandler<ArticleTypeEnum> { @Override public void setNonNullParameter(PreparedStatement ps, int i, ArticleTypeEnum parameter, JdbcType jdbcType) throws SQLException { // 获取枚举的 code 值,并设置到 PreparedStatement 中 ps.setInt(i, parameter.code()); } @Override public ArticleTypeEnum getNullableResult(ResultSet rs, String columnName) throws SQLException { // 从 ResultSet 中获取 code int code = rs.getInt(columnName); // 解析 code 对应的枚举,并返回 return ArticleTypeEnum.find(code); } @Override public ArticleTypeEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException { int code = rs.getInt(columnIndex); return ArticleTypeEnum.find(code); } @Override public ArticleTypeEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { int code = cs.getInt(columnIndex); return ArticleTypeEnum.find(code); } }

对于自定义类型处理器,可继承 BaseTypeHandler,并实现相关的抽象方法。上面的代码比较简单,我也进行了一些注释。应该比较好理解,这里就不多说了。

前面贴了实体类,数据访问类,以及 SQL 映射文件。最后还差一个 MyBatis 的配置文件,这里贴出来。如下:

<!-- mybatis-congif.xml --> <configuration> <properties resource="jdbc.properties"/> <typeAliases> <typeAlias alias="Article" type="xyz.coolblog.model.ArticleDO"/> <typeAlias alias="Author" type="xyz.coolblog.model.AuthorDO"/> </typeAliases> <typeHandlers> <typeHandler handler="xyz.coolblog.mybatis.ArticleTypeHandler" javaType="xyz.coolblog.constant.ArticleTypeEnum"/> </typeHandlers> <environments default="development"> <environment> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property value="${jdbc.driver}"/> <property value="${jdbc.url}"/> <property value="${jdbc.username}"/> <property value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/AuthorMapper.xml"/> <mapper resource="mapper/ArticleMapper.xml"/> </mappers> </configuration>

下面通过一个表格简单解释配置中出现的一些标签。

标签名称 用途
properties   用于配置全局属性,这样在配置文件中,可以通过占位符 ${} 进行属性值配置  
typeAliases   用于定义别名。如上所示,这里把xyz.coolblog.model.ArticleDO的别名定义为Article,这样在 SQL 映射文件中,就可以直接使用别名,而不用每次都输入长长的全限定类名了  
typeHandlers   用于定义全局的类型处理器,如果这里配置了,SQL 映射文件中就不需要再次进行配置。前面为了讲解需要,我在 SQL 映射文件中也配置了 ArticleTypeHandler,其实是多余的  
environments   用于配置事务,以及数据源  
mappers   用于配置 SQL 映射文件的位置信息  

以上仅介绍了一些比较常用的配置,更多的配置信息,建议大家去阅读MyBatis 官方文档。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsyfs.html