mybatis-04【小結】

mybatis-04【小結】java

一、Mybatis 中 # 和 $ 的區別?
#至關於對數據 加上 雙引號,$至關於直接顯示數據
1)#將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。
  如:order by #user_id#,若是傳入的值是111,那麼解析成 sql 時的值爲 order by "111", 若是傳入的值是 id,則解析成的 sql 爲 order by "id".
2)$將傳入的數據直接顯示生成在 sql 中。
  如:order by $user_id$,若是傳入的值是 111,那麼解析成 sql 時的值爲order by user_id, 若是傳入的值是 id,則解析成的 sql 爲 order by id.
3) #方式可以很大程度防止 sql 注入。
4)$方式沒法防止 Sql 注入。
5)$方式通常用於傳入數據庫對象,例如傳入表名.
6)通常能用#的就別用$.sql

二、mybatis執行過程?
1)配置mybatis的配置文件,mybatis-cfg.xml
2)經過配置文件,加載mybatis運行環境,建立SqlSessionFactory會話工廠SqlSessionFactory在實際使用時按單例方式。
3)經過SqlSessionFactory建立SqlSession,SqlSession是一個面向用戶接口(提供操做數據庫方法),實現對象是線程不安全的,建議sqlSession應用場合在方法體內。
4)調用sqlSession的方法去操做數據。若是須要提交事務,須要執行SqlSession的commit()方法。
5)釋放資源,關閉 session.close()數據庫

三、Mybatis與Hibernate比較
1)MyBatis能夠進行更爲細緻的SQL優化,能夠減小查詢字段。
2)MyBatis容易掌握,而Hibernate門檻較高。
3)Hibernate功能強大,數據庫無關性好,O/R映射能力強,須要代碼量少,開發速度快編程

四、Mybatis緩存機制【MyBatis有兩級緩存】
  一級緩存是SqlSession級別的緩存,他的做用域是同一個SqlSession,在同一個sqlSession中執行相同的Sql語句,第一次執行完畢的會將結果集寫到緩存中,第二次就會從緩存中獲取數據;
  二級緩存是mapper級別的緩存,做用域是mapper的同一個namespace,多個SqlSession去操做同一個Mapper的sql語句,多個SqlSession能夠共用二級緩存,二級緩存是跨SqlSession的。
  Mybatis默認開啓一級緩存,沒有開啓二級緩存,二級緩存須要在xml配置中手動配置開啓。
  在全局配置文件 mybatis-cfg.xml 開啓緩存
  <!--開啓二級緩存 -->
  <settings>
    <setting name="cacheEnabled" value="true"/>
  </settings>
五、JDBC 編程有哪些不足之處,MyBatis 是如何解決?
1)數據庫連接建立、釋放頻繁形成系統資源浪費從而影響系統性能,若是使用數據庫連接池可解決此問題。
  解決:在 SqlMapConfig.xml 中配置數據連接池,使用鏈接池管理數據庫連接。
2) Sql 語句寫在代碼中形成代碼不易維護,實際應用 sql 變化的可能較大,sql 變更須要改變 java 代碼。
  解決:將 Sql 語句配置在 XXXXmapper.xml 文件中與 java 代碼分離。
3)向 sql 語句傳參數麻煩,由於 sql 語句的 where 條件不必定,可能多也可能少,佔位符須要和參數一一對應。
  解決: Mybatis 自動將 java 對象映射至 sql 語句
4)對結果集解析麻煩,sql 變化致使解析代碼變化,且解析前須要遍歷,若是能將數據庫記錄封裝成 pojo 對象解析比較方便。
  解決:Mybatis 自動將 sql 執行結果映射至 java 對象。緩存

六、使用 MyBatis 的 mapper 接口調用時有哪些要求?
1)Mapper 接口方法名和 mapper.xml 中定義的每一個 sql 的 id 相同
2) Mapper 接口方法的輸入參數類型和 mapper.xml 中定義的每一個 sql 的 parameterType 的類型相同
3)Mapper 接口方法的輸出參數類型和 mapper.xml 中定義的每一個 sql 的 resultType 的類型相同
4)Mapper.xml 文件中的 namespace 便是 mapper 接口的類路徑安全

相關文章
相關標籤/搜索