Mybatis第六篇【配置文件和映射文件再解讀、佔位符、主鍵生成與獲取、Mapper代理】

配置文件和映射文件再解讀

映射文件

在mapper.xml文件中配置不少的sql語句,執行每一個sql語句時,封裝爲MappedStatement對象,mapper.xml以statement爲單位管理sql語句css

Statement的實際位置就等於namespace+StatementIdjava

配置文件

別名

typeAliases別名:mysql

這裏寫圖片描述

自定義別名:程序員

<!-- 定義 別名 -->
    <typeAliases>
        <!-- 單個別名的定義 alias:別名,type:別名映射的類型 -->
        <!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
        <!-- 批量別名定義 指定包路徑,自動掃描包下邊的pojo,定義別名,別名默認爲類名(首字母小寫或大寫) -->
        <package name="cn.itcast.mybatis.po"/>

    </typeAliases>

這裏寫圖片描述

Mapper加載

<mappers>
        <!-- 經過resource引用mapper的映射文件 -->
        <mapper resource="sqlmap/User.xml" />
        <!-- <mapper resource="mapper/UserMapper.xml" /> -->
        <!-- 經過class引用mapper接口 class:配置mapper接口全限定名 要求:須要mapper.xml和mapper.java同名而且在一個目錄 中 -->
        <!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
        <!-- 批量mapper配置 經過package進行自動掃描包下邊的mapper接口, 要求:須要mapper.xml和mapper.java同名而且在一個目錄 中 -->
        <package name="cn.itcast.mybatis.mapper"/>
    </mappers>

Mybatis解決JDBC編程的問題

一、數據庫連接建立、釋放頻繁形成系統資源浪費從而影響系統性能,若是使用數據庫連接池可解決此問題。sql

  • 解決:在SqlMapConfig.xml中配置數據連接池,使用鏈接池管理數據庫連接。

二、Sql語句寫在代碼中形成代碼不易維護,實際應用sql變化的可能較大,sql變更須要改變java代碼。數據庫

  • 解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離

三、向sql語句傳參數麻煩,由於sql語句的where條件不必定,可能多也可能少,佔位符須要和參數一一對應。編程

  • 解決:Mybatis自動將java對象映射至sql語句,經過statement中的parameterType定義輸入參數的類型

四、對結果集解析麻煩,sql變化致使解析代碼變化,且解析前須要遍歷,若是能將數據庫記錄封裝成pojo對象解析比較方便。markdown

  • 解決:Mybatis自動將sql執行結果映射至java對象,經過statement中的resultType定義輸出結果的類型

佔位符

在Mybatis中,有兩種佔位符session

  • #{}解析傳遞進來的參數數據
  • ${}對傳遞進來的參數原樣拼接在SQL中

主鍵生成策略

若是咱們在Hibernate中,當咱們插入數據的時候,咱們是能夠選擇是UUID策略的…mybatis

那麼在Mybatis是怎麼作的呢??

UUID

<!-- mysql的uuid生成主鍵 -->
    <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
        <selectKey keyProperty="id" order="BEFORE" resultType="string">
            select uuid()
        </selectKey>

        INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
    </insert>

主鍵返回

若是咱們通常插入數據的話,若是咱們想要知道剛剛插入的數據的主鍵是多少,咱們能夠經過如下的方式來獲取

需求:

  • user對象插入到數據庫後,新記錄的主鍵要經過user對象返回,經過user獲取主鍵值。

解決思路:

  • 經過LAST_INSERT_ID()獲取剛插入記錄的自增主鍵值,在insert語句執行後,執行select LAST_INSERT_ID()就能夠獲取自增主鍵。

mysql:

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
        <selectKey keyProperty="id" order="AFTER" resultType="int">
            select LAST_INSERT_ID()
        </selectKey>
        INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
    </insert>

oracle:

實現思路:

  • 先查詢序列獲得主鍵,將主鍵設置到user對象中,將user對象插入數據庫。
<!-- oracle 在執行insert以前執行select 序列.nextval() from dual取出序列最大值,將值設置到user對象 的id屬性 -->
    <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
        <selectKey keyProperty="id" order="BEFORE" resultType="int">
            select 序列.nextval() from dual
        </selectKey>

        INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
    </insert>

Mapper代理方式

Mapper代理方式的意思就是:程序員只須要寫dao接口,dao接口實現對象由mybatis自動生成代理對象。

通過咱們上面的幾篇博文,咱們能夠發現咱們的DaoImpl是十分重複的…

1 dao的實現類中存在重複代碼,整個mybatis操做的過程代碼模板重複(先建立sqlsession、調用sqlsession的方法、關閉sqlsession)

二、dao的實現 類中存在硬編碼,調用sqlsession方法時將statement的id硬編碼。


之前的重複代碼和硬編碼以下

public class StudentDao {

    public void add(Student student) throws Exception {
        //獲得鏈接對象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        try{
            //映射文件的命名空間.SQL片斷的ID,就能夠調用對應的映射文件中的SQL
            sqlSession.insert("StudentID.add", student);
            sqlSession.commit();
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }
    }
    public static void main(String[] args) throws Exception {
        StudentDao studentDao = new StudentDao();
        Student student = new Student(3, "zhong3", 10000D);
        studentDao.add(student);
    }
}

Mapper開發規範

想要Mybatis幫咱們自動生成Mapper代理的話,咱們須要遵循如下的規範:

一、mapper.xml中namespace指定爲mapper接口的全限定名

  • 此步驟目的:經過mapper.xml和mapper.java進行關聯

二、mapper.xml中statement的id就是mapper.java中方法名

三、mapper.xml中statement的parameterType和mapper.java中方法輸入參數類型一致

四、mapper.xml中statement的resultType和mapper.java中方法返回值類型一致.

再次說明:statement就是咱們在mapper.xml文件中寫sql指定的id

Mapper代理返回值問題

mapper接口方法返回值:

  • 若是是返回的單個對象,返回值類型是pojo類型,生成的代理對象內部經過selectOne獲取記錄
  • 若是返回值類型是集合對象,生成的代理對象內部經過selectList獲取記錄。
相關文章
相關標籤/搜索