1. 程式人生 > >初始MyBatis的應用環境及使用方式

初始MyBatis的應用環境及使用方式

MyBatis **

什麼是 MyBatis?

**

MyBatis是支援定製化SQL,儲存過程以及高階對映的優秀的持久層框架.MyBatis避免了幾乎所有的JDBC程式碼和手動設定引數以及獲取結果集.MyBatis可以對配置和原生Map使用簡單的XMl或註解,將介面和Java的POJOs(Plain Old java Objects,普通的Java物件)對映成資料庫中的記錄.

MyBatis如何安裝?

要使用MyBatis,只需要mybatis-x.x.x.jar檔案置於classpath中即可,web專案把jar包放到WEB-INF下的lib包中 如果使用Maven來構建專案,則需將下面dependency程式碼置於pom.xml檔案中:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifacId>
    <version>x.x.x</version> //版本號
</dependency>

MyBatis的功能架構

我們把Mybatis的功能架構分為三層 1. API介面層:提供給外部使用的介面API,開發人員通過這些本地API來操縱資料庫.介面層一接受呼叫請求就會呼叫資料處理層來完成具體的資料處理.

資料處理層:負責具體的SQL查詢.SQL解析.SQL執行和執行結果對映處理等.它主要的目的是根據呼叫的請求完成一次資料庫操作

基礎支撐層:負責最基礎的功能支撐,包括連線管理,事務管理,配置載入和快取處理,這些都是共有的東西,將他們抽取出來作為最基礎的元件。為上層的資料處理層提供最基礎的支撐

**

MyBatis的優缺點

**

優點: • 簡單易學:本身就很小且簡單.沒有任何第三方依賴,最簡單安裝只要兩個jar檔案+配置幾個sql對映檔案易於學習,易於使用,通過文件和原始碼,可以比較完全的掌握它的設計思路和實現。

• 靈活:mybatis不會對應用程式或則資料庫的現有設計強加任何影響。sql寫在xml裡,便於統一管理和優化。通過sql基本上可以實現我們不使用資料訪問框架可以實現的所有功能,獲取更多。

• 解除sql與程式程式碼的耦合:通過提供DAO層,將業務邏輯和資料訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和程式碼的分離,提高了可維護性。

• 提供對映標籤,支援物件與資料庫的orm欄位關係對映

• 提供物件關係對映標籤,支援物件關係組建維護

• 提供xml標籤,支援編寫動態sql。

缺點: • 編寫SQL語句時工作量很大,尤其是欄位多,關聯表多時,更是如此

• SQL語句依賴於資料庫,導致資料庫移植性差,不能更換資料庫。

• 框架還是比較簡陋,功能尚有缺失,雖然簡化了資料繫結程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。

• 二級快取機制不佳

**

MyBatis的使用

**

1.建立Mybatis的核心配置檔案mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration
<properties resource="database.properties"/>
<settings> 
    <setting name="logImpl" value="LOG4J"/>
</settings>
<environments default="development"> <!-- 環境 -->
    <environment id="development"> <!-- 環境變數 -->
        <!-- 配置事務管理 ,採用JDBC管理事務-->
        <transactionManager type="JDBC"/> <!-- 事務管理器 -->
        <!-- POOLED是mybatis的 資料來源 -->
        <!-- JNDI是基於tomcat的資料來源 -->
        <dataSource type="POOLED"> <!-- 資料來源(UNPOOLED,POOLED,JNDI) -->
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>
<!-- pojo的對映檔案UserMapper引入到配入到配置檔案中 -->
<mappers> <!-- 對映器 -->
    <!-- resource要寫成路徑 -->
    <mapper resource="cn/smbms/dao/UserMapper.xml"/>
</mappers></configuration>

mybatis-config.xml檔案的幾個常用元素的作用如下:

1.configuration:配置檔案的根元素節點

2.properties:通過resource屬性從外部指定properties屬性檔案 (database.properties),database.properties屬性檔案描述資料庫連線的相關配置,包括資料庫驅動 (jdbc.driver)、連線資料庫的url(jdbc.url)、資料庫使用者名稱(jdbc.user)、資料庫密碼(jdbc.pwd),位置也在/resoureces目錄下。

3.settings:設定MyBatis執行中的一些行為,比如此處設定MyBatis的log日誌實現為LOG4J,即使用 log4j實現日誌功能。

4.environments:表示配置MyBatis的多套執行環境,將SQL對映到多個不同的資料庫上,該元素節點下可以配置多個environment子元素節點,但是必須指定其中一個預設執行環境(通過default指定)。

5.environment:配置MyBatis的一套執行環境,需指定執行環境ID、事務管理、資料來源配置等相關資訊。

6.mappers:作用是告訴MyBatis去哪裡找到SQL對映檔案(該檔案內容是開發者定義的對映sql語句),整個專案中可以有1個或多個SQL對映檔案

7.mapper:mappers的子元素節點,具體指定SQL對映檔案的路徑,其中resource屬性的值表述了sql 對映檔案的路徑(類資源路徑) 注意:mybatis-config.xml檔案的元素節點是有一定順序的,節點位置若不按順序排位,那麼XML檔案會報錯

2.接下來準備持久化類和SQL對映檔案 我們先來定義一個簡單的類(user類) user類的屬性也就是我們資料庫中表的欄位(user表) public class User { private Integer id; //id private String userCode; //使用者編碼 private String userName; //使用者名稱稱 private String userPassword; //使用者密碼 private Integer gender; //性別 private Date birthday; //出生日期 private String phone; //電話 private String address; //地址 private Integer userRole; //使用者角色 private Integer createdBy; //建立者 private Date creationDate; //建立時間 private Integer modifyBy; //更新者 private Date modifyDate; //更新時間 //省略getter,setter方法 注意:一般情況下我們的類名和資料庫的表名都是一致的

接下來進行SQL對映檔案的建立,完成與POJO(實體類)的對映,該檔案也是一個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”> select count(1) as count from smbms_user 經驗:SQL對映檔案一般都對應相應的POJO(實體類),所以一般都是採用POJO的名稱+Mapper的規則來進行命名,比如我們建立的這個對映檔案,名字叫做UserMapper.xml(對映檔案放置與dao包下)

上述配置檔案中各元素的意義: mapper:對映檔案的根元素節點,只有一個屬性namespace namespace:用於區分不同的mapper,全域性唯一 select:表示查詢語句,是MyBatis 常用的元素之一,常用屬性如下: id屬性:該名稱空間下唯一識別符號 resultType屬性:表示SQL語句返回值型別,此處通過SQL語句返回的是int型別

接下來建立測試類,在工程中加入JUnit4,建立測試類(UserMapperTest.java)進行測試,程式碼如下: public class UserMapperTest { public static void main(String[] args) throws Exception { //1.讀取全域性配置檔案:mybatis-config.xml String resource=“mybatis-config.xml”; //獲取mybatis-config.xml檔案的輸入流 InputStream is= Resources.getResourceAsStream(resource); //2.建立SqlSessionFactory物件 SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is); //建立SqlSession int count=0; SqlSession sqlSession=null; sqlSession=factory.openSession(); count=sqlSession.selectOne(“com.smbms.dao.user.UserMapper.count”); //3.關閉SqlSession物件 sqlSession.close(); System.out.println(count); } } 由於我們每次執行SQL語句都要建立這些物件,所以說會有很多冗餘程式碼,我們把這些重複的程式碼抽出來放到一個工具類中,以後直接呼叫這些工具類中的方法即可 建立工具類:MyBatisUtil public class MyBatisUtil { private static SqlSessionFactory factory; static { try { InputStream is= Resources.getResourceAsStream(“mybatis-config.xml”); factory=new SqlSessionFactoryBuilder().build(is); }catch (IOException e){ e.printStackTrace(); } } public static SqlSession createSqlSession(){ return factory.openSession(false); } public static void closeSqlSession(SqlSession sqlSession){ if (null!=sqlSession){ sqlSession.close(); } } } 具體使用請看後面 SQLSession使用第二種方式

MyBatis的基本要素-核心物件

SqlSessionFactoryBuilder

1.build()方法使用三種形式的配置資訊,分別是InputStream(位元組流)、Reader(字元流、Configuration(類) 2.SqlSessionFactoryBuilder 大特點是用過即丟

SqlSessionFactory

1.openSession()方法獲取SqlSession例項,openSession()傳入引數true表示關閉事務控制,自動提交,false開啟事務控制機制。預設為true。 2.SqlSessionFactory一旦建立,就會在整個應用執行過程中始終存在。

SqlSession

1.SqlSession是用於執行持久化操作的物件,類似於JDBC中的Connection。 2.SqlSession對應一次資料庫會話,SqlSession不是執行緒安全的. 3.SqlSession有兩種使用方式

第一種使用方式: 1.現在Mapper檔案中新增一個select節點

SELECT * FROM USER</select>

2.編寫測試 SqlSession sqlSession=null; List userList=new ArrayList(); try{ sqlSession= MyBatisUtil.createSqlSession(); userList=sqlSession.selectList(“com.smbms.dao.user.UserMapper.getUserList”); }catch (Exception ex){ ex.printStackTrace(); }finally { MyBatisUtil.closeSqlSession(sqlSession); }for (User user : userList) { System.out.println(user.getUserName()); } 第二種使用方式: 基於上面的Mapper配置檔案 1.編寫介面 public interface UserMapper { /**

  • 獲取使用者列表* @return */ List getUserList(); } 2.編寫測試 SqlSession sqlSession=null; List userList=new ArrayList(); try{ sqlSession= MyBatisUtil.createSqlSession(); userList=sqlSession.getMapper(UserMapper.class).getUserList(); }catch (Exception ex){ ex.printStackTrace(); }finally { MyBatisUtil.closeSqlSession(sqlSession); }for (User user : userList) { System.out.println(user.getUserName()); } 注意:推薦使用第二種方法

加Java架構師進階交流群獲取Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點高階進階乾貨的直播免費學習許可權 都是大牛帶飛 讓你少走很多的彎路的 群號是:883922439 對了 小白勿進 最好是有開發經驗 注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!