1、一对一查询(多对一)
1.1 表关系
案例主要以最为简单的用户和账户的模型来分析 Mybatis 多表关系。用户为 User 表,账户为Account 表。一个用户(User)可以有多个账户(Account)。
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
本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Mybatis多表查询