Mybatis(1)

1.mybatis 單獨的項目需要的jar包

asm-3.3.1.jar:操作Javaj字節碼的類庫

cglib-2.2.2.jar:用來動態集成Java類或實現接口

commons-logging-1.1.1.jar:用於通用日誌處理

javassist-3.17.1-GA.jar:分析、編輯和創建Java字節碼的類庫

log4j-1.2.17.jar:日誌系統

slf4j-api-1.7.5.jar:日誌系統的封裝,對外提供統一的API接口

slf4j-log4j12-1.7.5.jar:slf4j對log4j的對應驅動,完成slf4j綁定log4j

mybatis-3.2.2.jar

mysql-connector-java-5.1.7-bin.jar/3

 

添加新節點:archetypeCatalog=internal

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTDConfig 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="jdbc.properties"></properties>
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="true"></setting>
    </settings>
   <!-- <settings>
        <setting name="autoMappingBehavior" value="NONE"/>
    </settings>-->
    <typeAliases>
    <package name="cn.alexander.entity"></package>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
      <!--  <mapper resource="cn/alexander/dao/IStudentDAO.xml"/>-->
        <package name="cn.alexander.dao"></package>
    </mappers>
</configuration>

2.mybatis架構

 

1.mybatis配置       

  SqlMapConfig.xml,此文件作爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。     

   mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。

2.通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠

由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。

3.mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。

4.Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。

5.Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。

6.Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。

3.

  1. #{}和${}

           #{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設置值,自動進行java類型和jdbc類型轉換。#{}可             以有效防止sql注入。 #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括號中可以是             value或其它名稱。

${}表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value

2.parameterType和resultType

       parameterType:指定輸入參數類型,mybatis通過ognl從輸入對象中獲取參數值拼接在sql中。

       resultType:指定輸出結果類型,mybatis將sql查詢結果的一行記錄數據映射爲resultType指定類型的對象。如果有多條數                                 據,則分別進行映射,並把對象放到容器List中

3.selectOne和selectList

       selectOne查詢一條記錄,如果使用selectOne查詢多條記錄則拋出異常:

          org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3

           at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)

      selectList可以查詢一條或多條記錄。

4.

Mybatis解決jdbc編程的問題

    1.數據庫連接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫連接池可解決此問題。

解決:在SqlMapConfig.xml中配置數據連接池,使用連接池管理數據庫鏈接。

     2.Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。

解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。

     3.向sql語句傳參數麻煩,因爲sql語句的where條件不一定,可能多也可能少,佔位符需要和參數一一對應。

解決:Mybatis自動將java對象映射至sql語句,通過statement中的parameterType定義輸入參數的類型。

    4.對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。

解決:Mybatis自動將sql執行結果映射至java對象,通過statement中的resultType定義輸出結果的類型。

 

5.SqlSession的使用範圍

SqlSession中封裝了對數據庫的操作,如:查詢、插入、更新、刪除等。

SqlSession通過SqlSessionFactory創建。

SqlSessionFactory是通過SqlSessionFactoryBuilder進行創建。

 

 

5.1SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用於創建SqlSessionFacoty,SqlSessionFacoty一旦創建完成就不需要SqlSessionFactoryBuilder了,因爲SqlSession是通過SqlSessionFactory創建的。所以可以將SqlSessionFactoryBuilder當成一個工具類使用,最佳使用範圍是方法範圍即方法體內局部變量。

 

 

5.2SqlSessionFactory

SqlSessionFactory是一個接口,接口中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用範圍是整個應用運行期間,一旦創建後可以重複使用,通常以單例模式管理SqlSessionFactory。

 

 

5.3SqlSession

SqlSession是一個面向用戶的接口,sqlSession中定義了數據庫操作方法。

每個線程都應該有它自己的SqlSession實例。SqlSession的實例不能共享使用,它也是線程不安全的。因此最佳的範圍是請求或方法範圍。絕對不能將SqlSession實例的引用放在一個類的靜態字段或實例字段中。

 

打開一個 SqlSession;使用完畢就要關閉它。通常把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。如下:

SqlSession session = sqlSessionFactory.openSession();

try {

 // do work

} finally {

session.close();

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章