大致内容
- 数据库的表之间的关系 一对多 一对一
- 表之间存在约束时 插入 删除是有顺序的。
- 宿舍-学生-卡 说明 一对多 :一个宿舍多名学生,一个学生多张卡。
- 接下来实现多对多,需要三张表subject表/student表/##electSubject业务表。
- 多表查询语句/删除约束/新建约束
- drop dormitory是会报错 Student的外键正在引用
- 为减少耦合度 在表外add dormitory 为 Student外键。
- mysql -cmd 事务管理
1 | select a.*,b.*,c.* from student a left join SelectSubject b on a.stuid=b.stuid |
多表查询
- inner join /left join 区别
给表添加外键
- alter table card add constraint constraint_card foreign key(stuid) references student(stuid);
- 这句sql语句意思是:在card表中添加名为dormitoryid的外键约束。
删除表中的外键
- alter table card drop foreign key constraint_card;
- 删除card表中的名为constraint_card的外键(表中的外键命名采用constraint_外键表名)
外键不删除,不能删除表
删除表中所有数据
- delete from tablename;
删除带有外键约束的表中的数据
- SET FOREIGN_KEY_CHECKS=0;
- delete from tablename;
- SET FOREIGN_KEY_CHECKS=1;
向有约束的表插入数据是有限制的
- 一对多关系 如:宿舍-学生 肯定先有宿舍信息再有学生。
- 先插宿舍,再插学生。
1 | create table dormitory( |
插入数据
- insert into dormitory values(‘A001’,’4persons’);
- insert into student values(‘S001’,’wangshicong’,28,’A001’);//相当于把Student放在A001房间。
- insert into card values(‘C001’,’ic_card’,800,’S001’);//相当于把卡放在学生S001中。
多表查询
- 将三张表等值连接后查询
1
select a.*,b.*,c.*from dormitory a inner join student b on a.dormitoryid=b.dormitoryid inner join card c on b.stuid=c.stuid;
- left join与inner join与right join
- 好奇怪:都一样 难道在一对多中无区别?
多对多关系的表 如何创建约束 如何进行多表查询
- 多对多关系:subject-student//student就用上面创的,注意:里面有个外键约束。
- 通过业务表SelectSubject建立约束
1 | create table student( |
插入数据 先插student 再插subject 最后插SelectSuject
- insert into dormitory values(‘A002’,’6persons’);
- insert student values(‘S002’,’wangjinglin’,35,’A002’);
- insert subject values(‘SB001’,’math’,’like’);
- insert into SelectSubject values(1,’SB001’,’S001’);
多表查询-多对多关系表
三张表left链接后查询
1
select a.*,b.*,c.*from subject a left join SelectSubject b on a.subjectid=b.subjectid left join student c on b.stuid=c.stuid;
一条记录 left right inner 无差别 多条记录有差别
java端设计类 对应表 实现多表查询和数据存放
- 一对多关系的表的查询 取得的数据 如何存放
- 多对多关系的表查询 取得的数据 如何存放
- 打印输出
类的属性设计
1 | class dormitory{ |
在dao中实现把student 数据放在dormitory对象的Set容器中 并返回dormitory对象
- 简而言之,将三张表链接后查询得到的结果statement.executeQuery()指向resultSet
- 注意:resultSet类似游标的东西,并不存储 数据。
1 | public Dormitry getDormitryById(String dormid) { |
注意:这个时候取出来的数据有dormitory的对象的所有属性值和Set
- 完整源码
- 因为是把dormitory和Student表链接后查询.
- ResultSet所指向的数据有这些字段.
Set只有Student对象 没有其他数据.
- 不能通过student.getDorm().getDormitryid()得到dormotory对象 有方法,但student的属性dormit对象是null.
问题来啦?把dormitory,student,card链接起来,查询数据sql太长怎么写?。
- java端sql语句写的方式.
- 每个字符串后面记得空一格 不然你的sql语句就有错误啦。
1 | StringBuffer buffer=new StringBuffer(); |
查询到的数据字段有如下表
目前只是把resultset的前2个字段赋给相应的对象dormitory 后三个字段赋给Student对象再放入Set容器。
- 当我把第6个字段赋给Student对象报错?因为表有dormitoryid属性 ,类中没有
怎么把ResultSet指向的数据集合的cardid cardtype money字段取出来放在dormitory的属性Set容器的Student对象的属性Set容器中
1 | class DormitoryDao{ |
目前已完成:java端对 dormitor(一对多) student(一对多)card 表的多表查询
- 返回一个寝室的信息
- 该寝室的所有学生信息
- 该寝室所有学生的所有卡的信息
现在完成:subject(多对多)student表 的多表查询
- 数据库的表结构
1 | create table student( |
终端多表查询
1 | select a.*,b.* ,c.*from subject a inner join SelectSubject b on a.subjectid=b.subjectid inner join student c on b.stuid=c.stuid where a.subjectid="SB001"; |
查询结果
java端把数据取出来并存在相应容器Set,Set 和属性中
- 说白啦,就是把一对多 反向做一次
- eg:设计SubjectDao弄到subject对象基本属性和容器属性,查subjectid得到全部。
- 设计StudentDao弄到subject对象基本属性和容器属性,查stuid得到全部。
sql :insert update delete 事务型操作
- select count(*) from table;
- select count(*) as nums from table;//给取得数据起别名。
- select 返回一行(id是主键) 返回多行
- state.executeQuery()//不是executeUpdate()
- ResultSet 指针 没有数据对象 指向多表查询的数据。
- white(ResultSet.next)
- ResultSet.getString(3) 返回 查到的数据 第三列的东西