案例主要以最爲簡單的用戶和帳戶的模型來分析 Mybatis 多表關係。用戶爲 User 表,帳戶爲Account 表。一個用戶(User)能夠有多個帳戶(Account)。java
查詢全部的帳戶信息,並關聯查詢出每一個帳戶對應的用戶信息(注意:由於一個帳戶信息只能供某個用戶使用,因此從查詢帳戶信息出發關聯查詢用戶信息爲一對一查詢。如 果從用戶信息出發查詢用戶下的帳戶信息則爲一對多查詢,由於一個用戶能夠有多個帳戶)。mysql
-- 建立數據庫 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);
public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; }
public class Account implements Serializable { private Integer id; private Integer uid; private Double money; // 一對一關係中,從表實體須要包含一個主表實體對象的引用 private User user; }
public interface AccountMapper { /** * 查詢全部帳戶,而且返回帳戶所屬的用戶信息 * @return */ List<Account> findAll(); }
jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/mybatis jdbc.username = root jdbc.password = root
<?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>
<?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>
/** * 測試查詢全部方法 */ @Test public void testFindAll() { List<Account> accountList = this.accountMapper.findAll(); for (Account account : accountList) { System.out.println(account); } }