中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么對Mybatis進行全局配置

發布時間:2020-12-03 16:45:18 來源:億速云 閱讀:315 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關怎么對Mybatis進行全局配置,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

總體介紹:MyBatis實際上是Ibatis3.0版本以后的持久化層框架【也就是和數據庫打交道的框架】! 

和數據庫打交道的技術有:

     原生的JDBC技術--->Spring的JdbcTemplate技術

     這些工具都是提供簡單的SQL語句的執行,但是和我們這里學的MyBatis框架還有些不同,

     框架是一整套的東西,例如事務控制,查詢緩存,字段映射等等。

我們用原生JDBC操作數據庫的時候都會經過:

     編寫sql---->預編譯---->設置參數----->執行sql------->封裝結果

我們之所以不使用原生的JDBC工具,是因為這些工具:

1.功能簡單,sql語句編寫在java代碼里面【一旦修改sql,就需要將java及sql都要重新編譯!】這屬于硬編碼高耦合的方式。

2.我們希望有開發人員自己編寫SQL語句,并且希望SQL語句與java代碼分離,將SQL語句編寫在xml配置文件中,實現數據表中記錄到對象之間的映射! 

sql和java編碼分開,功能邊界清晰,一個專注于業務,一個專注于數據,可以使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJO映射成數據庫中的記錄,完成業務+底層數據庫的媒介!        

1.MyBatis歷史

     原是Apache的一個開源項目iBatis,  2010年6月這 個項目由Apache Software Foundation 遷移
     到了 Google Code,隨著開發團隊轉投Google Code 旗下, iBatis3.x正式更名為MyBatis ,代碼于 2013年11月遷移到Github(下載地址見后)。

     iBatis一詞來源于“internet”和“abatis”的組合,是 一個基于Java的持久層框架。
     iBatis提供的持久 層框架包括SQL  Maps和Data  Access  Objects、(DAO)

2.MyBatis簡介:

     MyBatis 是支持定制化 SQL、存儲過程以及高級 映射的優秀的持久層框架

     MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集

     MyBatis可以使用簡單的XML或注解用于配置和原 始映射,將接口和

     Java的POJO(Plain Old JavaObjects,普通的Java對象)映射成數據庫中的記錄.           

3.為什么要使用MyBatis?

     MyBatis是一個半自動化的輕量級的持久化層框架。    

     JDBC

          –     SQL夾在Java代碼塊里,耦合度高導致硬編碼內傷
          –     維護不易且實際開發需求中sql是有變化,頻繁修改的情況多見    

     Hibernate和JPA 

         –     長難復雜SQL,對于Hibernate而言處理也不容易
          –     內部自動生產的SQL,不容易做特殊優化。
          –     基于全映射的全自動框架,大量字段的POJO進行部分映射時比較困難。 導致數據庫性能下降。         

     對開發人員而言,核心sql還是需要自己優化

     sql和java編碼分開,功能邊界清晰,一個專注業務、 一個專注數據。                

4.去哪里找MyBatis?

     https://github.com/mybatis/mybatis-3/

     或者在百度直接搜索mybatis,然后找到github下的地址下載即可!
寫一個 MyBatis 的 HelloWorld: 

- 創建數據庫及數據表并插入數據   

- 創建一個動態WEB工程,然后創建與上述數據表對應的實體類 

- [參考mybatis官方文檔]加入需要的jar包[mybatis所需要的jar包,和數據庫打交道的jar包,以及看打印日志所需要的log4j的jar包]:

     1.log4j-1.2.17.jar    注意:log4j的jar包是需要log4j.xml文件的
     2.mybatis-3.4.1.jar
     3.mysql-connector-java-5.1.37-bin.jar   

- 創建 mybatis-config.xml 文件并將 mybatis 文檔中的內容復制過來,并將數據庫配置信息換成自己的:

    mybatis-config.xml 是總控制文件,EmployeeMapper.xml 是MyBatis的 sql映射文件,在里面也 sql 語句

    所有的 sql映射文件都會寫到總控文件中

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" <br>"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <properties resource="jdbc.properties"/>
 
   <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="com/neuedu/mapper/EmployeeMapper.xml" />
   </mappers>
</configuration>

- 創建測試用例,.復制mybatis官方文檔代碼,代碼如下:

public class TestMyBatis {
   @Test
   public void test() {
      String resource = "mybatis-config.xml";
      InputStream inputStream = null;
      try {
         inputStream = Resources.getResourceAsStream(resource);//從配置文件中讀取一個流
      } catch (IOException e) {
         e.printStackTrace();
      }
      //利用這個流創建一個sqlSessionFactory對象,也就是總控文件創建了這個對象
      SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      //和數據庫建立的一次會話,通過openSession,創建一個sqlsession對象
      SqlSession sqlsession = sqlSessionFactory.openSession();
      try {
         //selectOne查詢一條記錄,第一個參數時sql語句的唯一標識,第二個參數時sql要用的參數
         //為了確保唯一標識唯一,所以在前面寫上namespace,因為namesapce唯一
         //如果第二個參數"4"在數據庫中找不到的話,不會報錯,返回null
         Object selectOne = sqlsession.selectOne("com.neuedu.MyBatis.EmployeeMapper.selectStudentById",4 );
         System.out.println(selectOne);
      } finally {
         sqlsession.close();
      }
   }
}

  - 創建sql語句的映射文件EmployeeMapper.xml;

<mapper namespace="com.neuedu.MyBatis.EmployeeMapper">
<!--
   namespace:名稱空間,隨便起一個名,但是要唯一
   id:sql 語句的唯一標識
   #{id}:接收參數傳遞過來的id值
   resultType:將 sql語句返回成什么對象
 -->
   <select id="selectStudentById" resultType="com.neuedu.entity.Employee">
      select * from student where id = #{id}
   </select>
</mapper>

總結:

– 創建一張測試表
– 創建對應的javaBean
– 創建mybatis配置文件,sql映射文件
– 測試

/**
 * 1.根據xml配置文件(全局配置文件)創建一個SqlSessionFactory對象
 *  有數據源的一些運行環境信息
 * 2.sql映射文件,配置了每一個sql,以及sql的封裝規則等。
 * 3.將sql映射文件注冊在全局配置文件中
 * 4.寫代碼:
 *  1)根據全局配置文件得到SqlSessionFactory
 *  2)使用sqlSession工廠,獲取到sqlSession對象使用它來執行增刪改查!
 *   sqlSession就是代表和數據庫的一次會話!用完要關閉!
 *  3)使用sql的唯一標識告訴MyBatis執行哪個sql。而sql都是保存
 *   在sql映射文件中的。
 */

上面這種開發方式是老版本的Mybatis使用者的開發方式!而新一批的Mybatis使用者都是使用接口的方法 

 HelloWorld----接口式編程

- 新創建一個 mapper包,里面包含 mapper接口,與 mapper.xml文件相對應

public interface EmployeeMapper {
   /*
    * 增刪改查方法
    * */
   public Employee getEmployeeById(Integer id);
 
}
- 通過mapper.xml的 namespace 相關聯

<mapper namespace="com.neuedu.mapper.EmployeeMapper">
<!--
   namespace:將sql映射文件和Mapper接口進行關聯
   id:要和相對應的mapper接口的方法名保持一致
   #{id}:從參數中獲取id
   resultType:將 sql語句返回成什么對象
 -->
 
   <!-- public Employee getEmployeeById(Integer id); -->
   <select id="getEmployeeById" resultType="com.neuedu.entity.Employee">
      select * from student where id = #{id}
   </select>
 
</mapper>
- sqlSession 對象表示服務器和數據庫的一次會話,是一個非線程安全的,所以不能定義在類中,定義在類中,多線程的情況下會有多個線程共用,一次使用獲取一次 ,保證時線程安全的

private SqlSessionFactory getSqlSessionFactory(){
   String resource = "mybatis-config.xml";
   InputStream inputStream = null;
   try {
      inputStream = Resources.getResourceAsStream(resource);//從配置文件中讀取一個流
   } catch (IOException e) {
      e.printStackTrace();
   }
   //利用這個流創建一個sqlSessionFactory對象
   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 
   return sqlSessionFactory;
}
 - 測試

@Test
public void test01(){
   //1.獲取sqlSessionFactory對象
   SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
   //2.利用sqlSessionFactory創建一個session對象,表示和數據庫的一次會話
   SqlSession session = sqlSessionFactory.openSession();
   //3.用session對象獲取mapper接口的代理對象
   //因為sql映射文件給相應的接口創建了一個代理對象,所以mapper接口類不需要實現類
   EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
   //通過mapper接口的代理對象就可以對數據庫進行增刪改查操作
   Employee employee = mapper.getEmployeeById(4);
   System.out.println(employee);
   session.close();
}

 以前都是需要為接口寫一個實現類,但是此時,mybatis提供了接口可以與sql配置文件動態綁定!

如何將兩者進行綁定?以前sql配置文件的namespace可以隨便寫,現在就不能隨便寫了,需要指定為接口的全限定名!

此時接口和sql配置文件做了綁定,還要將select標簽的id和方法名進行綁定 

總結:

1.接口式編程

         原生:                  Dao  ==================>  DaoImpl

        mybatis:         xxMapper ================>  xxMapper.xml

2.SqlSession代表和數據庫的一次會話,用完必須關閉。

3.SqlSession和Connection一樣,都是非線程安全的,每次使用都是應該去獲取新的對象,不要將這個對象定義在類變量中使用!

4.mapper接口沒有實現類,但是mybatis這個接口生成一個代理對象

<!--將接口與xml文件進行綁定 -->
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

5.兩個重要的配置文件

- mybatis的全局配置文件(mybatis-config.xml):包含數據庫連接池信息,事務管理器信息等..系統運行環境信息。
- sql映射文件(EmployeeMapper.xml):保存了每一個sql語句的映射信息。 

Mybatis的全局配置文件 

MyBatis 的配置文件包含了影響 MyBatis 行為甚深的設置(settings)和屬性(properties)信息。文檔的頂層結構順序如下:
- configuration 配置
- properties 屬性:加載properties文件
- settings 設置
- typeAliases 類型命名
- typeHandlers 類型處理器
- objectFactory 對象工廠
- plugins 插件
- environments 環境
- environment 環境變量
- transactionManager 事務管理器
- dataSource 數據源
- databaseIdProvider 數據庫廠商標識
- mappers 映射器 

dtd文檔規定了以上順序不能變

具體介紹:

1.configuration 為全局配置文件綁定dtd約束:

     1)聯網會自動綁定

     2)沒網的時候【/org/apache/ibatis/builder/xml/mybatis-3-config.dtd】:解壓mybatis 的jar包然后在eclipse中綁定

     Window-->Preference-->XML-->XML Catalog 

2. properties屬性

<configuration>
   <!--
     mybatis可以使用properties來引入外部properties配置文件的內容
     resource:引入類路徑下的資源
     url:引入網絡路徑或者磁盤路徑下的資源
   -->
   <properties resource="jdbc.properties"></properties>
     <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.user}"/>
              <property name="password" value="${jdbc.passowrd}"/>
           </dataSource>
        </environment>
     </environments>
     <!-- 將我們寫好的sql映射文件一定要注冊到全局配置文件中,文件用/,類用.,也就是如果是class就用.分隔 -->
     <mappers>
        <mapper resource="EmployeeMapper.xml"/>
     </mappers>
</configuration>

3.settings包含很多重要的設置項

 setting:用來設置每一個設置
  - name:設置屬性名
  - value:設置屬性值

<!-- settings標簽可以設置多個屬性值 -->
<settings>
   <!-- setting標簽負責每一個屬性的設置 -->
   <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
  - mapUnderscoreToCamelCase 可以將數據庫中帶下劃線的名稱,與類中駝峰式命名的名稱對應起來

      比如,在數據庫中名稱為 user_name,在實體類中名稱為userName,value值是true的話,也可以對應上 

4.typeAliases:起別名

<!-- typeAliases可以為多個類起別名 -->
<typeAliases>
   <!-- 別名處理器,可以為某個java類型設置別名
   默認是該類名的首字母小寫,別名不區分大小寫
   alias:可以通過該屬性單獨指定別名-->
   <!-- <typeAlias type="com.neuedu.entity.Employee" alias="asd"/> -->
   <!-- 用package可以批量為類起別名 -->
   <!-- 批量起別名的情況下,使用@Alias注解為某個實體類指定新的別名 -->
   <package name="com.neuedu.entity"/>
</typeAliases>

雖然有這么多的別名可以使用:但是建議還是使用全類名,看SQL語句是怎么被封裝為JAVA 對象的時候簡單!

5.typeHandlers:類型處理器

       類型處理器:負責如何將數據庫的類型和java對象類型之間轉換的工具類 

6.environments:環境們

<!--
  environments:環境們,mybatis可以配置多種環境,default指定使用某種環境。可以達到快速切換環境。
  environment:配置一個具體的環境信息;必須有兩個標簽;id代表當前環境的唯一標識
  transactionManager:事務管理器
  type:事務管理器的類型;type="[JDBC|MANAGED]"),這兩個都是別名,在Configuration類中可以查看具體類!但是Spring對事務的控制才是最終的管理方案!
     當然也可以自定義事務管理器:只需要和人家一樣實現TransactionFactory接口,type指定為全類名。
  dataSource:數據源
  type:type="[UNPOOLED|POOLED|JNDI]"
  自定義數據源:實現DataSourceFactory接口,type也是全類名
  但是我們也說了,無論是事務管理器的配置還是數據源的配置我們都會使用spring來做,這里只需要了解一下即可!
  -->

<environments default="development">
   <environment id="test">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
          <property name="driver" value="${jdbc.driver}"/>
          <property name="url" value="${jdbc.url}"/>
          <property name="username" value="${jdbc.user}"/>
          <property name="password" value="${jdbc.passowrd}"/>
       </dataSource>
    </environment>
    <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.user}"/>
          <property name="password" value="${jdbc.passowrd}"/>
       </dataSource>
    </environment>
</environments>

7.databaseIdProvider環境

   MyBatis 可以根據不同的數據庫廠商執行不同的語句

<databaseIdProvider type="DB_VENDOR">
   <property name="SQL Server" value="sqlserver"/>
   <property name="DB2" value="db2"/>
   <property name="Oracle" value="oracle"/>
   <property name="MySQL" value="mysql"/>
</databaseIdProvider>

Type: DB_VENDOR

– 使用MyBatis提供的VendorDatabaseIdProvider解析數據庫 廠商標識。也可以實現DatabaseIdProvider接口來自定義。

  Property-name:數據庫廠商標識

  Property-value:為標識起一個別名,方便SQL語句使用

在mybatis的全局配置文件配置了這個之后,我們只需要在sql映射文件中通過在執行語句的標簽上加一個屬性databaseId即可!
databaseId 與 value 值對應

<select id="getEmployeeById" resultType="emp">
    select * from tbl_employee where id = #{id}
</select>
<select id="getEmployeeById" resultType="emp" databaseId="mysql">
    select * from tbl_employee where id = #{id}
</select>
<select id="getEmployeeById" resultType="emp" databaseId="oracle">
    select * from tbl_employee where id = #{id}
</select>

這樣在執行不同數據庫的時候,就會執行不同數據庫的語句了

當然如上所示:當有指定了databaseId屬性的和沒有指定databaseId屬性的,都有的情況下那就按著有指定databaseId屬性的sql語句執行!

<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>
   <environment id="dev_oracle">
      <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>

8.mapper映射

<!-- mappers:將sql映射注冊到全局配置中 -->
   <mappers>
   <!-- mapper:注冊一個sql映射
     注冊配置文件:
        resource:引用類路徑下的sql映射文件 mybatis/mapper/EmployeeMapper.xml
        url:引用網絡路徑下或者磁盤路徑下的sql映射文件 url="file:///var/mappers/AuthorMapper.xml" 
     注冊接口
        class:引用(注冊)接口:
          1.有sql映射文件,映射文件名必須和接口同名,并且放在與接口同一個目錄下(可以在conf下見一個同名的包,放在里面);
          2.沒有sql映射文件,所有的sql都是利用注解寫在接口方法上;
          推薦:
            比較重要的,復雜的Dao接口我們來寫sql映射文件
            不重要,見到的Dao接口為了開發快速可以使用注解
   -->
   <!-- <mapper class="com.neuedu.mapper.EmployeeMapper"/> -->
   <mapper resource="com/neuedu/mapper/EmployeeMapper.xml"/>
   <!-- 批量注冊:
      對于sql 映射文件和接口需要保證在同一個包下,且名字必須相同 -->
   <package name="com.neuedu.mapper"/>
</mappers>

class:當映射文件和接口文件不在同一目錄下時,用注解

但是不建議使用注解,建議使用sql映射文件

public interface EmployeeMapper {
   /*
    * 增刪改查方法
    * */
   @Select("select * from student where id = #{id}")
   public Employee getEmployeeById(Integer id);
}

9.最后就是全局配置文件中標簽實際上是有順序的!  

使用自定義的數據源

- 導包:C3P0
- 新建類繼承 UnpooledDataSourceFactory
- 提供無參構造器,并將 dataSource屬性設置成想要連接的數據庫連接池
public class C3P0DateSource extends UnpooledDataSourceFactory{
 
   public C3P0DateSource() {
      this.dataSource = new ComboPooledDataSource();
   }
}
- 在總控文件 mybatis-config.xml 中修改 dataSource 路徑

   將 property 中的 name 換做 C3P0 中的寫法

<environments default="development">
   <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="com.neuedu.datasource.C3P0DateSource">
         <property name="driverClass" value="${jdbc.driver}" />
         <property name="jdbcUrl" value="${jdbc.url}" />
         <property name="user" value="${jdbc.username}" />
         <property name="password" value="${jdbc.password}" />
      </dataSource>
   </environment>
</environments>

上述就是小編為大家分享的怎么對Mybatis進行全局配置了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建昌县| 沂水县| 昭苏县| 广平县| 天峨县| 诸城市| 邯郸市| 吴堡县| 广东省| 遵化市| 灯塔市| 渝北区| 习水县| 青海省| 太保市| 芷江| 阿克苏市| 晋中市| 新民市| 永吉县| 淮安市| 廉江市| 桐柏县| 开鲁县| 大连市| 贡觉县| 大埔县| 鄂托克旗| 历史| 安义县| 托克托县| 玉门市| 新民市| 交口县| 县级市| 靖宇县| 修武县| 若尔盖县| 广灵县| 竹山县| 冀州市|