1. 程式人生 > >經典三層框架初識--一.Mybatis

經典三層框架初識--一.Mybatis

  • 編寫java專案
    • 對於Mybatis來說有兩種配置檔案--咱們這裡用xml
      • 全域性配置:至少四個引數 (驅動 url username password)-->來配置連線池
      • <?xml version="1.0" encoding="UTF-8"?>
        <!-- 框架需要讀取配置檔案,如果你隨便寫,它就不會認識 ,所以一般情況下都會給這個xml進行一下約束
        	 就是規定你可以寫哪些標籤,以及哪些標籤代表什麼含義,框架來說就是讀取指定的標籤,來獲取裡面的值
        -->
        <!-- 
        XML 配置檔案(configuration XML)中包含了對 MyBatis 系統的核心設定,
        包含獲取資料庫連線例項的資料來源(DataSource)和決定事務作用域和控制方式的事務管理器(TransactionManager)。
        XML 配置檔案的詳細內容後面再探討,這裡先給出一個簡單的示例:
        
        http://www.mybatis.org/mybatis-3/zh/getting-started.html官網入門案例中抄過來的
        資料來源->連線池      TransactionManager->事務管理器
        下面的這一段做了兩件事:連線池的配置  事務管理器的配置  抄過來
         -->
         <!-- 
         這一標籤的這麼大段就是要求你如何寫xml文件
         DOCTYPE->文件型別  configuration是xml文件的根標籤   
         xml的描述檔案(約束檔案):一般是dtd或者是schema->用來約束標籤,告訴你裡面能寫什麼標籤以及標籤的順序
         
          -->
         
        <!DOCTYPE configuration
          PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-config.dtd">
        <configuration>
          <!-- 環境,和context上下文類似(以後進行的增刪改查的操作都在這個環境中,都在這個上下文中):
          	複數:可以配置多個環境,資料庫種類不同;軟體的本地環境,預上線平臺,線上環境等,可以寫很多,但是用的時候是一個 
          	default:預設使用環境,這裡的就是下面environment的id表示;這裡default肯定和下面某一個environment的id值一樣
          	-->
          <environments default="development">
          	<!-- 一個環境,id:這個環境的唯一標示
          		如果id是product表示線上環境
          	 -->
            <environment id="development">
              <!-- 事務管理器:事務的管理和策略
              		JDBC 只是Mybatis框架裡的一個管理器
               -->
              <transactionManager type="JDBC"/>
              <!-- 資料來源:管理連線池
              		儲存的是連線  解決頻繁的開啟關閉連線 如果瞭解過小沒有必要--意味著連線池不一定好 但是連線數過大會很不錯
              		下面也僅僅是Mybatis裡面的連線池  流行的連線池:dbcp/c3p0/droid/jdbcTemplate都是連線池,這裡是僅僅配置Mybatis中的連線池
              		
              		dataSource這個標籤就是對應一個物件,下面的property的name就是這個物件的四個屬性
              		
               -->
              <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>  <!-- 這裡咱們先手動填入引數 com.mysql.jdbc.Driver 來代替佔位符裡面的內容,後面再講用佔位符-->
                <property name="url" value="${url}"/> <!--jdbc:mysql:///db1808?useSSL=true -->
                <property name="username" value="${username}"/><!-- root-->
                <property name="password" value="${password}"/><!-- root-->
              </dataSource>
            </environment>
          </environments>
          <!-- 對映器:配置對映檔案的路徑,我們前面說過,配置檔案由兩種 
          	這裡就是 告訴我們配置的這個mybatis全域性配置檔案 對映配置檔案的路徑在什麼地方
          		
           -->
          <mappers>
            <mapper resource="UserMapper.xml"/>
          </mappers>
        </configuration>
      • 對映配置:定製化sql,輸入引數和輸出結果對映 --這個對我們來說更為重要,是真正處理我們的業務
      • <?xml version="1.0" encoding="UTF-8"?>
        <!-- 對映配置檔案:主要是寫怎麼做增刪改查 ,如何實現輸入引數和輸出結果對映____定製化sql的配置
        	咱們這個例子:就是根據id查到一個記錄,把記錄中的各個欄位封裝到一個物件中的各個屬性中區
        -->
        <!-- 
        	http://www.mybatis.org/mybatis-3/zh/getting-started.html中探究已對映的 SQL語句這一部分
        	將這裡面的例項也抄到下面
         -->
        <!-- 下面和mybatis類似,也是規範標籤的寫法 -->
        
        <!DOCTYPE mapper
          PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
          
        <!-- 下面namespace是名稱空間 ,本質上就是一個字串,作用是隔離SQL-->
        
        <mapper namespace="adhs">
          
          <!-- 增刪改查  -->
          <insert id=""></insert>
          <update id=""></update>
          <delete id=""></delete>
          
          <!-- 我們案例要做的是根據uid查詢userinfo的物件 
          	這裡的佔位符不是?了,是#{}
          	這裡面最終的值是輸入引數傳進來的 ,給到#{}裡
          		關鍵字:
          			和輸入引數的型別有關係
          			簡單型別:可任意寫
          			引用:屬性名稱 
          		
          		id:標籤的唯一標識
          		parameterType="" -引數的型別,可選的,可寫可不寫  簡單型別
          											   引用型別
          		resultType="" 輸出結果型別,通過sql查詢出來的結果,需要封裝到一個物件中,這個物件是什麼,需要這個來宣告
          					 注意:我們寫的是全限定名稱
          					 我們要根據全限定名稱來建立一個物件,最後把結果封裝到這個物件裡面去,這個過程不用我們去做,Mybatis自動幫我們做了
          -->
          <!-- 這裡的insert,select..標籤就代表我們以前Statement(或其子介面)的物件 ,id就是相當於物件的名稱-->
          <select id="selectUser"  resultType="pojo.UserInfo">
            select * from userinfo where uid = #{uid}
          </select>
          
          <!-- 這裡我們來理解一下上面的名稱空間是如何隔離sql的
          	多個mapper用這個名稱空間來區分
           -->
        </mapper>
        
        
        
        
      • 這裡我們還需要一個類,來作為儲存我們記錄的封裝物件

      • package pojo;
        
        public class UserInfo {
        	private int uid;
        	private String username;
        	private String password;
        	public int getUid() {
        		return uid;
        	}
        	public void setUid(int uid) {
        		this.uid = uid;
        	}
        	public String getUsername() {
        		return username;
        	}
        	public void setUsername(String username) {
        		this.username = username;
        	}
        	public String getPassword() {
        		return password;
        	}
        	public void setPassword(String password) {
        		this.password = password;
        	}
        	@Override
        	public String toString() {
        		return "UserInfo [uid=" + uid + ", username=" + username + ", password=" + password + "]";
        	}
        	
        	
        }
        
    • 讀取配置執行測試

      • Sqlsession:面向開發者介面--在這個接口裡面,提供了很多傳送SQL的命令,拿到這個介面的實現類物件就能直接傳送SQL了

      • Sqlsession的建立是通過工廠模式建立管理的  SqlSessionFactory:session工廠,建立和管理session物件需要讀取配置檔案才能創建出來

      • package test;
        
        import java.io.IOException;
        import java.io.Reader;
        
        import org.apache.ibatis.io.Resources;
        import org.apache.ibatis.session.SqlSession;
        import org.apache.ibatis.session.SqlSessionFactory;
        import org.apache.ibatis.session.SqlSessionFactoryBuilder;
        
        import pojo.UserInfo;
        
        public class Test {
        
        	public static void main(String[] args) throws IOException {
        		//讀取配置檔案
        		//mybatis提供了一個讀取配置檔案轉換為輸入流的方法
        		Reader reader = Resources.getResourceAsReader("mybatis.xml");
        		//得到工廠的方法
        		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
        		//傳送定製好的SQL
        		
        		//通過工廠拿到物件
        		SqlSession session = ssf.openSession();
        		//封裝到物件裡面去
        //		session.selectOne(String statement, Object parameter)  uid的值
        		UserInfo info = session.selectOne("adhs.selectUser", 1);
        		System.out.println(info);
        		//歸還連線
        		session.close();
        		
        	}
        
        }