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())