1. 程式人生 > >Mybatis(學習一)--基礎入門

Mybatis(學習一)--基礎入門

什麼是 MyBatis ?

  MyBatis 是一款優秀的持久層ORM框架,它支援定製化 SQL、儲存過程以及高階對映。
  MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
MyBatis優點:
  1、簡單易學。 mybatis本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar檔案+配置幾個sql對映檔案易於學習,易於使用,通過文件和原始碼,可以比較完全的掌握它的設計思路和實現。
  2、靈活。 mybatis不會對應用程式或者資料庫的現有設計強加任何影響。 sql寫在xml裡,便於統一管理和優化。通過sql基本上可以實現不使用資料訪問框架可以實現的所有功能,或許更多。
  3、解除sql與程式程式碼的耦合。 通過提供DAL層,將業務邏輯和資料訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和程式碼的分離,提高了可維護性。
  4、提供對映標籤,支援物件與資料庫的orm欄位關係對映
  5、提供物件關係對映標籤,支援物件關係組建維護
  6、提供xml標籤,支援編寫動態sql。
MyBatis缺點


  1、編寫SQL語句時工作量很大,尤其是欄位多、關聯表多時,更是如此。
  2、SQL語句依賴於資料庫,導致資料庫移植性差,不能更換資料庫。
  3、框架還是比較簡陋,功能尚有缺失,雖然簡化了資料繫結程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。
  4、二級快取機制不佳

MyBatis使用場景
適合用於:需求變化頻繁, 資料模型不固定的網際網路專案

開發步驟

1、引入jar

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId
>
mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId
>
mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency>

2、定義Mybatis的核心配置檔案,檔名稱沒有規則。
  XML 配置檔案(configuration XML)中包含了對 MyBatis 系統的核心設定,包含獲取資料庫連線例項的資料來源(DataSource)和決定事務作用域和控制方式的事務管理器(TransactionManager)。可以分為3大部分:資料庫連線相關配置、執行時常量和註冊對映元檔案(xml和annotation)

<!-- 用於定義常量,供配置檔案中其它位置進行引用。屬性都是可外部配置且可動態替換的,既可以在典型的 Java 屬性檔案中配置,
    亦可通過 properties 元素的子元素來傳遞 
    properties標籤有2個屬性,resource用於定義相對於classpath的資原始檔,例如datbase.properties(分離配置的思路);
    url用於定義絕對路徑的方法,例如file:///d:\abc\database.properties
    -->
    <properties resource="database.properties">
        <!-- properties標籤除了可以讀取外部的properties檔案的方式之外,還需要在這裡直接進行定義的方式
            系統首先讀取property設定,然後讀取properties resource配置.
            同時系統允許構建SqlSessionFactory物件時編碼設定配置資訊,new SqlSessionFactoryBuilder().build(is, properties)
            最後生效的是編碼處的Properties配置
         -->
        <property name="username" value="dev_user"/>
    </properties>
    <typeAliases>
  <typeAlias alias="Author這是別名,在對映元檔案就可以直接使用別名指代後面的全稱" type="com.yan.entity.Author型別的全名,直接使用比較麻煩,不建議直接使用,但是可以直接使用"/>
</typeAliases>
<!-- MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 對映應用於多種資料庫之中, 現實情況下有多種理由需要這麼做。例如,
    開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產資料庫, 想使用相同的 SQL 對映 ,其中default用於定義預設使用的環境配置.
    預設的環境 ID(比如:default=”yan”)。
    每個 environment 元素定義的環境 ID(比如:id=”yan”)。

    -->
    <environments default="yan">
    <!-- 配置特定名稱的環境,id是名稱,不允許重複.這裡主要配置:
     事務管理器的配置(比如:type=”JDBC”)。在 MyBatis 中有兩種型別的事務管理器(也就是 type=”[JDBC|MANAGED]”):
     一般針對非分散式應用都使用JDBC.

    JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
    MANAGED – 這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器
    的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它默
    認的關閉行為

         資料來源的配置(比如:type=”POOLED”)。
         dataSource元素使用標準的 JDBC 資料來源介面來配置 JDBC 連線物件的資源。有三種內建的資料來源型別(也就是 type=”[
         UNPOOLED|POOLED|JNDI]”):
     UNPOOLED– 這個資料來源的實現只是每次被請求時開啟和關閉連線。一般只用於環境測試.
     POOLED– 這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來,避免了建立新的連線例項時所必需的初始化和認證時間。 這
     是一種使得併發 Web 應用快速響應請求的流行處理方式。
     JNDI– 這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上
     下文的引用。一般只用於生產環境
     -->
        <environment id="yan">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 最基本的配置資訊
                driver – 這是 JDBC 驅動的 Java 類的完全限定名(並不是JDBC驅動中可能包含的資料來源類)。
                url – 這是資料庫的 JDBC URL 地址。
                username – 登入資料庫的使用者名稱。
                password – 登入資料庫的密碼。 

                ${key}使用的是OGNL,表示從properties獲取的配置值
                 -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-->註冊對映元檔案-->
    <mappers>
    <mapper resource="com/yan/entity/AuthorMapper.xml"/>使用相對大於classpath的設定方式
<mapper url="file:///var/mappers/AuthorMapper.xml"/>使用絕對路徑的方式,不建議使用
<mapper class="com.yan.dao.AuthorMapper"/>一般用於通過annotation定義對映時使用, AuthorMapper是一個對應的對映介面
<package name="com.yan.entity"/>自動掃描包中的所有對映資訊
</mappers>

測試連線是否成功

        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        Properties ps=new Properties();
        ps.setProperty("username","zhangsan");
        SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(is, ps);
        SqlSession session=fac.openSession();
        System.out.println(session.getConnection());
        session.close();

3、定義資料庫表結構

Create table t_users(
   Id bigint primary key auto_increment,
   Username varchar(20) not null unique,
   Password varchar(20) not null,
   Birth timestamp default current_timestamp,
   Sex boolean default 1,
   Salary numeric(8,2)
)engine=innodb default charset utf8;

4、定義對映元檔案—xml
  SQL 對映檔案有很少的幾個頂級元素(按照它們應該被定義的順序):

  • cache – 給定名稱空間的快取配置。
  • cache-ref – 其他名稱空間快取配置的引用。
  • resultMap – 是最複雜也是最強大的元素,用來描述如何從據庫結果集中來載入物件。
  • parameterMap – 已廢棄!老式風格的引數對映。內聯引數是首選,這個元素可能在將來被移除,這裡不會記錄。
  • sql – 可被其他語句引用的可重用語句塊。
  • insert – 對映插入語句
  • update – 對映更新語句
  • delete – 對映刪除語句
  • select – 對映查詢語句

insert, update 和 delete基本相同

<mapper namespace="com.yan.entity.UserBean名空間設定">
    <insert id="insert對應statement名稱" parameterType="UserBean引數型別,使用簡稱的前提是在mybatis-config.xml中定義了別名">
        insert into t_users(username,password) values(#{username},#{password})定義對應的SQL語句,這裡使用#{}方式的OGNL表示式從引數中獲取對應的值
    </insert>
    <insert id="insert" parameterType="UserBean" useGeneratedKeys="true"
        keyProperty="id" keyColumn="id">
        insert into
        t_users(username,password)
        values(#{username},#{password})
    </insert>
</mapper>

測試insert()

InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(is);
        SqlSession session=fac.openSession();

        UserBean user=new UserBean();
        user.setUsername("yan11");
        user.setPassword("123456");
        int len=session.insert(user.getClass().getName()+".insert",user);
        session.commit();
        if(len>0)
            System.out.println(user.getId());
        session.close();

Select用於定義對應的查詢操作

<select id="selectPerson" parameterType="int引數型別,使用的是別名,表示引數為java.lang.Integer" resultType="hashmap返回結果對應的一行資料的型別,可以返回java.util.HashMap,也可能是List<HashMap>型別">
  SELECT * FROM PERSON WHERE ID = #{id}
</select>

具體返回的是一個物件還是一組物件取決於呼叫方法時selectOne還是selectList
<select id="selectById" parameterType="long" resultType="UserBean">
        select * from t_users where id=#{id}
</select>
這裡是按照主鍵進行查詢,所以應該是返回一個數據,所以呼叫時採用的是selectOne
UserBean user=session.selectOne("com.yan.entity.UserBean.selectById", 1L);


<select id="selectAll" resultType="UserBean">
        select * from t_users
</select>
這裡的查詢返回應該是多行資料,所以呼叫時採用的是selectList返回一個List,每個元素都是UserBean型別的
List<UserBean> ulist = session.selectList("com.yan.entity.UserBean.selectAll");
if(ulist!=null && ulist.size()>0)
    for(UserBean temp:ulist){
        System.out.println(temp);
    }


<select id="selectAllRowsNum" resultType="int">
        select count(*) from t_users
</select>
int len = session.selectOne("com.yan.entity.UserBean.selectAllRowsNum");

id 在名稱空間中唯一的識別符號,可以被用來引用這條語句。
parameterType 將會傳入這條語句的引數類的完全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過 TypeHandler 推斷出具體傳入語句的引數,預設值為 unset。

parameterMap 這是引用外部 parameterMap 的已經被廢棄的方法。使用內聯引數對映和 parameterType 屬性

resultType從這條語句中返回的期望型別的類的完全限定名或別名。注意如果是集合情形,那應該是集合可以包含的型別,而不能是集合本身。使用 resultType 或 resultMap,但不能同時使用。如果返回的是複雜物件型別資料則要求列名稱必須和屬性名稱一致

resultMap外部 resultMap 的命名引用。結果集的對映是MyBatis最強大的特性,對其有一個很好的理解的話,許多複雜對映的情形都能迎刃而解。使用resultMap或resultType,但不能同時使用。

flushCache將其設定為 true,任何時候只要語句被呼叫,都會導致本地快取和二級快取都會被清空,預設值:false。

useCache將其設定為 true,將會導致本條語句的結果被二級快取,預設值:對 select 元素為 true。

timeout這個設定是在丟擲異常之前,驅動程式等待資料庫返回請求結果的秒數。預設值為 unset(依賴驅動)。
fetchSize 這是嘗試影響驅動程式每次批量返回的結果行數和這個設定值相等。預設值為 unset(依賴驅動)。

statementType可以選用的是STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,預設值:PREPARED。

resultSetType可以使用FORWARD_ONLY(表示採用單向滾動的結果集),SCROLL_SENSITIVE(表示採用可滾動的敏感的結果集) 或 SCROLL_INSENSITIVE(表示採用可滾動的不敏感的結果集) 中的一個,預設值為 unset (依賴驅動)。

databaseId 如果配置了 databaseIdProvider,MyBatis 會載入所有的不帶 databaseId 或匹配當前 databaseId 的語句;如果帶或者不帶的語句都有,則不帶的會被忽略。

resultOrdered這個設定僅針對巢狀結果 select 語句適用:如果為 true,就是假設包含了巢狀結果集或是分組了,這樣的話當返回一個主結果行的時候,就不會發生有對前面結果集的引用的情況。這就使得在獲取巢狀的結果集的時候不至於導致記憶體不夠用。預設值:false。

resultSets這個設定僅對多結果集的情況適用,它將列出語句執行後返回的結果集並每個結果集給一個名稱,名稱是逗號分隔的。

引數Parameters

<select id="selectUsers" resultType="User引數型別,這是一個複雜型別">
  select id, username, password from users where id = #{id}這裡的#{id}是一個OGNL表示式,表示從引數中獲取id屬性的值
</select>
<select id="selectById" parameterType="long設定一個簡單型別的引數【不是java的概念,這裡表示是一個單一值,不是多個屬性值的樣式,例如整數、日期、字串等】" resultType="UserBean">
    select <include refid="sql1"/> from t_users where id=#{id}這裡的#{id}用於表示引用這個單一值,不是獲取屬性。這個名稱可以隨意編寫
</select>
<!--定義引數時經常會指定引數的具體資料型別,注意如果不設定框架會自動識別
#{middleInitial,jdbcType=VARCHAR}表示引用引數中的middleInitial屬性值,這個值針對資料庫中的varchar型別,jdbcType實際上是java.sql.Types類中所定義的常量
注意:指定jdbcType一般用於的是針對單一值型別-->

Result Maps用於實現結果集到物件型別資料的對映,主要說明哪個列對應的是哪個屬性

<resultMap type="UserBean" id="userMapper">
    <id property="id" column="id" jdbcType="BIGINT"/>
    <result property="uname" column="username" jdbcType="VARCHAR"/>用於說明屬性名uname對應的列名稱為username
    <result property="upwd" column="password" javaType="string"/>
    <result property="birth" column="birth" jdbcType="DATE"/>這裡設定資料型別為DATE,表示只獲取年月日,沒有對應的時間
</resultMap>

<select id="selectById" parameterType="long" resultMap="userMapper">
    select <include refid="sql1"/> from t_users where id=#{id}
</select>
<!--這裡需要注意的是如果列名和屬性名稱一致,系統可以自動識別不需要進行說明-->

相關推薦

Mybatis(學習)--基礎入門

什麼是 MyBatis ?   MyBatis 是一款優秀的持久層ORM框架,它支援定製化 SQL、儲存過程以及高階對映。   MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配

Redis學習(基礎入門).

切換目錄 丟失 發布系統 lan mem edi rpo ble 時間戳 一、前言 Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、key-Value 的數據庫、並提供多種語言的API。 通常,Re

mybatis學習入門

一 mybatis入門 1.1 mybatis是什麼 MyBatis是一個簡化和實現了 Java 資料持久化層(persistence layer) 的開源框架,它抽象了大量的JDBC冗餘程式碼,並提供了一個簡單易用的 API和資料庫互動。 MyBatis的前身

MyBatis學習基礎環境搭建與入門

所需要jar包:mybatis-3.x.x.jar 、如果要和其它框架整合,需要其它的jar包 mybatis的j資料及jar下載地址:http://download.csdn.net/detail/itjavawfc/7685119 1.看看專案目錄: 2.按照

jQuery學習()——jQuery入門

完成 生效 ready 技術 button 覆蓋問題 包括 寫入 屬性和方法 1、jQuery基礎 Jquery它是一個庫(框架),要想使用它,必須先引入! jquery-1.8.3.js:一般用於學習階段。 jquery-1.8.3.min.js:用於項目使用階段 官網下

MyBatis學習()

es2017 提交 clas char 接口類 數據庫 nbsp transacti 兩個 一、MyBatis簡介 MyBatis是一個對JDBC進行封裝的持久層框架,只需關註SQL本身,而不必去處理(註冊驅動、創建connection、創建statement、手動設置參數

springboot整合Mybatis)——入門

target 連接池 param 不支持 void 2.6 batis gpo onf 一、概述   1.先導     mybatis入門隨筆:http://www.cnblogs.com/jiangbei/p/6884641.html   2.引入依賴

Mybatis學習系列(1) –– 入門簡介

connector ring cti 行操作 底層 數據庫連接 lean lose style MyBatis簡介 Mybatis是Apache的一個Java開開源項目,是一個支持動態Sql語句的持久層框架。Mybatis可以將Sql語句配置在XML文件中,避免將Sql語

性能測試學習()--基礎知識點

知識 web服務器 穩定 性能 str 檢測 存在 測試的 長時間 最近在學習性能測試,整理了下一些知識點。   首先從ISO9216質量模型切入,這個模型展示了去完整測評一個軟件的時候,需要從哪些維度去考慮。如下圖所示,一般需要從功能性、可靠性、易用性、效率、

效能測試學習()--基礎知識點

      最近在學習效能測試,整理了下一些知識點。   首先從ISO9216質量模型切入,這個模型展示了去完整測評一個軟體的時候,需要從哪些維度去考慮。如下圖所示,一般需要從功能性、可靠性、易用性、效率、維護性、可移植性這6個維度去測評。軟體的效能測試就是從效率這一維度去測評

Java程式設計師的職業生涯學習建議——基礎入門

這部分主要適用於尚未做過Java工作的同學,包括一些在校生以及剛準備轉行Java的同學。 一、Java基礎 首先去找一個Java的基礎教程學一下(教材或者網路視訊)。 學習Java基礎的時候,應該儘量多動手,很多時候,你想當然的事情,等你寫出來執行一下,你就會發現不是這麼回事兒,不

WebService基礎學習()—基礎知識

一、WebService 1.什麼是WebService      Web Service(WEB服務)能夠快捷和方便地綜合結合各種系統、商務和任何應用平臺。利用最新的Web Service 標準能夠使任何軟體系統和系統之間的應用互通互聯,方便,而且更加廉價。

MyBatis學習筆記之一---入門

首先給大家推薦幾個網頁: http://www.mybatis.cn/ http://blog.csdn.net/isea533/article/category/2092001    http://www.mybatis.org/mybatis-3/zh/index

mybatis 學習()

1.mybatis 的優勢:      a.不遮蔽sql,意味著我們可以優化和改造sql,有利於網際網路系統性能的提高      b.提供強大,靈活的對映機制      c.一個介面和xml就可以建立對映器 2.

Python學習筆記 (基礎入門篇)

基本資料型別 整形 :Integer ,int 浮點型:Float ,float 布林值:Boolean,bool 字串:String, str 使用方法:{” ;”” ;”“” “”“} 均能表示字串 陣列: [ , ,

Scala學習() 快速入門

學習Spark就要學習Scala,今天開始快速學習Scala.直接在這裡做筆記了. 1 Scala基礎與語法 1.1 基本資料型別 8中常見資料型別:Byte,Char,Short,Int,Long,Float,Double和Boolean.

nodejs備忘總結() -- 基礎入門

什麼是NodeJS JS是指令碼語言,指令碼語言都需要一個解析器才能執行。對於寫在HTML頁面裡的JS,瀏覽器充當瞭解析器的角色。而對於需要獨立執行的JS,NodeJS就是一個解析器。 每一種解析器都是一個執行環境,不但允許JS定義各種資料結構,進行各種計算,還允許JS使用執行環境提供的內建物件和方法做一

Django學習基礎入門下篇)

一、後臺管理: 1.建立管理員:開啟虛擬環境,並進入專案目錄HelloDjango。 輸入:python manage.py createsuperuser,然後按照提示依次輸入使用者名稱(可回車跳過不設定,使用電腦預設名稱)、郵箱(可回車跳過不設定)、密碼(8位以上覆雜密

MyBatis學習1--基礎

MyBatis的作用 MyBatis是持久層的框架,封裝了幾乎所有的JDBC程式碼,使用簡單的XML或註解配置和定義對映關係。 MyBatis的體系結構 載入配置 一種是XML配置檔案,一種是Java程式碼的註解。將SQL的配置資訊載入成一個個的M

深度學習基礎入門

畢業設計是和深度學習相關,之前零零碎碎的學習了一些相關知識,這裡開個系列文章總結一些,以免又看了忘,再看又不方便。 深度學習目前可以說是非常火了,而深度學習是機器學習的一個分支,機器學習也只是人工智慧的一個分支。 我是跟著李巨集毅教授的上課視訊一起學,這是地址 h