开篇
在《mybatis初步了解》中有一张架构图,其中提到两种配置文件:一中为全局配置文件,一中为映射文件(mapper.xml),全局配置文件是针对mybatis的配置,映射文件中配置的sql语句。在架构图的两次分别提到了输入映射和输出映射,这篇博客主要来学习一下输入、输出映射和映射文件的关系。
正文
全局配置文件简单学习
为了方便下面的学习,需要先介绍几个全局配置文件中的配置。
typeAliases(别名)
需求:
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、resultType指定输出结果的映射类型。
如果在指定输入、输出类型时使用全路径,不方便进行开发维护。可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
使用:
<typeAliases>
<!-- 针对单个别名定义 type:类型的路径 alias:别名 --> <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> --> <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) --> <package name="cn.itcast.mybatis.po"/>
</typeAliases> |
输出映射
resultType
简单类型:
返回的结果只有一行且一列,可以使用简单类型进程输出映射。
pojo对象:
只有sql查询出来的列名和pojo中的属性名一致,该列才可以映射成功,不一致的列为null。如果查询出来的列名和pojo中的属性名全部不一致,就不会创建pojo对象。只要有一个一致,就会创建pojo对象。
实例:
mapper中的配置
配置文件中的sql给id和username分别使用了别名id_和username_,在数据库中执行完毕后列表使用的是别名,如下图:
配置的输出类型为userCustom其中这两个属性名为id、username,和sql查出的列名不一致。这两个不一致的列结果值不会映射成功,在程序中为跟踪显示为null。
pojo列表:
如果返回的是列表,输出映射类型为单个pojo对象。
resultMap
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系就可以解决无法映射的问题。
使用:
1、定义resultMap
<!-- 定义resultMap 将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名 id:对resultMap的唯一标识 --> <resultMap type="user" id="userResultMap"> <!-- id表示查询结果中 唯一标识 column:查询出来的列名 property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) --> <id column="id_" property="id"/> <!-- result:对普通名映射定义 column:查询出来的列名 property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) --> <result column="username_" property="username"/>
</resultMap> |
2、使用resultMap作为statement的输出映射类型
<!-- 使用resultMap进行输出映射 resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace --> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> SELECT id id_,username username_ FROM USER WHERE id=#{value} </select> |
总结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。