mybatis学习笔记(一 ) 输入输出映射

输入输出映射

1.输入映射形式

resultType:
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

1)简单类型

<mapper namespace="mapper.testMybatisMapper">

    <select id="findUserName" parameterType="int" resultType="srj.po.User">
        select age from userinfo where id=#{id}//输入语句
    </select>
</mapper>

我的疑惑 parameterType=”int” resultType=”srj.po.User”
parameterType=”int”:输入类型为int
resultType=”srj.po.User” 输出类型为User
User类如下

package srj.po;
public class User {
    private int id;
    private String name;
    private int age;
    private String grade;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getGrade() {
        return grade;
    }
    public void setGrade(String grade) {
        this.grade = grade;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age + ", grade=" + grade + "]";
    }
}

mybaitis会自动根据selsct后面跟的参数来对应输出的数据
如:

<select id="findUserName" parameterType="int" resultType="srj.po.User">
    select age from userinfo where id=#{id}
</select>

则会将age作为输出,对应到user中的
User [id=0, name=null, age=20, grade=null]
除了age其他均为0
如果将

select * from userinfo where id=#{id}

则会输出
User [id=2, name=XXX, age=20, grade=3]
输入映射和输出名称映射一一对应

2)pojo类型

parameterType=”srj.po.Usersearch”
输入类型需要封装 不可以直接使用User原类型进行获取 要获取一个对象
下面获取的是user对象

<select id="findUserInfo" parameterType="srj.po.Usersearch" resultType="srj.po.User"> 
    select * from userinfo where name=#{user.name} and grade=#{user.grade}
</select>

其中srj.po.Usersearch的代码为

package srj.po;

public class Usersearch  {
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

Usersearch 封装了User对象 命名为user 调用的是这个user
如果直接使用 则会报错 如下图 原因没有user这个对象

<select id="findUserInfo" parameterType="srj.po.User" resultType="srj.po.User">
        select * from userinfo where name=#{user.name} and grade=#{user.grade}
</select>

错误如下

Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'User' in 'class srj.po.User'
 Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'User' in 'class srj.po.User'

输出类型映射(1)

resultType=”srj.po.User”

1.如果返回值是一个对象或者是一个单独的 则可直接写

    <select id="findUserInfo" parameterType="srj.po.Usersearch" resultType="srj.po.User">
        select * from userinfo where name=#{user.name} and grade=#{user.grade}
    </select>

接口方法为
封装的Usersearch同上

public User findUserInfo(Usersearch user) throws Exception;

2.如果返回list集合形式则
mapper.xml不变 如下

    <select id="findUserList" parameterType="srj.po.Usersearch" resultType="srj.po.User">
        select * from userinfo where name=#{user.name} and grade=#{user.grade}
    </select> 

接口返回类型发生改变

public List<User> findUserList(Usersearch user) throws Exception;

测试代码中 返回值写为list集合 同接口一致 mybatis自动匹配

     public void testMaper3() throws Exception
        {
            SqlSession sqlSession=null;
            Usersearch u=new Usersearch();
            User user=new User();
            user.setName("Mark");
            user.setGrade(2);
            u.setUser(user);

            sqlSession=sqlSessionFactory.openSession();
            //生成代理类
            testMybatisMapper userMapper=sqlSession.getMapper(testMybatisMapper.class);
            List<User> user1=userMapper.findUserList(u);//返回值为list
            System.out.println(user1.toString());

        }

如果查询出多条结果但返回不写list则会报错 错误如下
找到两条纪录

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

输出类型映射(2)

resultMap=”userResultMap”
resultMap
id=”userResultMap”为下方映射的名resultMap=”userResultMap”

resultMap定义如下

<resultMap type="srj.po.User" id="userResultMap">
        <id column="id_" property="id" />
        //将查询出来的id_对应为user中的id值
        <!-- result:对普通名映射定义 column:查询出来的列名 property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 
            (对应关系) -->
        <result column="name_" property="name" />
    </resultMap>
<select id="findUserResultMap" parameterType="srj.po.Usersearch" resultMap="userResultMap">

        select id id_,name name_ from userinfo where name=#{user.name} and grade=#{user.grade}
         //演示作用 将id写为id_ 与user类中的对象名称不符 所以无法映射
</select>

猜你喜欢

转载自blog.csdn.net/qq_38189293/article/details/82526175
今日推荐