Mybatis多表查詢

一、一對一查詢(多對一)

1.1 表關係

案例主要以最爲簡單的用戶和帳戶的模型來分析 Mybatis 多表關係。用戶爲 User 表,帳戶爲Account 表。一個用戶(User)能夠有多個帳戶(Account)。
image.pngjava

1.2 需求

查詢全部的帳戶信息,並關聯查詢出每一個帳戶對應的用戶信息(注意:由於一個帳戶信息只能供某個用戶使用,因此從查詢帳戶信息出發關聯查詢用戶信息爲一對一查詢。如 果從用戶信息出發查詢用戶下的帳戶信息則爲一對多查詢,由於一個用戶能夠有多個帳戶)。mysql

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);
    }
}
相關文章
相關標籤/搜索