在mybatis中,我们需要通过输入和输出映射来指定输入(参数)和输出(返回值)的类型。
【输入映射】
在mapper的statement中,我们通过parameterType指定输入参数的类型,类型可以是简单类型、hashMap以及pojo的包装类型。
1、简单类型,比如int,我们可以直接进行使用,例如:
<select id="findUserByID" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
select * from user where username LIKE '%${value}%'
</select>
这两条statement的查询条件都是一个,所以我们可以直接使用int或者String作为参数的输入类型,但是如果我们需要两个或者更多的条件时,就需要用到pojo的包装类型啦。
2、pojo包装类型,简单来说就是将所有数据包装成一个简单地Java对象,直接传入该java对象进行查询。
<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user
where user.sex = #{userCustom.sex} AND user.username like '%${userCustom.username}%'
</select>
类UserQueryVo是在原来User类的基础上进行了重新封装,封装的过程中可以扩展需要的条件。
3、hashMap类型,在使用hashMap时需要注意,查询的条件比如说ID和性别是作为key值放在hashMap中,value值是查询的具体条件,比如:
<select id="findUserByMap" parameterType="java.util.Map" resultType="user">
select * from user
where user.sex = #{sex} AND user.username = #{username}
</select>
【输出映射】
在mapper的statement中,我们通过resultType指定输出参数的类型,类型可以是简单类型和pojo的包装类型。使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象,不一致的属性的值为null。
1、简单类型:例如查询数据总数,需要的输出类型为int型,如下:
<select id="findUserCount" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="int">
SELECT count(*) FROM USER
</select>
2、pojo对象和pojo对象列表:不管是输出的pojo单个对象还是一个list列表,在mapper.xml中resultType指定的类型是一样的。
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo"
resultType="cn.itcast.mybatis.po.UserCustom">
SELECT * FROM USER
</select>
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
3、resultMap:如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
<mapper namespace="com.itcast.mybatis.mapper.UserMapper">
<!-- 使用resultMap定义别名进行匹配查询
如果这个resultMap在其它的mapper文件中,前边需要加namespace
-->
<!-- 定义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>
<!-- 使用resultMap-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select>
</mapper>