转载

Mybatis多表查询

1、一对一查询(多对一)

1.1 表关系

案例主要以最为简单的用户和账户的模型来分析 Mybatis 多表关系。用户为 User 表,账户为Account 表。一个用户(User)可以有多个账户(Account)。

Mybatis多表查询

1.2 需求

查询所有的账户信息,并关联查询出每个账户对应的用户信息(注意:因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询。如 果从用户信息出发查询用户下的账户信息则为一对多查询,因为一个用户可以有多个账户)。

1.3 数据准备

-- 创建数据库
CREATE DATABASE mybatis;

-- 使用数据库
USE mybatis;

-- 删除用户表
DROP TABLE IF EXISTS user;

-- 创建用户表
CREATE TABLE `user` (
  `id` INT(11) NOT NULL auto_increment,
  `username` VARCHAR(32) NOT NULL COMMENT '用户名称',
  `birthday` DATETIME DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入用户数据
INSERT INTO `user`(`id`,`username`,`birthday`,`sex`,`address`) VALUES (41,'张三','2019-03-27 18:47:08','男','北京');
INSERT INTO `user`(`id`,`username`,`birthday`,`sex`,`address`) VALUES (42,'李四','2019-03-27 18:47:08','男','上海');
INSERT INTO `user`(`id`,`username`,`birthday`,`sex`,`address`) VALUES (43,'王五','2019-03-27 18:47:08','男','广州');

-- 删除账户表
DROP TABLE IF EXISTS `account`;

-- 创建账户表
CREATE TABLE `account` (
  `id` INT(11) NOT NULL COMMENT '编号',
  `uid` INT(11) DEFAULT NULL COMMENT '用户编号',
  `money` DOUBLE DEFAULT NULL COMMENT '金额',
  PRIMARY KEY  (`ID`),
  KEY `FK_Reference_8` (`UID`),
  CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入账户数据
INSERT INTO `account`(`ID`,`UID`,`MONEY`) VALUES (1,41,1000);
INSERT INTO `account`(`ID`,`UID`,`MONEY`) VALUES (2,42,1000);
INSERT INTO `account`(`ID`,`UID`,`MONEY`) VALUES (3,43,1000);

1.4 创建pojo与dao

1.4.1 创建pojo

1.4.1.1 创建User类

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
}

1.4.1.2 创建Account类

public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    // 一对一关系中,从表实体需要包含一个主表实体对象的引用
    private User user;
}

1.4.2 创建dao

public interface AccountMapper {
    /**
     * 查询所有账户,并且返回账户所属的用户信息
     * @return
     */
    List<Account> findAll();
}

1.5 创建Mybatis配置文件

1.5.1 数据库配置文件

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis
jdbc.username = root
jdbc.password = root

1.5.2 主配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="datasource.properties"></properties>
    
    <typeAliases>
        <package name="com.itcast.pojo"/>
    </typeAliases>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc"></transactionManager>
            <dataSource type="pooled">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <package name="com.itcast.dao"/>
    </mappers>
</configuration>

1.5.3 映射配置文件

<?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.itcast.dao.AccountMapper">
    <resultMap id="accountMap" type="com.itcast.pojo.Account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <association property="user" javaType="com.itcast.pojo.User">
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="birthday" column="birthday"></result>
            <result property="sex" column="sex"></result>
            <result property="address" column="address"></result>
        </association>
    </resultMap>

    <select id="findAll" resultMap="accountMap">
        SELECT a.`id` AS aid, a.uid, a.money, u.*
        FROM user u, account a
        WHERE a.`uid` = u.`id`
    </select>
</mapper>

1.6 创建测试类

/**
 * 测试查询所有方法
 */
@Test
public void testFindAll() {
    List<Account> accountList = this.accountMapper.findAll();
    for (Account account : accountList) {
        System.out.println(account);
    }
}
原文  https://segmentfault.com/a/1190000022026349
正文到此结束
Loading...