一、表之间的几种关系
- 一对多
- 多对一
- 一对一
- 多对多
1.示例
- 用户和订单就是一对多
- 订单和用户就是多对一
- 一个用户可以下多个订单
- 多个订单属于同一个用户
- 人和身份证号就是一对一
- 一个人只能有一个身份证号
- 一个身份证号只对应一个人
- 老师和学生就是多对多
- 一个学生可以有多个老师
- 一个老师也可以有多个学生
2.特例
- 如果针对于一个具体的订单,它只能属于一个具体的用户
- 所以
mybatis
把多对一看成了一对一
二、mybatis中的多表查询(多对一/一对一)
1.示例:用户和账户
比如,一个人可以在同一家银行拥有多张银行卡账户
- 一个用户可以拥有多个账户
- 一个账户只能属于一个用户(多个账户也可以属于同一个用户)
2.步骤:
1.建立两张表:用户表,账户表
- 让用户表和账户表具有一对多的关系,账户表需要添加外键
- 按如下
sql
语句建立accout
表和插入一些数据
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,46,1000),(2,43,1000),(3,46,2000);
- 效果:
2.建立两个实体类:用户实体类和账户类实体类
让用户和账户的实体类能体现出来一对多的关系
实体类的属性名严格对应表中的字段名,提供getter
和setter
以及重写toString
方法
User
Account
- 分别定义相关的接口和方法
public interface IUserDao {
public List<User> findAll();
public User findById(Integer id);
}
public interface IAccountDao {
/**
* 查询所有
* @return
*/
public List<Account> findAll();
}
3.新建上述接口和实体类对应的映射配置文件
IUserDao.xml
IAccountDao.xml
-
Account
方法测试类
public class AccountTest {
private InputStream in;
private SqlSession session;
private IAccountDao accountDao;
@Before //添加注解才能在其他测试方法执行之前执行
public void init() throws Exception{
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3. 创建SqlSession
session = factory.openSession(true);
//4.创建代理对象
accountDao = session.getMapper(IAccountDao.class);
}
@After
public void destroy() throws Exception{
//1。提交事务
// session.commit();
//2.关闭资源
session.close();
in.close();
}
@Test
public void testFindAll(){
//5.执行查询
List<Account> accounts = accountDao.findAll();
//6.打印
for (Account account : accounts) {
System.out.println(account);
}
}
}
-
执行查询所有的测试
-
上述的步骤只是完成了两个单表的分别查询操作,还不是我们最终的目标
4.目标查询效果的sql语句分析
我们的目标是,查询出
account
的同时,显示每一条account
的所属的用户信息
4.1sql语句
为了实现上述的语句,我们先思考sql语句怎么写
-
方式1
SELECT * FROM account a, USER u WHERE a.`UID`