mybatis学习(day5) 输出映射 输出映射有两种方式
在前面的学习中我吗可以看到我们的mapper.xml配置为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace ="mapper.UserMapper" > <select id ="findUserById" parameterType ="int" resultType ="po.User" > SELECT * FROM users.user WHERE id=#{value} </select > <select id ="findUserByName" parameterType ="java.lang.String" resultType ="po.User" > SELECT * FROM users.user WHERE username LIKE '%${value}%' </select > <insert id ="insertUser" parameterType ="po.User" > <selectKey keyProperty ="id" order ="AFTER" resultType ="java.lang.Integer" > SELECT LAST_INSERT_ID() </selectKey > INSERT INTO users.user (username,birthday,sex,address)values (#{username},#{birthday},#{sex},#{address}) </insert > <delete id ="deleteUser" parameterType ="java.lang.Integer" > delete from users.user where id=#{id} </delete > <update id ="updateUser" parameterType ="po.User" > update users.user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update > <select id ="findUserList" parameterType ="po.UserQueryVo" resultType ="po.UserCustom" > SELECT * FROM users.user WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%' </select > <select id ="selectMulti2Object" resultType ="po.User" > select * from users.user where username = #{paramName,javaType=java.lang.String,jdbcType=VARCHAR} or birthday = #{paramAge} </select > </mapper >
仅有resultType
所以为什么我们要写这个?
resultType
使用resultType
进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
所以我们在写mapper的时候,一定要记得mapper的映射对象一定是我们写的实现接口。
输出简单类型
1 2 3 4 5 6 7 <select id ="findUserCount" parameterType ="com.iot.mybatis.po.UserQueryVo" resultType ="int" > SELECT count(*) FROM user WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%' </select >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Test public void testFindUserCount () throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserQueryVo userQueryVo = new UserQueryVo (); UserCustom userCustom = new UserCustom (); userCustom.setSex("1" ); userCustom.setUsername("小" ); userQueryVo.setUserCustom(userCustom); int count = userMapper.findUserCount(userQueryVo); System.out.println(count); }
查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。
输出pojo对象和pojo列表 不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType
指定的类型是一样的。
在mapper.java指定的方法返回值类型不一样:
1 2 public User findUserById (int id) throws Exception;
1 2 public List<User> findUserByName (String name) throws Exception;
生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne
(返回单个对象调用)还是selectList
(返回集合对象调用 ).
resultMap(这个是mybatis里的核心完成方式) mybatis中使用resultMap完成高级输出结果映射。(一对多,多对多)
resultMap使用方法 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
1.定义resultMap
2.使用resultMap作为statement的输出映射类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <resultMap type ="user" id ="userResultMap" > <id column ="id_" property ="id" /> <result column ="username_" property ="username" /> </resultMap >
小结 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。