Mybatis

1、Mybatis簡介
一、什麼是mybatishtml

Mybatis是由apache提供的一個針對持久層開源框架,對JDBC訪問數據庫的過程進行了簡化和封裝
使用mybatis能夠只關注SQL語句自己,而不須要關注(JDBC中的)註冊驅動、獲取鏈接、獲取傳輸器、釋放資源等過程。
mybatis能夠將要執行的SQL語句使用xml文件的方式或者註解方式配置起來,在執行時,將Java對象中攜帶的參數值和SQL骨架進行映射,生成最終要執行的SQL語句,將執行的結果處理後再返回。

二、mybatis的一些優點java

1)JDBC鏈接訪問數據庫有大量重複的代碼,而mybatis能夠極大的簡化JDBC代碼
    註冊驅動、獲取鏈接、獲取傳輸器、釋放資源
2)JDBC沒有自帶鏈接池,而mybatis自帶的有鏈接池
3)JDBC中是將SQL語句、鏈接參數寫死在程序中,而mybatis是將SQL語句以及鏈接參數都寫在配置文件中。
4)JDBC執行查詢後獲得的ResultSet咱們須要手動處理,而mybatis執行查詢後獲得的結果會處理完後,將處理後的結果返回。

2、mybatis的快速入門程序
一、準備數據:mysql

執行 /unit08-mybatis/sql腳本.txt 文件中的全部sql語句,建立yonghedb庫,並建立emp表,往emp表中插入若干條記錄。

二、建立項目、導入jar包、提供測試類sql

2.1.建立的Maven的java項目:CGB-Mybatis-01
2.2.在項目的pom文件中導入依賴:junit、mysql驅動、mybatis、log4j等
2.3.建立com.tedu.MybatisTest01測試類
    -------------------------------
    <dependencies>
        <!-- 引入mybatis依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <!-- 引入mysql驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!-- 引入單元測試的依賴 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
        <!-- 引入日誌框架的依賴 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>
    </dependencies>
    -------------------------------

三、提供配置文件(mybatis-config.xml、EmpMapper.xml)數據庫

3.1.提供mybatis-config.xml文件
    mybatis-config文件中主要配置了事務管理方式、鏈接數據庫的參數、導入mapper文件
3.2.提供EmpMapper.xml文件
    EmpMapper文件主要配置未來要執行的SQL語句(查詢、新增、刪除、修改)

四、提供Emp實體類apache

若是要查詢全部的員工信息,員工信息查詢出來後須要封裝到Java對象中
由於這裏須要提供的Emp(員工)類,這個類用於封裝全部的員工信息
com.tedu.pojo.Emp
有哪些信息(數據)須要封裝到Emp類中,就在Emp類中提供什麼的屬性/變量
在Emp中提供4個變量(id、name、job、salary)分別用來封裝emp表中的id、name、job、salary四列數據。
再提供4個變量(id、name、job、salary)對應的Get和Set方法
----------------------------------------------------
1) 什麼是POJO?
    plain old/ordinary java object: 簡單java對象, 專指用於封裝數據的對象
    例如: 爲了封裝員工信息, 咱們能夠提供一個Emp類來封裝員工信息
2) id和salary爲何不用基本數據類型而是使用包裝數據類型?
    基本數據類型有默認值, 例如 int類型變量默認值是0, 若是使用包裝類型,默認值爲null
    默認值爲0,有時影響咱們的判斷(例如,一個int類型的變量爲0,咱們沒法區分0是賦的值仍是默認值)
3) Emp類中的變量名爲何要和emp表中的列名保持一致?
    框架在將查詢的結果封裝到Emp對象中時,就是經過emp表中的列名(id,name,job,salary)
    生成對應的set方法( setId, setName, setJob, setSalary ), 將查詢的結果封裝到Emp對象中
    若是沒有set方法, 也是經過emp表中的列名(id,name,job,salary)找到Emp類中的
    變量(id,name,job,salary), 經過暴力反射將查詢的結果封裝到Emp對象中。
----------------------------------------------------

3、MyBatis中的佔位符
0、啓用log4j日誌框架: 專門爲Java語言提供的一套日誌框架,能夠經過log4j打印程序中執行的日誌信息設計模式

因爲mybatis默認已經整合了log4j,使用log4j只須要完成如下兩步操做:
1)添加log4j的jar包
2)添加log4j的配置文件(文件名必須是log4j.properties,文件必需要放在類目錄下)
    由於log4j底層就是到類目錄下找名稱爲log4j.properites的文件

一、#{}佔位符: 其實就是JDBC中的問號(?)佔位符,在mybatis底層會將 #{}佔位符翻譯成問號(?)佔位符服務器

若是在SQL語句中佔位符只有一個#{}佔位符,{}中名稱沒有要求,但不能是空的; 參數能夠直接傳遞,不用封裝;
若是在SQL語句中的#{}佔位符不止一個,參數值須要經過Map或者POJO對象進行封裝;

若是經過Map集合來封裝SQL參數值,#{}佔位符中的名稱要和Map中的key保持一致!!!
    由於在mybatis底層是經過#{}佔位符中的名稱,做爲key,到map中獲取對應的value;
若是經過POJO對象來封裝SQL參數值,#{}佔位符中的名稱要在POJO對象中有對應的getXxx方法,或者有對應的變量
    例如:#{job}佔位符中的名稱爲job,那麼就意味着,在Emp中要有getJob()方法或者有job變量,若是二者都有,會優先經過getXxx方法來獲取POJO對象中存儲的屬性值,若是沒有getXxx方法,會經過暴力反射直接獲取Emp中job變量的值。

總結: 在Mybatis框架中,大部分狀況都是用#{}佔位符,#{}其實就是JDBC中的問號(?)佔位符,是爲SQL語句中的【參數值】進行佔位。例如:
    查詢:select * from emp where job=參數值 and salary>參數值
    新增: insert into emp value(null, 參數值, 參數值, 參數值)
    修改: update emp set 列=參數值, 列=參數值, .. where 列=參數值...
    刪除: delete from emp where 列=參數值...

二、${}佔位符:session

select * from emp where id>5;
${}佔位符: 是爲SQL語句中的某一個SQL片斷進行佔位,將參數傳遞過來時,是直接將參數拼接在${}佔位符所在的位置,由於是直接拼接,因此可能會引起SQL注入攻擊,所以不推薦大量使用!
    若是SQL語句中只有一個#{}佔位符,參數能夠不用封裝,直接傳遞便可!
    但若是SQL語句中哪怕只有一個${}佔位符,參數也必須得先封裝到Map或者POJO對象中,再把Map或者POJO對象傳遞過去!
    mybatis底層在執行SQL語句時,使用的就是PreparedStatement對象來傳輸SQL語句!

PreparedStatement: 能夠防止SQL注入攻擊
    1)先將SQL骨架發送給數據庫服務器進行編譯並肯定下來(骨架一旦肯定,就沒法更改)
        王海濤
        select * from emp where name=?
    2)再將SQL中的參數傳遞給服務器(此時若是參數中再包含關鍵字或者SQL特殊字符串,也不能影響骨架,只會被當成普通的文原本處理!)

4、Mapper接口開發mybatis

mapper接口開發要知足如下四個規則:
1)寫一個接口,要求接口的全類名(包名+接口名) 要等於mapper文件的namespace值
    namespace=接口的全類名
2)mapper文件中要執行的SQL,在接口中得有對應的接口方法,並且SQL標籤的id值要等於方法名
    SQL語句的id值=方法名
    namespace+SQL語句的id值 = 接口的全類名+方法名
3)若是是查詢SQL,resultType屬性中指定的類型,要和接口方法的返回值類型保持一致
    (若是接口方法返回的是List集合,resultType屬性只須要指定集合中的泛型)
4)SQL標籤上的參數類型(能夠省略) 要和 接口方法的參數類型保持一致

/* 1.獲取EmpMapper接口的實現類實例
 *    框架底層能夠根據getMapper方法接收的EmpMapper接口的字節碼對象,提供接口的實現類,
 *    並根據接口的實現類,建立實現類的實例,同時也能夠獲取接口的全類名(=namespace)
 */
EmpMapper mapper = session.getMapper(EmpMapper.class);
/* 2.調用findAll01方法
 *     框架底層能夠在執行findAll01方法時,根據上面獲取的
 *     接口全類名(=namespace)+當前方法名(=SQL標籤的id值), 
 *     就能夠定位到要執行的SQL語句, 執行完SQL語句後,對結果進行封裝處理,將處理完的結果再返回!
 */
List<Emp> list = mapper.findAll01();

5、內容補充
一、xml方式和註解方式開發的區別

xml方式:1)缺點:相比註解配置起來比較麻煩
    2)優勢:xml配置的內容能夠隨時修改,改完以後不用從新編譯、從新發布
註解方式:1)缺點:仍是將配置寫在Java類中,若是未來一旦發生變化,還須要修改java源文件,改完以後仍須要從新編譯,從新發布。
    2)優勢:配置起來比xml要簡潔不少。

6、MVC設計模式
一、模式一: 只用JSP

Servlet: 處理服務器接收過來的請求,Servlet不適合輸出一個完整的html網頁
HTML: 本就是網頁的開發技術,能夠做爲網頁輸出,可是HTML沒法展現動態數據
JSP: 也是網頁的開發技術(本質是Servlet),能夠輸出網頁,也能夠經過Java代碼展現動態的數據
    JSP的出現既解決了Servlet不適合輸出網頁的問題,同時也解決了HTML沒法展現動態數據的問題
    JSP能夠實現Servlet所實現的功能,也能夠做爲html開發網頁。
    不少人開始在開發項目時只用JSP
        1)JSP負責獲取請求中攜帶的參數(若是有)
        2)JSP負責對請求進行處理
        3)JSP負責鏈接並訪問數據(JDBC代碼)
        4)JSP還負責展現請求處理的結果
    但若是隻用JSP開發項目,JSP中必然要寫不少的Java代碼,JSP中的代碼將會變得很是的混亂,後期難以維護,並且代碼沒法複用!

二、模式二:Servlet+JavaBean+JSP (符合MVC設計模式)

Servlet(Controller:控制器): 
        1) 負責接收請求中的參數(若是有)
        2) 負責調用JavaBean中的方法對請求進行處理
        3) 負責調用JSP,由JSP負責展現請求處理的結果
    JavaBean(Model:模型): 
        1) 封裝數據(POJO)
        2) 處理業務邏輯
        3) 訪問數據庫
    JSP(View:視圖): 
        只負責展現請求處理的結果

    JavaBean: 就是一個普通的Java類,提供的有私有屬性,能夠經過屬性封裝數據,也能夠提供業務方法,經過業務方法處理業務邏輯,以及訪問數據庫。
        實體bean(POJO): 專門用於封裝數據的java類
        業務bean: 專門處理業務邏輯的java類
        Emp: (id,name,job,salary,get/set,findAll())
相關文章
相關標籤/搜索