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>
<!--這裏需要注意的是如果列名和屬性名稱一致,系統可以自動識別不需要進行說明-->

具體配置參照案例:
http://blog.csdn.net/Uponz/article/details/79275823

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