《GTA 6》有望在遊戲中用虛擬貨幣交易、炒股,但與現實市場無關
阿新 • • 發佈:2021-06-09
表與表之間 一對多 ,多對一的 關係
- 按結果巢狀處理 ------- sql會複雜些 -----------相對簡單
- 按查詢巢狀處理 -------- sql 會好理解----------- resultMap 結果集隱射會痛苦寫
teacher 表
teacher | CREATE TABLE `teacher` ( `id` int(10) NOT NULL, `name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
insert into teacher (`id`,`name`) values (1,'秦老師');
insert into teacher(`id`,`name`) values (2,'林老師')
insert into teacher(`id`,`name`) values (3,'劉老師')
stu 表
CREATE TABLE `stu` ( `id` int(10) NOT NULL, `name` varchar(30) NOT NULL, `tid` int(10) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`), KEY `kftid` (`tid`), CONSTRAINT `kftid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
insert into stu (`id`,`name`,`tid`) values (1,'小紅',1) ;
insert into stu (`id`,`name`,`tid`) values (1,'小呂',1) ;
insert into stu (`id`,`name`,`tid`) values (1,'小白',1) ;
insert into stu (`id`,`name`,`tid`) values (1,'小黑',1) ;
insert into stu (`id`,`name`,`tid`) values (1,'小紫',1) ;
開始學習 資料表 與表之間的關係
- 匯入 lombok jar包 , 具體用不用因人而異, 偷懶可以使用lombok 外掛,
- 匯入mybatis 的工具類, 具體就部落格就不寫了。 以下就是mybatis 的一些配置檔案, 太繁瑣,太熟了,這裡就不寫了 mybatis-config.xml
- 建立 資料庫實體類 對映 ORM stu類 and teacher類
- 搭建好開發環境, 寫一個簡單的sql 執行下, 測試程式是否有問題。
業務需求 --- 編寫介面
mapper介面
select s.id ,s.name,t.name from stu s,teacher t where s.tid=t.id;
這裡的思維和以前不一致, 顯然這裡是查詢兩張表的資料, 那麼這裡的返回值型別,怎麼定義?
思路: 按照查詢巢狀處理
- 先查詢 stu 的所有資訊;
- 再根據學生表的 tid 指向 老師表的 id ;
由於teacher是一個物件, 對應的資料庫欄位是'tid' , 是個物件就應該有個型別, 在往裡面巢狀 sql
<mapper namespace="com.lsq.Mapper.StuMapper"> <!--繫結介面-->
<!--查詢所有的學生-->
<select id="QueryStu" resultMap="StudentTeacher">
SELECT * from mybatis.stu
</select>
<resultMap id="StudentTeacher" type="stu">
<result property="id" column="id"/>
<result property="name" column="name"/>
<association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>
<!--查詢所有的老師-->
<select id="getTeacher" resultType="teacher">
SELECT * FROM mybatis.teacher WHERE id=#{id}
</select>
</mapper>
按照結果巢狀處理
<!--按照結果巢狀處理-->
<select id="QueryStu2" resultMap="stu2">
SELECT s.id sid ,s.name sname ,t.name tname
FROM stu s ,teacher t
WHERE s.tid=t.id
</select>
<resultMap id="stu2" type="stu">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
一對多關係 ,
一個老師擁有多個學生
teacher.class
private int id; //老師工號id
private String name; //老師姓名
// 一對多 關係 一個老師擁有多個學生
private List<Stu> stus;
stu.class
private int id; //學生id
private String name; //學生姓名
private int tid; //關聯老師表 外來鍵id
TeacherMapper 查詢指定老師 的 學生及其老師資訊
Teacher getteacher(@param"tid" int id);
TeacherMapper.xml
<select id="getteacher" resultMap="map">
select s.id sid , s.name sname ,t.name tname , t.id tid
from stu s , teacher t
where s.tid=t.id and t.id=#{tid}
<select>
<resultMap id="map" type="teacher">
<result property="id" column="tid" />
<result property="name" column="tname"/>
<!-- 集合用 collection -->
<collection property="stus" ofType="stu">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
測試
// 查詢指定老師 id 的所有學生及老師的資訊
@Test
public void test2(){
SqlSession sqlSession = MyabtisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(2);
System.out.println(teacher);
sqlSession.close();
}
子查詢 方式
teacherMapper
Teacher getteacher2(@param"tid" int id);
TeacherMapper.xml
<!--巢狀語句查詢 -->
<select id="getTeacher2" resultMap="map2">
select * from mybatis.teacher where id = #{tid}
</select>
<resultMap id="map2" type="teacher">
<result property="id" column="id"/> <這兩個沒有變可以省略>
<result property="name" column="name"/>
<collection property="stus" javaType="ArrayList" ofType="stu" select="stu2" column="id"/>
</resultMap>
<select id="stu2" resultType="stu">
SELECT * FROM mybatis.stu WHERE tid=#{id}
</select>
小結
關聯
集合
javaType 用來指定實體類中屬性的型別
ofType 用來指定對映到list 或者集合中的pojo型別, 泛型中的約束型別
1.保證sql的可讀性,儘量保證通俗易懂
- 注意一對多和多對一中,屬性名和欄位的問題
- 使用lo4j 日誌
面試須知
mysql引擎
innoDB 底層原理
索引
索引優化