一、MyBatis初探

這裏寫圖片描述
1.爲什麼是MyBatis?
在我們的系統開發中,我們的業務邏輯最終基本都是基於數據庫的內容的,所以這一過程就涉及到與數據庫的增刪改查各種操作,我們在javase的學習中,對數據庫的操作都是基於JDBC的操作的,但是JDBC存在這麼一個問題:所有的數據庫連接的連接信息或者是SQL語句都是被我們固定地寫死在Java代碼中的,這在編程中我們稱之爲“硬編碼”。硬編碼這樣的代碼編寫習慣會使我們後期的軟件維護相當困難。因爲只要數據庫信息改變之後就意味着我們的java代碼裏的JDBC信息需要重新改寫、重新編譯。這一工作是相當影響我們的項目維護升級的,因此也就給後期維護升級人員帶來一定程度的困難。另外JDBC的操作是通過數據庫連接池來管理的,在系統運行中需要不斷與數據庫進行交互,這樣JDBC流頻繁的連接、斷開造成相當大程度的開銷。所以MyBatis應運而生。

2、MyBatis基本原理與架構
2.1、基本原理
硬編碼問題解決:MyBatis通過實現java邏輯代碼與數據庫連接、操作配置信息分離的方式,提高Java系統的健壯性和可維護性,使得開發人員只用專心在java的實現邏輯,而數據庫相關信息則可以通過xml的形式進行配置並在My Batis**會話工廠**進行讀取、組裝。
2.2、基本架構
2.2.1、數據源配置文件:SqlMapConfig.xml
數據源配置文件也就是負責連接數據庫並對數據進行操作。也就是MyBatis的一個全局配置文件。在該文件中配置了數據庫驅動、數據庫連接地址、數據庫用戶名、密碼、事務管理等一系列的參數。另外如果需要對數據庫連接池性能調優,可以在該文件配置連接池的連接數和空閒時間參數等等。具體如下:

    <?xml version="1.0" encoding="UTF-8" ?>  
    <!DOCTYPE configuration  
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
    "http://mybatis.org/dtd/mybatis-3-config.dtd">  
    <configuration>  

        <!-- 加載java的配置文件或者聲明屬性信息 -->  
        <properties resource="db.properties">  
            <property name="db.username" value="123" />  
        </properties>  

        <!-- <settings></settings> -->  

        <!-- 自定義別名 -->  
        <typeAliases>  
            <!-- 別名定義 -->  
            <!-- <typeAlias type="com.shanshui.mybatis.User" alias="user"/> -->  

            <!-- 批量別名定義) -->  
            <!-- package:指定包名稱來爲該包下的po類聲明別名,默認的別名就是類名(首字母大小寫都可) -->  
            <package name="com.itheima.mybatis.po" />  
        </typeAliases>  

        <!-- 配置mybatis的環境信息,與spring整合,該信息由spring來管理 -->  
        <environments default="development">  
            <environment id="development">  
                <!-- 配置JDBC事務控制,由mybatis進行管理 -->  
                <transactionManager type="JDBC"></transactionManager>  
                <!-- 配置數據源,採用mybatis連接池 -->  
                <dataSource type="POOLED">  
                    <property name="driver" value="${db.driver}" />  
                    <property name="url" value="${db.url}" />  
                    <property name="username" value="${db.username}" />  
                    <property name="password" value="${db.password}" />  
                </dataSource>  
            </environment>  
        </environments>  

        <!-- 加載映射文件 -->  
        <mappers>  
            <mapper resource="User.xml" />  
        <!-- <mapper resource="mapper/UserMapper.xml" /> -->  

            **<!-- 批量加載映射文件 -->**  
            <package name="com.itheima.mybatis.mapper" />  
        </mappers>  
    </configuration>  

2.2.2、SQL映射配置文件
同樣的,在java的JDBC中的增刪改查操作,不能硬編碼形式的寫在我們的Java代碼中,在MyBatis中提供Mapper.xml文件中進行配置映射規則。在這個文件中我們可以配置需要的SQL語句。例如:select、delete、update、insert。在該文件中的配置信息,可以對SQL查詢語句的執行參數(id、group等),以及查詢返回值的集合對象形式。
也就是說,Mapper.xml文件就是對SQL語句以及其輸入輸出參數的配置。

<?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標籤開始,由/mapper結束,可以把它想成一個空間,是映射文件
屬性namespace:空間名,主要在代理中使用。這個namespace是唯一的。
這裏把mapper標籤和接口聯繫在一起了,namespace=寫接口路徑,映射文件要和接口在同一目錄下
 -->
<mapper namespace="com.dao.UserinfoDAO">
    <!-- =============映射關係標籤=============
    屬性type:寫po類的包名類名,由於之前定義了po類的別名,這裏就寫這個別名
    屬性id:是這個映射標籤的唯一標識
    id標籤是查詢結果集中的唯一標識
    屬性column:查詢出來的列名
    屬性property:是po類裏所指定的列名
    通常會在原列名後面加下劃線,這是固定的,這裏就是id後面_
     -->
    <resultMap type="com.po.UserinfoPO" id="userinfoMap">
        <result column="userid" property="userid"/>
        <result column="loginname" property="loginname"/>
        <result column="loginpass" property="loginpass"/>
        <result column="username" property="username"/>
        <result column="upower" property="upower"/>
        <result column="birthday" property="birthday"/>
        <result column="sex" property="sex"/>
    </resultMap>
    <!-- ==================定義sql片段==============
    sql:是sql片段標籤屬性id是該片段的唯一標識 -->
    <sql id="zd">
        userid,loginname,loginpass,username,upower,birthday,sex
    </sql>
    <!-- 增刪改查標籤裏的id:一定要和接口裏對應的方法名一致,
         resultMap輸出類型裏寫映射標籤裏的id 
         parameterType:輸入類型,規範輸入數據類型,指明查詢時使用的參數類型-->
    <!-- 驗證登錄 -->
    <select id="login" resultMap="userinfoMap" parameterType="com.po.UserinfoPO">    
        <!-- 用include標籤引入sql片段,refid寫定義sql片段的id,where標籤不要寫在片段裏 -->
        select <include refid="zd"/> from userinfo
        <where>            
                loginname=#{loginname} and loginpass=#{loginpass}
        </where>
    </select>

    <!-- 查詢用戶列表 -->
    <select id="userList" resultMap="userinfoMap" parameterType="com.po.UserinfoPO">
        <!-- 用include標籤引入sql片段,refid寫定義sql片段的id,where標籤不要寫在片段裏 -->
        select <include refid="zd"/> from userinfo
    </select>

    <!-- 查詢修改用戶信息的id -->
    <select id="updateid" resultMap="userinfoMap" parameterType="com.po.UserinfoPO">
        <!-- 用include標籤引入sql片段,refid寫定義sql片段的id,where標籤不要寫在片段裏 -->
        select <include refid="zd"/> from userinfo
        <where>userid=#{userid}</where>
    </select>

    <!-- 修改用戶信息 -->
     <update id="update" parameterType="com.po.UserinfoPO">
         update userinfo 
         set loginname=#{loginname},loginpass=#{loginpass},username=#{username},
             upower=#{upower},birthday=#{birthday},sex=#{sex}
         where userid=#{userid}     
     </update>

    <!-- 添加用戶信息 -->
    <insert id="insert" parameterType="com.po.UserinfoPO">
        insert into userinfo(<include refid="zd"/>) 
        values
        (#{userid},#{loginname},#{loginpass},#{username},#{upower},#{birthday},#{sex})
    </insert>

    <!-- 增刪改查標籤裏的id:一定要和接口裏對應的方法名一致 -->
    <delete id="delete" parameterType="int">
        delete from userinfo where userid=#{userid}
    </delete>

    <!-- 根據用戶名模糊查詢,根據權限查詢 -->
    <select id="select" resultMap="userinfoMap" parameterType="java.util.Map">
        <!-- 用include標籤引入sql片段,refid寫定義sql片段的id,where標籤不要寫在片段裏 -->
        select <include refid="zd"/> from userinfo
        <!-- 當頁面沒有輸入用戶名和選擇權限,就讓它的條件永遠爲真,就變成全查詢了 -->
        <where>
            <if test="username == null and username = '' and upower == -1">
                and 1=1
            </if>
            <if test="username != null and username !=''">
                and username LIKE '%${username}%' 
            </if>        
            <if test="upower != -1">
                and upower=#{upower} 
            </if>            
        </where>
    </select>
</mapper>

Mapper.xml的文件路徑一般就是在SqlMapConfig.xml的全局文件中配置好,例如:

 <mappers>  
            <mapper resource="User.xml" />  
        <!-- <mapper resource="mapper/UserMapper.xml" /> -->  

2.2.3、會話工廠、會話
在準備好了我們 所需要的連接池信息和操作配置信息之後。就需要相應的程序段來執行這一數據庫語句,在MyBatis中這個核心主體就是會話工廠和會話
會話工廠,我們知道在設計模式中,工廠模式就對應着生成規範的對象的類。會話工廠是SqlSessionFactory的類。它根據配置文件中的信息。讀取之後加載相應的會話SqlSession的類實例對象。
2.2.4、執行器Executor 和底層對象封裝Mappered Statement
在以上步驟完成之後呢,就可以通過執行器Executor與底層封裝對象Mappered Statement的結合,這樣一來就實現了MyBatis與數據庫的交互。

3.MyBatis初探總結
MyBatis說到底也就是Java基本功能的一個封裝實現的類庫,和Hibernate框架一樣,作爲數據持久層存在。把Java中存在很多暗病的傳統JDBC形式進行抽象封裝。這也充分功能邏輯與數據配置的分離,各司其職的開發特點。更多關於MyBatis的學習在後續文章更新。

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