1. 程式人生 > >Mybatis知識點總結

Mybatis知識點總結

線上腦圖連結:https://mubu.com/doc/2nAWcpI1Y0

  • 元件
    • SqlSessionFactoryBuilder:構造器
    • SqlSessionFactory:工廠介面,由Builder生成
      • 基礎檔案配置,用於配置資料庫資訊等
        • typeAlias:定義元素別名,代表com.learn.ssm.chapter3.pojo.Role類可以使用自定義別名
        • environment:配置使用資料庫的連結資訊
        • dataSource:設定mubatis內部提供連線池的方式
        • mapper:引入自定的對映器配置檔案
      • 對映檔案配置,配置結合業務所實現的SQL語句關係
    • SqlSession:會話,傳送sql,返回結果
      • 核心介面,等同於JDBC裡面的Connection連結物件,
        • 1、獲取Mapper介面
        • 2、傳送SQL個數據庫
        • 3、控制資料庫事務
      • DefaultSqlSession
        • 單執行緒使用
      • SqlSessionManager
        • 多執行緒使用
    • SQL Mapper:對映器,由java和xml檔案構成,構造對映規則,傳送SQL,執行完後返回結果
      • 組成部分
        • java實體物件
        • interface Mapper類
        • xml對映檔案
          • namespace:mapper介面對應的全路徑名稱,例:com.sun.ssm.dao.UserDao
          • resultMap:定義的model實體物件,id=map配置的名稱,type=物件實體的全路徑名稱(com.sun.ssm.model.User),注意id的名稱為下面sql查詢配置所使用到實體型別
            • <id column="id" property="id" jdbcType="BIGINT"/> 設定主鍵型別
            • <result column="user_name" property="userName" jdbcType="VARCHAR"/>
              • column對應資料庫列名
              • property對應實體物件屬性名
              • jdbcType資料庫對映型別
          • select、update、delete、add對應資料庫的增刪改查語句
            • id:對應interface接口裡面的方法名稱
            • resultMap:sql語句返回的型別,對應resultMap設定的id名稱
            • parameterType:如果sql語句需要單個引數,設定請求引數型別
            • #{引數設定}
              • 單個引數:SELECT * FROM t_user WHERE id = #{userId} ---對應---selectUserById(@Param("userId") Long userId);
              • 多個引數:SELECT * FROM t_user WHERE user_email = #{emailOrPhone} AND user_state = #{state} ---對應---selectUserByPhoneOrEmail(@Param("emailOrPhone") String emailOrPhone, @Param("state") Short state);
        • 註解形式實現(此種形式不建議使用)
          • 建立新的介面 interface2
          • @select("select *from tb where id=#{id}")
          • 配置檔案mapper 連結由resource改為class,地址為介面全路徑
    • 生命週期
      • SqlSessionFactoryBuilder用於建立SqlSessionFactory,建立成功後即失效
      • SqlSessionFactory等同於多個數據庫的連線池(整個mysql),在整個mybatis的生命週期中,如果建立多個,則會耗光連線池,造成應用崩潰,所以一般為單例模式,整個應用進行共享
        • SqlSession對應單個數據庫進行的命令操作,如果使用完,則會把連結返還給SqlSessionFactory連線池
          • Mapper由session建立,一個mapper請求對應一個業務處理
  • 配置
    • 配置檔案
      • 配置檔案節點順序不能顛倒
      • 配置檔案xml
        • configuration:根節點
          • properties:屬性
          • settings:設定
          • typeAliases:型別命名
          • typeHandlers:型別處理器
          • objectFactory:物件工廠
          • plugins:外掛
          • environments:配置環境
            • environment:環境變數
              • transactionManager:事務管理器
              • dataSource:資料來源
          • databaseIdProvider:資料庫廠商標識
          • mappers:物件對映器
    • xml 屬性節點介紹
      • properties:屬性(優先順序:程式程式碼>檔案>子元素)
        • property子元素
          • <property name="data.driver" value="com.mysql.jdbc.Driver">
          • <property name="data.url" value="jdbc:mysql://localhost:3306">
          • 然後在dataSource裡面使用<property name="driver" value="${data.driver}">等同於佔位符
        • properties檔案
          • 建立一個jdbc.properties檔案
            • data.url=jdbc:mysql://......
            • data.username=root
          • <properties resource="jdbc.properties">
        • 程式程式碼傳遞
          • 如果需要對字串加密,則在程式裡面讀取配置檔案,然後寫入解密後的內容
      • settings:設定
        • <setting name=“cacheEnabled” value=“true”>是否啟用快取
        • 等等。。。還有很多配置項
        • cacheEnabled--true | false--true(name--value--預設值)該配置影響的所有對映器中配置的快取的全域性開關
        • lazyLoadingEnabled--true | false--false 延遲載入的全域性開關。當開啟時,所有關聯物件都會延遲載入。 特定關聯關係中可通過設定fetchType屬性來覆蓋該項的開關狀態
        • aggressiveLazyLoading--true | false--true 當啟用時,對任意延遲屬性的呼叫會使帶有延遲載入屬性的物件完整載入;反之,每種屬性將會按需載入。
        • multipleResultSetsEnabled--true | false--true 是否允許單一語句返回多結果集(需要相容驅動)。
        • useColumnLabel--true | false--true 使用列標籤代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文件或通過測試這兩種不同的模式來觀察所用驅動的結果。
        • useGeneratedKeys--true | false--false 允許 JDBC 支援自動生成主鍵,需要驅動相容。 如果設定為 true 則這個設定強制使用自動生成主鍵,儘管一些驅動不能相容但仍可正常工作(比如 Derby)。
        • autoMappingBehavior--NONE, PARTIAL, FULL--PARTIAL 指定 MyBatis 應如何自動對映列到欄位或屬性。 NONE 表示取消自動對映;PARTIAL 只會自動對映沒有定義巢狀結果集對映的結果集。 FULL 會自動對映任意複雜的結果集(無論是否巢狀)。
        • defaultExecutorType--SIMPLE, REUSE, BATCH--SIMPLE 配置預設的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。
        • defaultStatementTimeout--int-- 設定超時時間,它決定驅動等待資料庫響應的秒數。
        • safeRowBoundsEnabled--true | false--False允許在巢狀語句中使用分頁(RowBounds)。
        • mapUnderscoreToCamelCase--true | false--False是否開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映。
        • localCacheScope--SESSION | STATEMENT--SESSION MyBatis 利用本地快取機制(Local Cache)防止迴圈引用(circular references)和加速重複巢狀查詢。 預設值為 SESSION,這種情況下會快取一個會話中執行的所有查詢。 若設定值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享資料。
        • jdbcTypeForNull-- 當沒有為引數提供特定的 JDBC 型別時,為空值指定 JDBC 型別。 某些驅動需要指定列的 JDBC 型別,多數情況直接用一般型別即可,比如 NULL、VARCHAR 或 OTHER。
        • lazyLoadTriggerMethods --equals,clone,hashCode,toString 指定哪個物件的方法觸發一次延遲載入。
        • defaultScriptingLanguage--org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver 指定動態 SQL 生成的預設語言。
        • callSettersOnNulls--true | false--false 指定當結果集中值為 null 的時候是否呼叫對映物件的 setter(map 物件時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本型別(int、boolean等)是不能設定成 null 的。
        • logPrefix--指定 MyBatis 增加到日誌名稱的字首 String
        • logImpl--指定 MyBatis 所用日誌的具體實現,未指定時將自動查詢。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
        • proxyFactory--CGLIB | JAVASSIST--JAVASSIST指定 Mybatis 建立具有延遲載入能力的物件所用到的代理工具。
      • typeAliases:別名
        • 可以用簡寫的形式自定義型別名稱
          • 比如:int--Integer(mybits--java)
          • 使用程式碼進行註冊
        • 自定義別名
          • xml:<typeAlias alias="user" type="類的全稱地址">
          • 掃描形式:<package name="需要掃描的包"> 如果當前包裡面有2個類,都會自動轉成pacal命名法的別名(首字母小寫,其餘大寫)
          • 程式碼裡面可以針對類設定 在class類上面增加 @Alias("sun"),則在掃描時,名稱為自定義名稱
      • typeHandler:型別轉換器
        • 用於承擔 資料庫與java之間的型別轉換,jdbcType--javaType,mybatis會進行自動處理
        • 自定義Handler(可以用於列舉轉int,等等)
          • 整合baseTypeHandler介面,自己實現4個方法
          • 在配置檔案中使用
            • 在全域性xml使用:<typeHandler jdbcType="資料庫型別" javaType="java型別" jandler="handler實現類的包名全路徑">
            • 在mapper對映xml檔案使用:<resule property="java型別" colum="資料庫型別" typeHandler="handler實現類的包名全路徑">
          • 如果自定義處理類過多,使用掃描包形式載入
            • <package name="包的全路徑">
            • 此種形式無法定義型別對映,可以在自定義實現類class上面使用註解形式新增對映,如:@MappedTypes(String.class) @MappedjdbcTypes(jdbcType.VARCHAR)
      • objectFactory:物件工廠
        • 一般使用預設就好,建立結果集時,mybatis會建立結果集的例項,用於返回給使用者。
      • plugins:外掛
      • environments:執行環境
        • 用於配置資料庫的連結資訊
        • transactionManager:事務管理器
          • JdbcTransaction,以jdbc的事務形式進行處理
          • ManagedTransaction,使用mybits自定義的物件事務處理,提交和回滾不進行操作,把事務交給容器處理,預設會關閉連結。
          • dataSource
            • 分為3種形式連結資料庫,可以進行同時配置<dataSource type="POOLED">...
            • UNPOOLED
              • 使用非連線池形式,每次請求,建立一個新的連線
            • POOLED
              • 使用連線池形式,節省資源,可以設定最大連線數
              • poolMaxmumActiveConnections:任意時間活躍的連結,預設10
              • poolMaxmumIdleConnections:任意時間空閒的連線數
              • poolMaxmumCheckoutTime:池中檢出的時間,預設20000(20秒)
              • poolTimeToWait:如果獲取連結時間過長,會列印狀態日誌
              • poolPingQuery:偵測查詢,用於判斷資料庫是否可以正常查詢
              • poolPingEnabled:是否啟用偵測查詢,預設不開啟(如果開啟,請設定一個效率非常快的SQL,例如 select 1)
              • poolPingConnectionNotUsedFor:配置偵測查詢的頻度
            • JNDI
      • databaseIdProvider:資料庫廠商標識
        • 用於配置支援多種資料庫操作
        • <databaseIdProvider type="DB_VENDOR"><property name="MYSQL" value="mysql" /><property name="Oracle" value="oracle" /><property name="DB2" value="db2" /></databaseIdProvider >
        • 配置完成之後,在Mapper對映器裡面 對sql語句進行不同資料的查詢切換操作,例如<select id="aa" ... datanaseId="oracle">或者<select id="aa" ... datanaseId="mysql">
      • mappers :物件對映器
        • 先編寫介面程式碼,建立對應增刪改查介面,對映檔案裡面首行<mapper>標籤會使用namespace定義介面程式碼全路徑,下面設定sql查詢語句(select、delete、....)
        • 引入方式:
          • 檔案引入:<mapper resource="xml全路徑">
          • 包名引入:<package name="包全路徑">
          • 類註冊引入:<mapper class="對映介面類的全路徑">
          • userMapper.xml:暫時不考慮
  • 對映器
    • 一個對映xml對應一個介面型別,然後對應物件
    • select
      • 預設sql返回的列名需要和物件屬性一一對應上,例如,role_name對應roleName,按照駝峰命名法則對映,如果列名直接使用role_name as roleName形式返回,則不用使用預設駝峰對映
      • xml節點屬性配置
        • id:方法名稱,供Mybatis使用,如果相同名稱空間id不唯一,則會報錯
        • parameterTyppe:傳遞引數型別,可以是int、string、或者類
          • List<map>:介面類使用map,傳遞查詢引數,類似.net的HashTable,不方便閱讀維護
          • @Param("佔位符名稱1"):介面類也可以使用多個Param進行傳遞,xml對映檔案可以直接使用變數,例如:<select id="findName" resultType="返回物件類">select id,role_Name as roleName,create_Time as createTime from tb_User where role_Name like concat('%',#{roleName},'%') and id=#{id}</select>,引數過多時不方便使用
          • 使用javaBean形式(java class類物件):傳入一個class型別作用請求,paramType="類的全路徑"
          • 混合使用:javaBean與Param同時使用。@Param("user") User user,@Param("name") Name name,在xml佔位符中則為#{user.age}
        • resultType:返回結果型別,可以是int、string、或者類
        • resultMap:返回結果自定義使用,比如說使用typeHandler
          • xml:對映配置檔案上方 會使用resultMap定義一個數據庫查詢型別與POJO物件的對映配置節點,下方select查詢語句中使用resultMap="上方定義節點的id屬性的名稱"
          • 自定義Handler:
        • flushCache:呼叫完SQL之後,是否清空查詢的本地快取和二級快取,預設false,不進行清理
        • useCache:是否啟動二級快取,預設true,啟用二級快取
        • timeout:設定當前語句查詢超時時間
        • fetchSize:獲取記錄返回總條數,如果設定100,最大返回100條資料
        • statementType:設定mybatis使用JDBC的哪種Statement工作,預設PREPARED,(個人不太理解)
        • resultSetType:
        • databaseId:使用多種資料庫引擎支援的ID
        • resultOrdered:
        • resultSets:使用於多個結果集情況,一次查詢返回多個dataTable表格資料
      • RowBounds:myBatis內建分頁類物件。在DAO介面類中,定義RowBounds請求引數,xml不需要進行配置,因為已經內建在sqlSession中。(因為他的原理是先把sql資料全部查出來在記憶體裡面進行分頁,大資料量並不合適)
    • insert
      • xml節點屬性配置(大部分同select相同,只記錄不同項)
        • useGeneratedKeys:主鍵回填,是否啟用使用jdbc裡面的同名方法獲取內部生成的主鍵(類似sqlserver自增主鍵),預設false(啟用之後,keyProperty與keyColumn選一個)。使用方法:<insert ..... useGeneratedKeys="true" keyProperty="id">,意思是-如果插入完資料,則會回填keyProperty設定的屬性值
        • keyProperty:會根據useGeneratedKeys的返回值,標記一個屬性返回值,預設不啟用
        • keyColumn:不能和keyProperty同時使用
      • xml節點內部配置:
        • selectKey:自定義主鍵,可以根據自定義的設定規則,生成主鍵值,進行回填和插入,例如:下圖
        • 結構層級:insert → selectKey(keyProperty:回填主鍵名稱,resultType:回填值型別,order:是插入語句執行前使用還是執行後使用,預設BEFORE),設定了order之後,這樣在insert語句真正執行前,id主鍵會按照自定義的規則生成,然後插入到對應列中
    • update、delete(比較簡單,一般使用單個引數或者javaBean引數形式,返回結果為int型影響行數)
    • sql:允許定義一部分sql,在各個地方引用
      • 在mapper根節點下,設定sql節點,裡面包含通用變數,則在select或者insert等操作時統一呼叫,例如:<sql id="fileds"> id,name,age</sql>,在select語句裡面,<select id="findOne" .....>select <include refid="fileds" /> fom User </select>,insert 同理。
      • 節點還支援變數傳遞 <sql id="fileds"> ${U}.id,${U}.name,${U}.age</sql>,整體使用:<select id="findOne" .....> select <include refid="fileds"> <propety name="U" value="tb" /> </include> from TbUser as tb</select>。(refid的值為自定義sql的id,裡面propety節點代表屬性內容, name值為自定義sql使用佔位符變數,value值為 查詢語句中表的別名,name與value為對映關係)
    • resultMap:描述資料庫結果集對映到的物件
      • xml節點
        • resultMap
          • constructor:適用於物件裡面帶引數的建構函式
            • idArg
            • arg
          • id
          • result
          • association
          • collection
          • discriminator
            • case
      • 節點註釋
        • resultMap:type屬性對應物件的型別
          • id:設定對應的主鍵
          • result:欄位對映節點,例如:<result property="物件屬性" column="資料庫列名" />
          • association:級聯查詢,適用於一對一的情況
            • 例子:<association property="當前物件子物件的class型別" column="對應關聯屬性的列名" select="要呼叫其他介面類的方法全路徑" />
            • property:通過呼叫select對應的介面方法,返回的物件型別
            • column:子查詢所需要傳入的父查詢ID,例如:select (select top 1 name from CHIRLD as b where b.pid=a.id),* from PARENT as A,等同於傳入子查詢的a.id的功能
          • collection:級聯查詢,適用於一對多的情況
            • 例子:<collection property="當前物件子物件的class型別" column="對應關聯屬性的列名" select="要呼叫其他介面類的方法全路徑" />
            • 節點屬性等同於association
          • discriminator:級聯查詢,選擇器查詢,根據不同的值呼叫不用的查詢器
            • 例子:<discriminator javaType="選擇列的資料型別" column="選擇列的名稱" > <case value="如果是當前值,1" resultMap="當前頁面其他查詢器ID1" /><case value="如果是當前值,2" resultMap="當前頁面其他查詢器ID2" /> </discriminator>,當前對映xml檔案會存在多個resultMap節點,其他從節點:<resultMap type="返回物件型別的全路徑" id="當前頁面其他查詢器ID1" extends="繼承與哪個resultMap(為主節點ID)"> <association property="返回子物件class型別(首字母小寫)" column="對應關聯屬性的列名" select="要呼叫其他介面類的方法全路徑" /></resultMap>,這樣通過不同的case 則會呼叫不同型別的介面查詢。
            • javaType:用於指定傳入列的型別
            • column:傳入列的列名
            • 還需要case子節點
              • value:具體值
              • resultMap:其他resultMap從節點的ID
            • 還需要指定其他從resultMap節點
              • type:返回物件型別
              • id:查詢器id
              • extends:繼承於哪個resultMap(為resultMap主節點ID)
              • 相關推薦

                Mybatis知識點總結

                線上腦圖連結:https://mubu.com/doc/2nAWcpI1Y0 元件 SqlSessionFactoryBuilder:構造器SqlSessionFactory:工廠介面,由Build

                Mybatis核心知識點總結(一)

                nfa 邏輯 efault Go 不常用 pojo code ive 圖片 一、初識Mybatis框架   mybatis是一個持久層的框架,是apache下的頂級項目。   mybatis托管到goolecode下,再後來托管到github下(https://github

                kylin調優,專案中錯誤總結知識點總結,kylin jdbc driver + 資料庫連線池druid + Mybatis專案中的整合,shell指令碼執行kylin restapi 案例

                關於本篇文章的說明: 本篇文章為筆者辛苦勞作用了一整天總結出來的文件,大家閱讀轉發的時候請不要吝嗇寫上筆者:塗作權 和 原文地址。 由於筆者所在環境沒有人用過kylin,筆者也是自學官網,閱讀書籍 將kylin用於實際專案,期間遇到了很多很多關於kylin使用的問題。為了讓後面的人在

                Mybatis知識點回顧/總結

                一:mybatis基本工作流程                          1.sqlMapConfig.xml:mybatis全域性配置檔案,配置了資料來源,事務等mybatis的執行環境,

                MyBatis知識點整理

                for 表示 sql {} 引號 構建 bsp user lose 1.Mybatis的查詢中可以這樣寫: 如 ID IN (${IDS})在IDS外面拼接了一個(),同樣可以拼接%或者單引號2.Mybatis的${}和#{}的區別: ${}的值直接顯示在生成的sql語句

                PHPExcel所遇到問題的知識點總結

                tor 沒有 share [] 計算 針對 dex data 行數 工作中進行excel的時候遇到了兩個問題, 1.excel表中列值過大,由於沒有進行特殊處理,程序沒法正常運行; 2.列值中含有日期格式的文本,不能正確讀取; 所以通過網絡搜索,並解決了問題,記錄一下,以備

                PHP面向對象知識點總結

                ace extend face 技術 space this 實例 mes 代碼 1、$this是什麽 當前類實例化的對象 2、訪問對象中的成員 對象->成員 3、構造方法 通常用來初始化對象的屬性,不用把屬性寫死,不同的對象就有了不同的屬性 4、get、s

                交叉編譯知識點總結

                搜索 參考 install pri 庫文件 sta rar nsis blog 參考鏈接: http://www.cppblog.com/runsisi/archive/2012/10/08/193027.html gcc 搜索路徑: 1、 gcc -print-

                js事件相關知識點總結

                模型 em1 detach 事件偵聽 包含 ring 分享 target 上傳 HTML頁面是怎樣實現交互的? 2017-05-22 js事件之事件流: 事件流原理圖:事件流是從window開始,最後回到window的一個過程,分為三個階段(1~5)捕獲過程、(5~6)

                css中小知識點總結

                就會 input 如果 con 標註 標記 獲得 出現 continue rgba:即rgb+a, a為圖片透明度,a範圍是0~1,越小就表示越透明 :hover 即鼠標懸停時改變樣式,不僅僅能用在a元素上。 <form>標簽表示向瀏覽器提交表單,一般會包裹著

                [rctf](web)rcdn 解題分析,知識點總結

                數據庫 方法 code dom arc 比賽 start 關閉 學習 比賽平臺關閉了,沒有截圖,見諒。 解題思路流程: 分析網站結構,看源碼,元素審計。發現以下信息。 要得到flag要獲得一個pro cdn pro 子域名長度為3到6個字符 存在一個提交ticke頁面

                javascript知識點總結

                ava javascrip ons all 一點 http 實例 www 恢復 ---恢復內容開始--- js中的六種繼承方式: http://www.cnblogs.com/ayqy/p/4471638.html 這篇博客總結的比較清楚了。要註意一點,來自原型對象的引用

                SpringMvc和Mybatis整合總結

                web images bean 技術 數據庫 tro control 自己 alt 1.先配置mybatis,測試讀取數據庫 2.自己測試數據 3.配置spring和springmvc, PS:配置web.xml,這樣就不用getBean了 4.配置Controlle

                JavaScript知識點總結之如何提高性能

                前端開發 原型 操作 tag head 取數 理解 定義變量 創建 先給大家鞏固下javascript基本語法: javascript基本語法 定義變量統一用var關鍵字 語法:var 變量名稱=變量值 標示符:①、由字母數字下劃線構成 不能以數字開頭 不能是關鍵字 嚴格區

                react native 知識點總結(一)

                修改 ltp 組件 改變 set 覆蓋 sta 一個 個數 一、關於react native 版本的升級 參照文檔:http://reactnative.cn/docs/0.45/upgrading.html react-native -v

                React Native細節知識點總結<一>

                idm tdi 刷新 循環 chan filelist sse inpu function 1.propTypes: static propTypes = { name:PropTypes.string, ID:PropTypes.num

                MyBatis使用總結+整合Spring

                hal bench his nic sig cti chan ive sha Java%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E6%97%A5%E5%B8%B8%E2%80%94%E2%80%94%20%E3%80%8A%E7%BC%96%

                鳥哥Linux私房菜知識點總結3到5章

                centos 啟動 學會 運行 lin inux 格式 開機流程 十分鐘 感覺自己對Linux的理解一直不夠,所以近期翻看了一本《鳥哥的Linux私房菜》。這是一本基礎的書,萬丈高樓平地起,會的不多但能夠學。這是我整理的一些知識點,盡管非常基礎。希望和大家共同交流。

                知識點總結

                ace hibernate 三層 知識 lib ioc 相關 發展 業務邏輯層 軟件151 余曉偉 JAVA的結構框架 JavaEE架構理解 三層結構:在C/S或B/S架構的應用中,為了提供程序的可擴展性,一般需要將表示與業務邏輯分離,業務邏輯和數據處理

                python Django知識點總結

                als 數據行 刪除命令 年齡 cdb resp 之前 false word python Django知識點總結 一、Django創建項目: CMD 終端:Django_admin startproject sitename(文件名) 其他常用命令: 其他常用命令: