mybatis之resultmap的使用
mybatis在查询的时候,可以自定义resultmap的返回类型,实现复杂的查找。
下面通过一个具体的例子看看是如何实现的。
首先有这样三个表:user表,interests表,和userinterests表
user表中存放用户
interests表中存放兴趣
userinteres中存放用户与兴趣的对应关系。
我们的目标是,输入用户的ID,将对应的用户和其所有兴趣都查找出来。这设计到一对多查询,可以用resultmap来实现。
1、首先,编写两个实体对应的类User.class 和 Interests.class
package com.xiao.mybatis.bean;
import java.util.List;
public class User {
private int id;
private String name;
private int age;
private String sex;
private String school;
// private List<Post> posts;
private List<Interests> interests;
public List<Interests> getInterests() {
return interests;
}
public void setInterests(List<Interests> interests) {
this.interests = interests;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
// public List<Post> getPosts() {
// return posts;
// }
//
// public void setPosts(List<Post> posts) {
// this.posts = posts;
// }
@Override
public String toString(){
return "User <id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + ", interests=" + interests + ">";
}
}
package com.xiao.mybatis.bean;
public class Interests {
private int id;
private String name;
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;
}
@Override
public String toString(){
return "Interests [id=" + id + ", name=" + name + "]";
}
}
2、然后写查询对应的Dao接口 IUser
package com.xiao.mybatis.dao;
import com.xiao.mybatis.bean.Post;
import com.xiao.mybatis.bean.User;
import java.util.List;
public interface IUser {
User findUserById(int userId);
}
3、之后在mybatis配置文件mybatis-local-config.xml中,为两个类创建别名。
注意:alias标签中的是别名,type标签中的是类所在的资源路径。
<typeAliases>
<typeAlias alias="User" type="com.xiao.mybatis.bean.User"/>
<typeAlias alias="Interests" type="com.xiao.mybatis.bean.Interests"/>
</typeAliases>
4、创建跟IUser dao文件对应的Mapper映射文件User.xml。
<?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="com.xiao.mybatis.dao.IUser">
<resultMap id="UserWithInterestsMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<result property="school" column="school"/>
<collection property="interests" column="interestid" ofType="com.xiao.mybatis.bean.Interests">
<id property="id" column="interestid"/>
<result property="name" column="interestname"/>
</collection>
</resultMap>
<select id="findUserById" resultMap="UserWithInterestsMap">
select a.*,c.* from user as a right join userinterests as b on a.id = b.userid right join interests as c on b.interestid = c.interestid where id = #{id}
</select>
</mapper>
注意:
- <mapper namespace="com.xiao.mybatis.dao.IUser"> 中要填写dao文件所在的资源路径。
- <resultMap></resultMap>标签内就是我们定义的复杂的返回类型。
- <resultMap id="UserWithInterestsMap" type="User"> 中,type的值要写在mybatis配置文件中定义的别名。
- <id property="id" column="id"/>
<result property="name" column="name"/>,id对应主键属性,result对应其他属性。 - <collection property="interests" column="interestid" ofType="com.xiao.mybatis.bean.Interests">
</collection>,<collection>标签是实现一对多的关键,它把Interests以集合的形式传入resultMap中,这样一侧的返回值中,就可以包含多个Interests。
5、在mybatis配置文件下添加这个映射文件
<mappers>
<mapper resource="com/xiao/mybatis/xml/User.xml"/>
</mappers>
6、测试
package com.xiao.mybatis.bean;
import com.sun.org.apache.bcel.internal.generic.IUSHR;
import com.xiao.mybatis.dao.IUser;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.Reader;
import java.util.List;
public class DemoTest {
private static SqlSessionFactory sqlSessionFactory;
static{
try{
Reader reader = Resources.getResourceAsReader("mybatis-local-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch (Exception e){
e.printStackTrace();
}
}
public static SqlSessionFactory getSession(){
return sqlSessionFactory;
}
public static void main(String[] args) {
SqlSession session = sqlSessionFactory.openSession();
try{
int userid=5;
IUser userMapper = session.getMapper(IUser.class);
User user = userMapper.findUserById(userid);
System.out.println("记录为"+user.toString());
// User user = session.selectOne("com.xiao.mybatis.bean.UserMapper.getUser",1);
// System.out.println("username:"+user.getName());
// List<Post> posts = user.getPosts();
// for(Post p : posts) {
// System.out.println("Title:" + p.getTitle());
// System.out.println("Content:" + p.getContent());
// }
}finally {
session.close();
}
}
}
7、结果
参考资料:Mybatis中Mapper映射文件详解