Mybatis配置文件如何進行配置呢?

Mybatis配置文件配置的方式

  • properties
  • settings
  • typeAliases
  • typeHandlers
  • objectFactory
  • plugins
  • environments
  • transactionManager
  • dataSource
  • mappers

案例實操

1. properties

這些屬性都是可外部配置且可動態替換的,既能夠在典型的 Java 屬性文件中配置,亦可經過 properties 元素的子元素來傳遞。例如:java

<property name="driver" value="com.mysql.jdbc.Driver" />            
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />             
<property name="username" value="root" />             
<property name="password" value="root" />

其中的屬性就能夠在整個配置文件中使用來替換須要動態配置的屬性值。好比:mysql

<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>

如何配?面試

在config.xml 文件中\<configuration>引入子標籤spring

<properties resource="jdbc.properties"></properties>

並修改原有數據源鏈接相關配置以下:sql

<environments default="development">    
    <environment id="development">   
        <transactionManager type="JDBC" />    
        <dataSource type="POOLED">         
            <property name="driver" value="${driver}" />    
            <property name="url" value="${url}" />      
            <property name="username" value="${username}" />  
            <property name="password" value="${password}" />   
        </dataSource>   
    </environment>
</environments>

便可完成。數據庫

2. settings(瞭解)

這是MyBatis 修改操做運行過程細節的重要的步驟。下方這個表格描述了這些設置項、含義和默認值。通常咱們用默認便可(詳細解釋見官網文檔)apache

對應xml配置以下(開發中通常採用默認配置便可):服務器

<settings> 
    <setting name="cacheEnabled" value="true"/>  
    <setting name="lazyLoadingEnabled" value="true"/>  
    <setting name="multipleResultSetsEnabled" value="true"/>
    <setting name="useColumnLabel" value="true"/>  
    <setting name="useGeneratedKeys" value="false"/>  
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
    <setting name="defaultExecutorType" value="SIMPLE"/>  
    <setting name="defaultStatementTimeout" value="25"/> 
    <setting name="defaultFetchSize" value="100"/> 
    <setting name="safeRowBoundsEnabled" value="false"/> 
    <setting name="mapUnderscoreToCamelCase" value="false"/> 
    <setting name="localCacheScope" value="SESSION"/>  
    <setting name="jdbcTypeForNull" value="OTHER"/> 
    <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

3.typeAliases

類型別名是爲 Java 類型設置一個短的名字。它只和 XML 配置有關,存在的意義僅在於用來減小類徹底限定名的冗餘。例如:session

Configuration 標籤下添加mybatis

<typeAliases>   
    <typeAlias alias="customer" type="com.xxx.pojo.Customer" />
</typeAliases>

修改CustomerMapper.xml 文件

<!-- 查詢客戶-->
<select id="queryCustomerById" parameterType="int" resultType="customer">
    SELECT id,user_name 'userName' FROM  yg_customer WHERE  id=#{id}
</select>

也能夠指定一個包名(你們最喜歡的方式),MyBatis 會在包名下面搜索須要的 Java Bean,好比:

<typeAliases>    
    <!-- <typeAlias alias="customer" type="com.xxx.pojo" /> -->    
    <package name="com.xxx.pojo"/>
</typeAliases>

每個在包com.xxx.pojo 中的 Java Bean,在沒有註解的狀況下,會使用 Bean 的首字母小寫的非限定類名來做爲它的別名。 好比com.xxx.pojo.Customer 的別名爲customer ;

如有註解,則別名爲其註解值。 註解名@Alias(value=「user」)

一樣mybatis已經爲咱們構建了相應的類型別名,它們都是大小寫不敏感的,須要注意的是由基本類型名稱重複致使的特殊處理。

別名 映射的類型
_byte Byte
_long Long
_short Short
_int Int
_integer Int
_double Double
_float Float
_boolean Boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

4.typeHandlers 類型處理器(面試有可能會問)

不管是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,仍是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型。下表描述了一些默認的類型處理器。

BooleanTypeHandler java.lang.Boolean, boolean 數據庫兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 數據庫兼容的 NUMERIC 或 BYTE
ShortTypeHandler java.lang.Short, short 數據庫兼容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 數據庫兼容的 NUMERIC 或 INTEGER
LongTypeHandler java.lang.Long, long 數據庫兼容的 NUMERIC 或 LONG INTEGER
FloatTypeHandler java.lang.Float, float 數據庫兼容的 NUMERIC 或 FLOAT
DoubleTypeHandler java.lang.Double, double 數據庫兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler java.math.BigDecimal 數據庫兼容的 NUMERIC 或 DECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 數據庫兼容的字節流類型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定類型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串類型,存儲枚舉的名稱(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERIC 或 DOUBLE 類型,存儲枚舉的索引(而不是名稱)。

你能夠重寫類型處理器或建立你本身的類型處理器來處理不支持的或非標準的類型。 具體作法爲:實現 org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler, 而後能夠選擇性地將它映射到一個 JDBC 類型。

5. 對象工廠(objectFactory)(瞭解)

MyBatis 每次建立結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成。默認的對象工廠須要作的僅僅是實例化目標類,要麼經過默認構造方法,要麼在參數映射存在的時候經過參數構造方法來實例化。默認狀況下,咱們不須要配置,mybatis會調用默認實現的objectFactory。從這個類的外部看,這個類的主要做用就是根據一個類的類型獲得該類的一個實體對象,好比,咱們給他一個User的type,他將會給咱們一個Tiger的實體對象,咱們給他一個java.lang.List對象,他將會給咱們一個List的實體對象。相似於spring 工廠實例化bean

6. plugins 插件

MyBatis 容許你在已映射語句執行過程當中的某一點進行攔截調用。默認狀況下,MyBatis 容許使用插件來攔截的方法調用包括:

· Executor (sql執行時, update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

· ParameterHandler (參數的處理, getParameterObject, setParameters)

· ResultSetHandler (結果集的處理, handleResultSets, handleOutputParameters)

· StatementHandler (申明語句的處理, prepare, parameterize, batch, update, query)

這些類中方法的細節能夠經過查看每一個方法的簽名來發現,或者直接查看 MyBatis 的發行包中的源代碼。 假設你想作的不只僅是監控方法的調用,那麼你應該很好的瞭解正在重寫的方法的行爲。 由於若是在試圖修改或重寫已有方法的行爲的時候,你極可能在破壞 MyBatis 的核心模塊。 這些都是更低層的類和方法,因此使用插件的時候要特別小心。

經過 MyBatis 提供的強大機制,使用插件是很是簡單的,只需實現 Interceptor 接口,並指定了想要攔截的方法簽名便可。

總配置添加

<!-- 插件 -->   
<plugins>   
    <plugin interceptor="com.xxx.plugins.ExamplePlugin">          
        <property name="someProperty" value="100" />   
    </plugin>
</plugins>

插件demo:

@Intercepts({   
    @Signature(      
        type=Executor.class,       
        /**         
        * 攔截全部方法    
        */     
        method="query",       
        /**          
        * 參數定義     
        */          
        args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}            )
}) 
public class ExamplePlugin implements Interceptor {   
    /**    
    * 每一個插件必須實現如下三個方法   
    */    
    /**    
    * Object intercept(Invocation invocation)是實現攔截邏輯的地方,  
    * 內部要經過invocation.proceed()顯式地推動責任鏈前進,也就是調用下一個攔截器攔截目標方法。 
    */   
    public Object intercept(Invocation invocation) throws Throwable {                            System.out.println("intercept");     
         return invocation.proceed();  
      }      
    /**    
    * Object plugin(Object target) 就是用當前這個攔截器生成對目標target的代理,   
    * 實際是經過Plugin.wrap(target,this) 來完成的,把目標target和攔截器this傳給了包裝函數。   
    */   
    public Object plugin(Object target) {    
        return Plugin.wrap(target, this);   
    }       
    /**    
    * setProperties(Properties properties)用於設置額外的參數,參數配置在攔截器的Properties節點裏。   
    */   
    public void setProperties(Properties properties) {                                            System.out.println(properties.get("hello"));  
    }
}

7. 配置環境(environments)(熟悉 配多個數據源)

MyBatis 能夠配置成適應多種環境,這種機制有助於將 SQL 映射應用於多種數據庫之中, 現實狀況下有多種理由須要這麼作。例如,開發、測試和生產環境須要有不一樣的配置;或者共享相同 Schema 的多個生產數據庫, 想使用相同的 SQL 映射。許多相似的用例。

不過要記住:儘管能夠配置多個環境,每一個 SqlSessionFactory 實例只能選擇其一。

因此,若是你想鏈接兩個數據庫,就須要建立兩個 SqlSessionFactory 實例,每一個數據庫對應一個。而若是是三個數據庫,就須要三個實例,依此類推,記起來很簡單:

· 每一個數據庫對應一個 SqlSessionFactory 實例

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
            <property name="driver" value="${driver}" />
            <property name="url" value="${url}" />
            <property name="username" value="${username}" />
            <property name="password" value="${password}" />
        </dataSource>
    </environment>
    
    <environment id="test">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
            <property name="driver" value="${driver2}" />
            <property name="url" value="${url2}" />
            <property name="username" value="${username2}" />
            <property name="password" value="${password2}" />
        </dataSource>
    </environment>
</environments>
## development
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8
username=root
password=root


## test
driver2=com.mysql.jdbc.Driver
url2=jdbc:mysql://127.0.0.1:3306/mybatis2?useUnicode=true&amp;characterEncoding=utf8
username2=root
password2=root

測試sqlSessionFactory

public void test02() {   
    InputStream in;   
    try {        
        in = Resources.getResourceAsStream(this.getClass().getClassLoader()
                , "config.xml");      
         // 默認開發庫     
         //SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);          // 測試庫       
         SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(in,"test");       
         UserDao userDao=new UserDaoImpl(sqlSessionFactory);      
         User user= userDao.queryUserById(1);     
         System.out.println(user); 
        } catch (IOException e) {    
        e.printStackTrace();    
    }
}

8. 事務管理器(transactionManager)(瞭解)

在 MyBatis 中有兩種類型的事務管理器(也就type=」[JDBC|MANAGED]」):

  • JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴於從數據源獲得的鏈接來管理事務範圍。
  • MANAGED – 這個配置幾乎沒作什麼。它歷來不提交或回滾一個鏈接,而是讓容器來管理事務的整個生命週期。 默認狀況下它會關閉鏈接,然而一些容器並不但願這樣,所以須要將 closeConnection 屬性設置爲 false 來阻止它默認的關閉行爲。例如:
<transactionManager type="MANAGED">  
    <property name="closeConnection" value="false"/>
</transactionManager>

若是你正在使用 Spring + MyBatis,則沒有必要配置事務管理器, 由於 Spring 模塊會使用自帶的管理器來覆蓋前面的配置。(集成時會講到)

9.dataSource 數據源(瞭解)

dataSource 元素使用標準的 JDBC 數據源接口來配置 JDBC 鏈接對象的資源。

數據源類型有三種:UNPOOLED,POOLED,JNDI

UNPOOLED

這個數據源的實現只是每次被請求時打開和關閉鏈接。雖然有一點慢,它對在及時可用鏈接方面沒有性能要求的簡單應用程序是一個很好的選擇。 不一樣的數據庫在這方面表現也是不同的,因此對某些數據庫來講使用鏈接池並不重要,這個配置也是理想的。

  • driver – 這是 JDBC 驅動的 Java 類的徹底限定名(並非JDBC驅動中可能包含的數據源類)。
  • url – 這是數據庫的 JDBC URL 地址。
  • username – 登陸數據庫的用戶名。
  • password – 登陸數據庫的密碼。
  • defaultTransactionIsolationLevel – 默認的鏈接事務隔離級別。

做爲可選項,你也能夠傳遞屬性給數據庫驅動。要這樣作,屬性的前綴爲「driver.」,例如:

  • driver.encoding=UTF8

這將經過DriverManager.getConnection(url,driverProperties)方法傳遞值爲 UTF8 的 encoding 屬性給數據庫驅動。

POOLED

​ 這種數據源的實現利用「池」的概念將 JDBC 鏈接對象組織起來,避免了建立新的鏈接實例時所必需的初始化和認證時間。 這是一種使得併發 Web 應用快速響應請求的流行處理方式。(通常選用這種)

  • poolMaximumActiveConnections – 在任意時間能夠存在的活動(也就是正在使用)鏈接數量,默認值:10
  • poolMaximumIdleConnections – 任意時間可能存在的空閒鏈接數。
  • poolMaximumCheckoutTime – 在被強制返回以前,池中鏈接被檢出(checked out)時間,默認值:20000 毫秒(即 20 秒)
  • poolTimeToWait – 這是一個底層設置,若是獲取鏈接花費的至關長的時間,它會給鏈接池打印狀態日誌並從新嘗試獲取一個鏈接(避免在誤配置的狀況下一直安靜的失敗),默認值:20000 毫秒(即 20 秒)。
  • poolPingQuery – 發送到數據庫的偵測查詢,用來檢驗鏈接是否處在正常工做秩序中並準備接受請求。默認是「NO PING QUERY SET」,這會致使多數數據庫驅動失敗時帶有一個恰當的錯誤消息。
  • poolPingEnabled – 是否啓用偵測查詢。若開啓,也必須使用一個可執行的 SQL 語句設置 poolPingQuery 屬性(最好是一個很是快的 SQL),默認值:false。
  • poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使用頻度。這能夠被設置成匹配具體的數據庫鏈接超時時間,來避免沒必要要的偵測,默認值:0(即全部鏈接每一時刻都被偵測 — 固然僅當 poolPingEnabled 爲 true 時適用)。

JNDI

​ 這個數據源的實現是爲了能在如 EJB 或應用服務器這類容器中使用,容器能夠集中或在外部配置數據源,而後放置一個 JNDI 上下文的引用。

  • initial_context – 這個屬性用來在 InitialContext 中尋找上下文(即initialContext.lookup(initial_context))。這是個可選屬性,若是忽略,那麼 data_source 屬性將會直接從 InitialContext 中尋找。
  • data_source – 這是引用數據源實例位置的上下文的路徑。提供了 initial_context 配置時會在其返回的上下文中進行查找,沒有提供時則直接在 InitialContext 中查找。和其餘數據源配置相似,能夠經過添加前綴「env.」直接把屬性傳遞給初始上下文。好比:
  • env.encoding=UTF8

這就會在初始上下文(InitialContext)實例化時往它的構造方法傳遞值爲 UTF8 的 encoding 屬性。

10.mappers 映射器(四種配置)(熟悉)

這裏是告訴mybatis去哪尋找映射SQL 的語句。可使用類路徑中的資源引用,或者使用字符,輸入確切的URL 引用。

!— sqlmapper配置文件路徑 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

<!—url絕對路徑形式-->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

<!—接口 列表配置形式  註解sql-->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

<!—映射包下全部接口-->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

這些配置會告訴了 MyBatis 去哪裏找映射文件,剩下的細節就應該是每一個 SQL 映射文件。

擴展

封裝Dao

1新建接口CustomerDao

接口定義:

public interface CustomerDao {
    Customer queryCustomerByName(String userName);
}

2 xml映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.dao.CustomerDao">
    <!-- 查詢客戶-->
    <select id="queryCustomerByName" parameterType="string" resultType="com.xxx.pojo.Customer">
      SELECT id,user_name 'userName',user_balance 'userBalance' FROM  yg_customer WHERE  user_name=#{userName}
    </select>
</mapper>

3 mappers映射器配置

<mappers>
       <!-- <mapper resource="com/xxx/mapper/CustomerDao.xml" />-->
        <package name="com.xxx.dao"/>
</mappers>

4 測試

public class App 
{
    public static void main( String[] args ) throws IOException {
        //1 加載配置文件
        InputStream is = Resources.getResourceAsStream("mybatis.xml");
        //2 建立sqlsessionfactor工廠
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //3 構建數據庫會話
        SqlSession session = factory.openSession();
       /* Customer customer = session.selectOne("com.xxx.mapper.customerMapper.queryCustomerById", 2);
        System.out.println(customer);*/
        CustomerDao customerDao = session.getMapper(CustomerDao.class);
        Customer customer = customerDao.queryCustomerByName("zhaoliying");
        System.out.println(customer);
        session.close();
    }
}
相關文章
相關標籤/搜索