mybatis之resultmap的使用

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映射文件详解

Mybatis表关联一对多

猜你喜欢

转载自blog.csdn.net/qq_34273888/article/details/81075287