mybatis相關(持續更新)

1.mybatis編程步驟

  1. 建立SqlSessionFactory對象
  2. 經過SqlSessionFactory獲取sqlSession對象
  3. 經過sqlSession獲取Mapper的代理對象
  4. 經過mapper的代理對象,執行數據庫操做
  5. 執行成功,則使用sqlsession提交事務
  6. 執行失敗,則使用sqlsession回滾事務
  7. 最終,關閉會話

2.#{}和${}的區別

${}是properties文件中的變量佔位符,它能夠用於xml標籤屬性值和sql內部,屬於字符串替換。html

<!-- ${driver} 會被替換爲 com.mysql.jdbc.driver -->
<dataSource type="UNPOOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
</dataSource>

${}也能夠對傳遞進來的參數原樣拼接在sql中。實際場景中,不推薦使用${},由於會有sql注入的風險。mysql


#{}是sql的參數佔位符,mybatis會將sql中的#{}替換爲?號,在sql執行前會使用PreparedStatement的參數設置方法,按序給sql的?號佔位符設置參數。因此#{}是預編譯處理,能夠有效防止sql注入,提升系統安全性。sql

3.實體類的屬性名和表中的字段名不同,如何處理

  • 第一種:經過在查詢的sql語句中定義字段別名,讓字段名的別名和實體類的屬性一致
  • 第二種:在大多數場景下,數據庫的字段名和實體類的屬性名的差別,主要是一種是下劃線,一種是駝峯風格。這種狀況,能夠直接配置以下,實現自動的下劃線轉駝峯的功能。
<setting name="mapUnderscoreToCamelCase" value="true" />
  • 第三種,經過<resultMap>來映射字段名和實體類屬性名的一一對應關係。

4.mybatis的xml映射文件中,除了常見的select|insert|update|delete標籤外,還有哪些標籤

參考mybatis中文文檔數據庫

  • cache -對給定命名空間的緩存配置
  • cache-ref 對其餘命名空間緩存配置的引用
  • resultMap 用來描述如何從數據庫結果集中來加載對象
  • sql 可被其餘語句引用的可重用語句塊

5.mysql的動態sql有哪些

參考mybatis中文文檔編程

<if/> 、<where/>、 <set/>、 <choose/>、 <foreach/>、<when/>、 <otherwise/>、<trim/>緩存

6.如何獲取自動生成的主鍵

不一樣的數據庫,獲取自動生成的主鍵的方式是不一樣的。mysql有兩種方式,代碼以下安全

// 方式一,使用 useGeneratedKeys + keyProperty 屬性
<insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user(name, pswd)
    VALUE (#{name}, #{pswd})
</insert>
    
// 方式二,使用 `<selectKey />` 標籤
<insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id">
    <selectKey keyProperty="id" resultType="long" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
        
    INSERT INTO user(name, pswd)
    VALUE (#{name}, #{pswd})
</insert>
相關文章
相關標籤/搜索