Mybatis处理一对多映射查询

Mybatis处理一对多映射查询

Mybatis处理sql查询比较灵活,既可以使用orm创建实体类来保存结果集,也可以直接使用HashMap保存结果集.

数据库表结构

use wt;

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user_info
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `uid` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `login_name` varchar(40) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `username` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `worker_id` varchar(16) COLLATE utf8_unicode_ci DEFAULT '',
  `password` varchar(40) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `position` varchar(16) COLLATE utf8_unicode_ci DEFAULT '',
  `department` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT '',
  `status` int(11) NOT NULL,
  `is_admin` int(11) DEFAULT NULL,
  `reserv2` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  `reserv1` int(11) DEFAULT NULL,
  `modifytime` datetime DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
create unique index idx_user_username on user_info(login_name);

INSERT INTO `user_info` VALUES ('1', 'login_name1', 'username1', '000', '1', '0', '1', 'robin@email.com', 1, 1, '', 0, '2011-08-10 10:02:44');
INSERT INTO `user_info` VALUES ('2', 'login_name2', 'username2', '001', '1', '0', '1', 'robin@email.com', 1, 1, '', 0, '2011-08-10 10:02:44');
INSERT INTO `user_info` VALUES ('3', 'login_name3', 'username3', '002', '1', '0', '2', 'robin@email.com', 1, 1, '', 0, '2011-08-10 10:02:44');


DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `uid` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `department_name` varchar(40) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `is_active` int(3) NOT NULL DEFAULT 0,
  `modifytime` datetime DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

insert into `department` values('1', '软件组', 1, '2018-04-12 12:12:12');
insert into `department` values('2', '导航组', 1, '2018-04-12 12:12:12');
insert into `department` values('3', '算法组', 1, '2018-04-12 12:12:12');
insert into `department` values('4', '机械组', 1, '2018-04-12 12:12:12');

使用实体类保存结果

mapper.xml编写sql

mapper.xml需要定义resultMap,使用collection处理映射关系

    <resultMap id="DepartmentResultMap" type="com.example.demo.model.Department2">
        <id column="uid" jdbcType="VARCHAR" property="uid" />
        <result column="department_name" jdbcType="VARCHAR" property="departmentName" />
        <result column="is_active" jdbcType="INTEGER" property="isActive" />
        <result column="modifytime" jdbcType="TIMESTAMP" property="modifytime" />
        <collection property="users" ofType="UserInfo2" column="department">
            <id property="uid" column="userId"/>
            <result column="login_name" property="loginName"/>            
            <result column="username" jdbcType="VARCHAR" property="username" />
            <result column="worker_id" jdbcType="VARCHAR" property="workerId" />
            <result column="password" jdbcType="VARCHAR" property="password" />
            <result column="position" jdbcType="VARCHAR" property="position" />
            <!-- <result column="department" jdbcType="VARCHAR" property="department" /> -->
        </collection>
    </resultMap>

<select id="selectDepartment2" parameterType="java.lang.String" resultMap="DepartmentResultMap">        
select d.*,u.uid as userId ,u.* from user_info u, department d where u.department = d.uid and d.uid=#{uid}      
</select>

实体类

package com.example.demo.model;

import java.util.Date;
import java.util.List;

public class Department2 {
    private String uid;

    private String departmentName;

    private Integer isActive;

    private Date modifytime;

    private List<UserInfo2> users;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid == null ? null : uid.trim();
    }

    public String getDepartmentName() {
        return departmentName;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName == null ? null : departmentName.trim();
    }

    public Integer getIsActive() {
        return isActive;
    }

    public void setIsActive(Integer isActive) {
        this.isActive = isActive;
    }

    public Date getModifytime() {
        return modifytime;
    }

    public void setModifytime(Date modifytime) {
        this.modifytime = modifytime;
    }

    /**
     * @return the users
     */
    public List<UserInfo2> getUsers() {
        return users;
    }

    /**
     * @param users the users to set
     */
    public void setUsers(List<UserInfo2> users) {
        this.users = users;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(this.getDepartmentName());
        for (UserInfo2 u : users) {
            u.setDepartment(this);
            sb.append(u.toString());
        }
        return sb.toString();
    }
}

mapper接口

接口中的方法名,需要和mapper.xml中标签中的id一致.

import com.example.demo.model.Department2;
import com.example.demo.model.UserInfo2;

public interface UserInfo2Mapper {

    UserInfo2 selectUserInfo2(String uid);

    Department2 selectDepartment2(String uid);
}

调用

    Department2 d = userInfo2Mapper.selectDepartment2("1");
    System.out.println("get department: " + d);

使用HashMap保存结果集

使用上面的步骤,需要定义实体类,以及定义resultMap,比较麻烦.
使用HashMap只需要增加sql语句,比较简单.

mapper.xml定义sql

主要使用HashMap时,需要把resultMap修改为resultType属性.

<select id="queryDepartment" parameterType="java.lang.String" resultType="java.util.HashMap">
        select d.*,u.uid as userId ,u.* from user_info u, department d where u.department = d.uid and d.uid=#{uid}      
</select>  

mapper接口

接口中的方法名,需要和mapper.xml中标签中的id一致.

import com.example.demo.model.Department2;
import com.example.demo.model.UserInfo2;

public interface UserInfo2Mapper {

    UserInfo2 selectUserInfo2(String uid);

    Department2 selectDepartment2(String uid);

    List<HashMap> queryDepartment(String uid);
}

调用

    List<HashMap> list1 = userInfo2Mapper.queryDepartment("1");
    for (HashMap dep: list1) {
        System.out.println("get dep: " + dep);
    }

使用实体类保存结果集遇到一个问题,department.users是有数据的,但是department.users[0].department会是空数据,这里牵涉到嵌套填充数据,在mybatis查询到数据后,必须手动处理department.users[i].department对应的数据,比较麻烦.
在实际使用中,多使用HashMap来保存结果集.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值