myBatis——註解,#{}與${},resultMap的使用

luerdao_發表於2020-12-07

註解開發

註解開發不需要使用mapper.xml檔案進行對映 直接繫結類

<mappers>
    <mapper class="com.luerdao.dao.UserMapper"></mapper>
</mappers>
@Select("select * from user")
List<User> getAllUser();
@Select("select * from user where id =#{id}")
User selectUserByID(int id);
@Insert("insert into user(id,name,pwd) values(#{id},#{name},#{pwd})")
int addUser(User user);
@Delete("delete from user where id = #{id}")
int deleteUser(@Param("id")int id);

@Param註解用於給方法引數起一個名字。以下是總結的使用原則:

  • 在方法只接受一個引數的情況下,可以不使用@Param。
  • 在方法接受多個引數的情況下,建議一定要使用@Param註解給引數命名。
  • 如果引數是 JavaBean , 則不能使用@Param。
  • 不使用@Param註解時,引數只能有一個,並且是Javabean。

關於#與$的區別

#{}相當於JDBC中的PrepareStatement

${} 則是沒有進行預編譯的 有注入問題

resultMap

在這裡插入圖片描述

資料庫中的欄位名

在這裡插入圖片描述

類中的欄位名

在這裡插入圖片描述

查詢出來的結果(pwd和類中欄位不對應

解決方案

一:起別名
在這裡插入圖片描述

二:使用resulMap(推薦使用

將資料庫中的column:pwd對應到類中的屬性名property:password

在這裡插入圖片描述

多對一處理

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

多個學生關聯到一個老師

這時直接查詢的話 select *from student
F:\mdPicture\image-20201206233037784.png

查詢不出來teacher 因為teacher在另一張表中

方式一:按查詢巢狀處理

需求:獲取所有學生及對應老師的資訊
思路:

      1. 獲取所有學生的資訊
         根據獲取的學生資訊的老師ID->獲取該老師的資訊
                   3. 思考問題,這樣學生的結果集中應該包含老師,該如何處理呢,資料庫中我們一般使用關聯查詢?
                4. 做一個結果集對映:StudentTeacher
                5. StudentTeacher結果集的型別為 Student
                6. 學生中老師的屬性為teacher,對應資料庫中為tid。
                   多個 [1,...)學生關聯一個老師=> 一對一,一對多
                7. 檢視官網找到:**association – 一個複雜型別的關聯;使用它來處理關聯查詢**
<select id="getStudent" resultMap="STMap">
    select *from student
</select>

<resultMap id="STMap" type="Student">
    <association property="teacher" column="tid" javaType="Teacher" select="selectT"></association>
</resultMap>

<select id="selectT" resultType="Teacher">
    select *from teacher where id =#{tid}
</select>

association property=“teacher” column="tid"中的tid傳遞給下面的select id=“selectT” 查詢中,如果是隻有一個值得話#{}名字可以隨便填,建議與上面對應

F:\mdPicture\image-20201206234048164.png

總結:思路就是先把學生表查詢出來,然後再通過查詢出來的學生表中的tid去老師表中查詢對應的老師,通過resultMap來實現

方式二:按結果巢狀處理

<select id="getStudent2" resultMap="STMap2">
     select s.id, s.name , t.name tname
        from student s,teacher t
        where s.tid = t.id
</select>

<resultMap id="STMap2" type="Student">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="teacher" javaType="Teacher">
        <result property="name" column="tname"></result>
    </association>
</resultMap>

在這裡插入圖片描述

總結:此方法很好理解,按照資料庫的查詢語法來寫,查詢出結果後我們通過結果集的對映來將Teacher表中的屬性給對映到tname上

property填屬性名,Type,javaType填類名,resultMap隨便取名字,column資料庫欄位名

一對多

和多對一差不多 都是兩種處理辦法,按查詢或者按結果處理,這裡就不再贅述直接放測試用例
在這裡插入圖片描述

在這裡插入圖片描述

按結果處理

<select id="getTeacher" resultMap="TSMap">
    select t.id tid,t.name tname,s.id sid,s.name sname
    from teacher t ,student s
    where s.tid =t.id and t.id=#{id}
</select>
<resultMap id="TSMap" type="Teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
    <collection property="students" ofType="Student">
        <result property="name" column="sname"></result>
        <result property="name" column="sname" />
        <result property="tid" column="tid" />
    </collection>
</resultMap>

按查詢處理

<select id="getTeacher2" resultMap="TSMap2">
    select *from teacher where id=#{id}
</select>
<resultMap id="TSMap2" type="Teacher">
    <result column="id" property="id"></result>
    <collection property="students" ofType="Students" column="id" select="selectStudentById"></collection>
</resultMap>

<select id="selectStudentById" resultType="Student">
    select * from student where tid=#{id}
</select>

歡迎訪問我的部落格

相關文章