输入输出映射
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>