昨天講解了如何給配置文件導入約束,今天完成配置之後就可以連接到Mysql資料庫,首先說一下SqlMapConfig.xml中標籤的作用。
大家看一下,environments 是它的環境標籤,在這個標籤裡面有一個
transactionManager標籤:這是指定一個事物管理器。
dataSource標籤是數據源的意思:
property標籤:這是一個數據結構,繼承自HashTable,這裡不說hashtable和hashmap的區別,大體知道他是一個Key,一個Value,所以是map結構。
第一個property:name就是name,隨便寫,這裡寫個driver告訴你這個是個驅動,這裡面的key都可以隨便寫,我們真正使用的只是value而已,key
只是找到value的一個引用,用K,V的結構能更清晰讓人看懂,也是用Key來對Value作一個說明。這裡的Value寫JDBC到Mysql驅動的全包名,注意一定要寫全包名,同時不可以創建相同名字的Java類,規定是這樣的,不然他會找不到驅動文件的位置,如果你和jdbc起了同樣的名字,那麼該配置文件的加載順序有可能會出錯,到時候會報錯。
第二個property:Mysql連接的url,它的正確結構是:jdbc:mysql://localhost:3306/database
這是基本的格式,第一段jdbc是它的連接方式,通常不變,貌似c語言還是c#的叫做cdbc,所以你應該懂jdbc的意思第二段mysql是資料庫類型,如果你連oracle就寫oracle也很簡單,第三段是你的資料庫的網絡地址,如果安裝在本機就寫localhost,如果安裝在其他電腦就寫它的ip地址如:32.154.46.854
這個IP是我編的,同在一個內網寫就寫192.168.1.56這種。第四段3306是mysql資料庫默認的埠號,我知道tomcat的埠號是可以改的,所以這個應該也可以改,至於埠號是做什麼的我也不太清楚,這個涉及作業系統原理,貌似和埠映射有關?大家知道常用埠號多少即可,第五段是你的資料庫名字,這個資料庫不是你windows,mysql.exe 這個mysql的名字,而是在你的資料庫裡面它分為很多database, 這裡寫database的名字,千萬不要寫mysql。oracle也一樣。前面固定格式說完了,就是jdbc:mysql://localhost:3306/database ,通常變化的只有localhost和database兩個欄位。然後看我後面加了一個?號對吧,?後面跟的是參數,大家看瀏覽器地址欄,當我們進入一個網頁之後地址欄除了該頁面的地址外還會有?加上一串參數,這個是get類型的請求,?後面的東西可以隨便寫,但是資料庫之後讀取固定Key後的value值,比如你在後面寫個?1+2=5是沒有影響的。characterEncoding=utf-8"意思為將資料庫字符集設為UTF-8,這個國際通用編碼不會出現亂碼的情況。如果連接到的資料庫是iso8859-1,你的電腦是GBK或者是UTF-8的話就會出現亂碼。指定這個字符集不會出現亂碼的情況。
第三個property:用戶名,username是給你看的,root是給mysql看的。
第四個property:密碼,password是給你看的,123456是給mysql看的。
然後我們創建一個mapper映射文件,文件名就是你的pojo類名.xml,也可以隨便取,但是這樣便於閱讀。pojo類作為mybatis進行sql映射使用,pojo類通常與資料庫表對應也叫entity,也叫domain。反正就是將資料庫裡的錶轉為一個面向對象的類,裡面包含了表裡的欄位,每一個類對應資料庫裡的一張表。mapper映射文件也需要一段約束,講下面文字複製到xml中即可,它的作用相當於HTML中的header。
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
這個文件裡面是用來寫Mybatis的sql語句的。
那麼這個mapper文件如果被框架加載到的呢?我們之前說過mybatis框架只會加載固定名字的SqlMapConfig,xml,於是我們在SqlMapConfig,xml中加入另一個標籤,引入mapper文件的地址。
在environments標籤下另起一個標籤,注意mappers和environments屬同級別,不要寫到裡面去。mappers相當於一個集合,我們現在裡面寫一個<mapper/> 然後在/的前面按ctrl+/,會提示你幾個選擇class,url,resource。這幾個都可以表示路徑,大家使用resource即可。resource是SqlMapConfig.xml的相對路徑,如果他倆同級,那麼他們的父目錄可以省略,直接寫位置。注意這裡不是文件名,而是相對於SqlMapConfig.xml的相對路徑,如果mapper文件在SqlMapConfig.xml的同級目錄下,假設這個同級目錄叫aa,那麼寫法就是aa/Ljq.xml,如果SqlMapConfig.xml的父目錄與cc同級,則為../aa/Ljq.xml。此外絕對路徑和相對路徑初學者們很多會混淆,大家不如不明白可以自己多試試。./表同級目錄下,通常省略,../表父目錄。
現在我們創建一個測試類,來試試mybatis這個框架是否能夠成功執行。
首先我們new一個SqlSessionFactoryBuilder的實例,大家看到我寫的了。用的其實是它的build()這個方法,所以讓builder實例處於游離狀態,用一下build()方法就完事,它的生命周期是轉瞬即逝的。哈哈,其實沒什麼卵用,也不會節省多少資源,但是逼格會高。參數需要我們傳入配置文件,你們看他有很多參數,我們的配置寫在xml裡,所以選哪一個呢?都可以哈哈。
大家看到這一段代碼就會明白,哦原來SqlMapConfig.xml的名字不是固定的呀,確實是這樣,但是通常寫SqlMapConfig.xml屬於一種行內規範。首先我們需要一個SqlSessionFactory 實例用來創建session對象,它·封裝的挺複雜大家可能稍微難理解。我們每一條連接都是一個session,這裡想當於一個工廠類幫我們控制了Session創建,不會交給你讓你自己隨便創建的。
下面我用另一種寫法大家一下就能看出來參數是什麼了。
resource.getR.....是一個InputStream輸入流,然後在bulid()參數內把流放進去。大家可以看到有好幾個都是靜態方法,不給你創建實例的。所以說框架可能是出於安全的原因或是什麼,不是所有東西都對開發者開放的。
我們通過session工程為我們打開一個session,然後用這個session對象就可以執行SQL語句了。那麼sql語句寫在哪裡呢?
Mybatis的sql是寫在mapper文件裡的,就是我們剛才的Ljq.xml。 先說一個它裡面的標籤
<mapper></mapper>這個是根標籤,所有的語句寫在它裡面 它有一個屬性是namespace,命名空間,你可以理解為java裡面的包名。為了區分不同的sql語句,命名空間也就是前綴,其實很多場景都會用到的,目的只有一個更好的幫助人還是機器區分。
<select>標籤就是表示這是個select語句,可能是用於區分不同語句對事務的控制吧,你同樣的一條sql寫在select和delete標籤裡面消耗的資源是不一樣的。屬性也是不一樣的。看select有一條屬性叫做id,他是作什麼用的呢?看上面圖,大家可以把ID當做方法名,或者sql名,在我們執行sql的時候session對象需要知道執行的是哪一條sql,這時候填寫id就對。同時要注意,namespace命名空間是不可以為empty的,不然會報錯,所以正確寫法是以String形式,寫namespace.id。這樣session對象就可以找到到底執行哪一條sql語句了。resultType是返回值類型,我寫的是我的pojo類對象,所以在列印的時候會直接列印Ljq.toString()的內容。
下面我們一起來看看查詢結果吧。它警告我了,說我在SqlMapConfig.xml裡寫的url太老了,現在它jdbc驅動已經改名了,名字是mysql-connector-java,大家如果沒有可以在maven裡搜索mysql-connector-java,剛才試了下 搜索jdbc的話已經搜不到了。
最後給大家說一下這個框架的執行過程。從我們代碼裡面走,首先SqlSessionFactory去加載SqlMapConfig.xml,裡面的運行環境,包含連接到數據的mysql-connector-java這個驅動jar,url,用戶名密碼等,然後依次加載mapper文件中的內容。加載之後全部信息正確的話進行下一步,創建Session工廠對象,Session工廠對象創建一個Session對象,然後通過這個Session對象執行mapper中的sql語句,這時候框架通過ssl協議拿到數據執行sql結果的數據返回到我們的java對象中,最後列印出的就是資料庫中查詢到得結果。
可能有點長,但是我儘量給大家說的清晰一些,想到的知識點也會補充一些,希望大家耐心一些慢慢消化,有不明白的地方在下方留言即可。