Mybatis--嵌套查询

本文部分参考:https://blog.csdn.net/qq_34777858/article/details/79209392
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
翻了一下Mybatis官方文档,之前看得不是很懂的位置,现在看有种豁然开朗的感觉。看到嵌套查询,写了几个Demo,觉得不错,整理记录一下。
构造的三张表:

CREATE TABLE `admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `company` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `company_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

项目结构
这里写图片描述
需要说明的是构造了两个特殊的pojo。
UserCompany:

public class UserCompany extends User{

    private Company company;

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }
}

UserAdmin:

public class UserAdmin extends User{

    private List<Admin> lstAdmin;

    public List<Admin> getLstAdmin() {
        return lstAdmin;
    }

    public void setLstAdmin(List<Admin> lstAdmin) {
        this.lstAdmin = lstAdmin;
    }
}

其中构造的user与admin是一对多,而user与company是一对一的关系。

<resultMap id="userResultMap" type="com.test.mybatis.pojo.User">
        <!-- Mybatis中自动映射,将会把查询出来的列名自动映射到实体类中相同的变量名中 ,如下可不写将会自动映射-->
        <!-- <id column="id" property="id" jdbcType="INTEGER" />
        <result column="name" property="name" jdbcType="VARCHAR" /> -->
        <result column="password" property="password" jdbcType="VARCHAR" />
    </resultMap>
    <select id="selectUserById" resultMap="userResultMap" parameterType="java.lang.Integer">
        SELECT *
        FROM user
        WHERE id=#{id}
    </select>



    <!-- 嵌套的一对一查询,将一映射到一个变量中 -->
    <resultMap id="companyResultMap" type="com.test.mybatis.pojo.Company">
        <id column="company_id" property="id" jdbcType="INTEGER" />
        <result column="user_id" property="userId" jdbcType="INTEGER" />
        <result column="company_name" property="companyName" jdbcType="VARCHAR" />
    </resultMap>

    <resultMap id="userCompanyResultMap" type="com.test.mybatis.pojo.UserCompany" extends="BaseResultMap">
        <!-- 如上, extends="BaseResultMap",将会继承一个resultMap,复用代码。如下代码可不写 -->
        <!-- <id column="id" property="id" jdbcType="INTEGER" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="password" property="password" jdbcType="VARCHAR" /> -->
        <association property="company" javaType="com.test.mybatis.pojo.Company" resultMap="companyResultMap">
            <!-- 如上resultMap="companyResultMap",如下代码可不写 -->
            <!-- <id column="company_id" property="id" jdbcType="INTEGER" />
            <result column="user_id" property="userId" jdbcType="INTEGER" />
            <result column="company_name" property="companyName" jdbcType="VARCHAR" /> -->
        </association>
    </resultMap>

    <select id="selectUserCompanyInfo" resultMap="userCompanyResultMap">
        SELECT u.id,u.name ,u.password,
        com.id AS company_id,com.user_id,
        com.company_name
        FROM user AS u
        LEFT JOIN company AS com ON com.user_id=u.id
    </select>




    <!-- 集合的嵌套查询 ,一对多,将多映射到集合中-->
    <resultMap id="userAdminResultMap" type="com.test.mybatis.pojo.UserAdmin" extends="BaseResultMap">
        <!-- <id column="id" property="id" jdbcType="INTEGER" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="password" property="password" jdbcType="VARCHAR" /> -->
        <collection property="lstAdmin" ofType="com.test.mybatis.pojo.Admin">
            <id column="admin_id" property="id" jdbcType="INTEGER" />
            <result column="admin_name" property="name" jdbcType="VARCHAR" />
        </collection>
    </resultMap>

    <select id="selectUserAdminInfo" resultMap="userAdminResultMap">
        SELECT u.*,a.id AS
        admin_id,a.name AS admin_name
        FROM user AS u
        LEFT JOIN admin AS a ON
        u.id=a.user_id
    </select>

测试代码:

        User user = userDao.selectUserById(1);
        System.out.println(user.getName());

        List<UserCompany> selectUserCompanyInfo = userDao
                .selectUserCompanyInfo();
        for (Iterator<UserCompany> iterator = selectUserCompanyInfo.iterator(); iterator
                .hasNext();) {
            UserCompany userCompany = iterator.next();
            System.out.println(userCompany.getCompany().getCompanyName());
        }

        List<UserAdmin> lstUserAdmin = userDao.selectUserAdminInfo();
        for (Iterator<UserAdmin> iterator = lstUserAdmin.iterator(); iterator
                .hasNext();) {
            UserAdmin userAdmin = (UserAdmin) iterator.next();
            System.out.println(userAdmin.getName());
            List<Admin> lstAdmin = userAdmin.getLstAdmin();
            for (Iterator<Admin> iterator2 = lstAdmin.iterator(); iterator2
                    .hasNext();) {
                Admin admin = iterator2.next();
                System.out.println(admin.getName());
            }
        }

发现经验越多代码量往往越少。

猜你喜欢

转载自blog.csdn.net/BtWangZhi/article/details/81990369