Mapper.xml文件中的parameterType、resultType和resultMap
一、parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
1、传递简单类型,使用 #{} 占位符或 ${} 进行sql拼接。
<!-- 根据用户id查询用户 1.id必须和Mapper接口方法名一致 2.parameterType必须和接口方法参数一致 3.resultType必须和接口方法返回值类型一致 --> <select id="queryUserById" parameterType="int" resultType="com.sfwu15.pojo.User"> SELECT * FROM `user` WHERE id=#{id} </select>
<!-- 根据用户名称模糊查询用户 --> <select id="queryUserByUserName" parameterType="string" resultType="com.sfwu15.pojo.User"> SELECT * FROM `user` WHERE username='%${value}%' </select>
2、传递pojo对象,Mybatis使用ognl表达式解析对象字段的值,#{} 或 ${} 括号中的值为pojo属性名称。
<!-- 根保存用户 --> <select id="saveUser" parameterType="com.sfwu15.pojo.User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}); </select>
3、传递pojo包装对象。包装对象:Pojo类中的一个属性是另外一个pojo。
public class QueryVo { // 包含其他的pojo private User user; private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
Mapper.xml文件。
<!-- 根据用户名称模糊查询用户 --> <select id="queryUserByUserName" parameterType="QueryVo" resultType="com.sfwu15.pojo.User"> SELECT * FROM `user` WHERE username='%${user.name}%' </select>
二、resultType输出结果类型。
mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中。
resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
1、输出简单类型。
<!-- 查询数据的条数 --> <select id="queryUserCount" resultType="int"> SELECT count(*) FROM `user` </select>
2、输出pojo对象。
<!-- 根据用户id查询用户 1.id必须和Mapper接口方法名一致 2.parameterType必须和接口方法参数一致 3.resultType必须和接口方法返回值类型一致 --> <select id="queryUserById" parameterType="int" resultType="com.sfwu15.pojo.User"> SELECT * FROM `user` WHERE id=#{id} </select>
3、输出pojo列表。
<!-- 根据用户名称模糊查询用户 --> <select id="queryUserByUserName" parameterType="string" resultType="com.sfwu15.pojo.User"> SELECT * FROM `user` WHERE username='%${value}%' </select>
三、resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中。
mapper.xml 映射文件中的列名user_id和属性名userId不一致,需要定义它们的映射关系。
<!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo --> <!-- id:设置ResultMap的id --> <resultMap type="order" id="orderResultMap"> <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id --> <!-- property:主键在pojo中的属性名 --> <!-- column:主键在数据库中的列名 --> <id property="id" column="id" /> <!-- 定义普通属性 --> <result property="userId" column="user_id" /> <result property="number" column="number" /> <result property="createtime" column="createtime" /> <result property="note" column="note" /> </resultMap> <!-- 查询所有的订单数据 --> <select id="queryOrderAll" resultMap="orderResultMap"> SELECT id, user_id, number, createtime, note FROM `order` </select>