1. 程式人生 > 資訊 >《GTA 6》有望在遊戲中用虛擬貨幣交易、炒股,但與現實市場無關

《GTA 6》有望在遊戲中用虛擬貨幣交易、炒股,但與現實市場無關

表與表之間 一對多 ,多對一的 關係

  1. 按結果巢狀處理 ------- sql會複雜些 -----------相對簡單
  2. 按查詢巢狀處理 -------- 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) ;

開始學習 資料表 與表之間的關係

  1. 匯入 lombok jar包 , 具體用不用因人而異, 偷懶可以使用lombok 外掛,
  2. 匯入mybatis 的工具類, 具體就部落格就不寫了。 以下就是mybatis 的一些配置檔案, 太繁瑣,太熟了,這裡就不寫了 mybatis-config.xml
  3. 建立 資料庫實體類 對映 ORM stu類 and teacher類
  4. 搭建好開發環境, 寫一個簡單的sql 執行下, 測試程式是否有問題。

業務需求 --- 編寫介面

mapper介面

select s.id ,s.name,t.name from stu s,teacher t where s.tid=t.id;

這裡的思維和以前不一致, 顯然這裡是查詢兩張表的資料, 那麼這裡的返回值型別,怎麼定義?

思路: 按照查詢巢狀處理

  1. 先查詢 stu 的所有資訊;
  2. 再根據學生表的 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的可讀性,儘量保證通俗易懂

  1. 注意一對多和多對一中,屬性名和欄位的問題
    1. 使用lo4j 日誌

面試須知

mysql引擎

innoDB 底層原理

索引

索引優化