# 你知道目前最流行的Mybatis框架嗎甸鸟?如何搭建呢惦费?
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-RC1PxHvV-1602464466559)(https://imgkr.cn-bj.ufileos.com/768074eb-5e03-4ad1-81ee-5432b6614e4a.jpg)]
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 抢韭。2013年11月遷移到Github薪贫。
iBATIS一詞來源于“internet”和“abatis”的組合,是一個**基于Java的持久層框架**刻恭。iBATIS提供的持久層框架包括**SQL Maps和Data Access Objects(DAO)**
MyBatis是一個支持**普通SQL查詢瞧省,存儲過程和高級映射**的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及對結(jié)果集的檢索封裝鳍贾。MyBatis可以使用**簡單的XML或注解用于配置和原始映射臀突,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄**贾漏。
mybatis不是一個完全的orm框架,Mybatis需要程序員自己寫sql藕筋,但是也存在映射(輸入?yún)?shù)映射纵散,輸出結(jié)果映射),**學(xué)習(xí)門檻mybatis比hibernate低隐圾;同時靈活性高伍掀,特別適用于業(yè)務(wù)模型易變的項目,使用范圍廣**暇藏。
簡單概括:**更加簡化jdbc代碼蜜笤,簡化持久層,sql語句從代碼中分離盐碱,利用反射把兔,將表中數(shù)據(jù)與java bean 屬性一一映射即ORM(Object Relational Mapping 對象關(guān)系映射) **
使用范圍:
在日常的開發(fā)項目中,如中小型項目瓮顽,例如ERP(Crm客戶關(guān)系管理系統(tǒng)县好,OA系統(tǒng)),需求與關(guān)系模型相對固定建議使用Hibernate,對于需求不固定的項目暖混,比如:**互聯(lián)網(wǎng)項目缕贡,建議使用mybatis**,因為**需要經(jīng)常靈活去編寫sql語句**拣播×肋洌總之,mybatis成為當(dāng)下必須學(xué)習(xí)掌握的一個持久層框架贮配。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-aw9ex5fF-1602464466565)(https://imgkr.cn-bj.ufileos.com/63b1bf51-5d8f-4ee0-954a-7210cb5a1943.png)]
## Mybatis框架搭建的方式
- 新建Maven項目
- log4j 日志添加
- resources目錄下配置文件添加
- 映射文件添加
- 實體類Customer添加
- 在父類工程pom獲取資源
- 測試
## 案例實操
### 1.新建Maven項目
**新建maven項目 ,pom文件添加依賴jar **
~~~ xml
<!-- mybatis jar 包依賴 -->
<dependency>?
? ? <groupId>org.mybatis</groupId>
? ? <artifactId>mybatis</artifactId>?
? ? <version>3.4.1</version>
</dependency>
<!-- 數(shù)據(jù)庫驅(qū)動 -->
<dependency>?
? ? <groupId>mysql</groupId>
? ? <artifactId>mysql-connector-java</artifactId>
? ? <version>5.1.39</version>
</dependency>
<!-- log4j日志打印 -->
<dependency>? ?
? ? <groupId>log4j</groupId>
? ? <artifactId>log4j</artifactId>?
? ? <version>1.2.16</version>
</dependency>
~~~
### 2.log4j 日志添加
在src/main/resources 資源包下添加log4j日志輸出properties文件谍倦,便于查看日志輸出信息
~~~ xml
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
#Consoleoutput...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
~~~
### 3.resources目錄下配置文件添加
新建mybatis.xml文件,并加入配置信息如下(數(shù)據(jù)庫名mybatis,表 user)
~~~xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration? PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
? ? ? ? "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 添加數(shù)據(jù)庫連接相關(guān)配置信息 -->
<configuration>
? ? <environments default="development">
? ? ? ? <environment id="development">
? ? ? ? ? ? <!-- 加入事務(wù)控制 -->
? ? ? ? ? ? <transactionManager type="jdbc" />
? ? ? ? ? ? <!-- 配置數(shù)據(jù)庫連接信息 -->
? ? ? ? ? ? <dataSource type="pooled">
? ? ? ? ? ? ? ? <property name="driver" value="com.mysql.jdbc.Driver" />
? ? ? ? ? ? ? ? <property name="url" value="jdbc:mysql://127.0.0.1:3306/spring-test" />
? ? ? ? ? ? ? ? <property name="username" value="root" />
? ? ? ? ? ? ? ? <property name="password" value=""/>
? ? ? ? ? ? </dataSource>
? ? ? ? </environment>
? ? </environments>
? ? <!-- mapper 配置文件指定 文件數(shù)量可配置多個-->
? ? <mappers>
? ? ? ? <mapper resource="com/xxx/mapper/CustomerMapper.xml" />
? ? </mappers>
</configuration>
~~~
對于標(biāo)簽的配置可能不會出現(xiàn)自動提示:
解決辦法:引入mybatis-3-config.dtd 文件
Window-preferences-搜索xml-xml catalog
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Ew3FMgVM-1602464466569)(https://imgkr.cn-bj.ufileos.com/5ae242b8-c51d-41e3-a3ac-7b6b1897a245.png)]
在User Specified Entries目錄下? add->
Locattion:http://mybatis.org/dtd/mybatis-3-mapper.dtd? ? (值與xml模板中對應(yīng))
Key Type:URI
Key:-//mybatis.org//DTD Mapper 3.0//EN? ? (值與xml模板中對應(yīng))
第二步:
關(guān)閉xml牧嫉,重新打開剂跟,如果重新打開不可以减途,重啟Eclipse即可。
最后點擊確定即可
### 4.映射文件添加
新建CustomerMapper.xml配置文件
~~~ xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
? PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
? "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
? 1.命名空間配置? 全局唯一? 包名+文件名
? 2.配置Mapped Statement
? 3. statement配置
? ? ? id 值聲明statement編號? 同一命名空間(同一文件)下不可重復(fù)
? ? ? parameterType? 輸入?yún)?shù)即占位符的數(shù)據(jù)類型? 類型可以是 基本數(shù)據(jù)類型,字符串,java bean ,map,list等
? ? ? resultType? ? 輸出結(jié)果? 類型可以是基本數(shù)據(jù)類型,字符串,java bean,map等
? ? ? statement 描述 即待執(zhí)行的sql?
? ? ? #{id}? 占位符? 變量名為id/value 均可? ${value}? 變量名必須為value 字符串拼接形式? 無法避免sql 注入? ?
-->
<mapper namespace="com.xxx.mapper.customerMapper">
? ? <!-- 查詢客戶-->
? ? <select id="queryCustomerById" parameterType="int" resultType="com.xxx.pojo.Customer">
? ? ? SELECT id,user_name 'userName',user_balance 'userBalance' FROM? yg_customer WHERE? id=#{id}
? ? </select>
</mapper>
~~~
### 5.實體類Customer添加
~~~ java
package com.xxx.pojo;
public class Customer {
? ? private? int id;
? ? private? String userName;
? ? private? String userBalance;
? ? public int getId() {
? ? ? ? return id;
? ? }
? ? public void setId(int id) {
? ? ? ? this.id = id;
? ? }
? ? public String getUserName() {
? ? ? ? return userName;
? ? }
? ? public void setUserName(String userName) {
? ? ? ? this.userName = userName;
? ? }
? ? public String getUserBalance() {
? ? ? ? return userBalance;
? ? }
? ? public void setUserBalance(String userBalance) {
? ? ? ? this.userBalance = userBalance;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return "Customer{" +
? ? ? ? ? ? ? ? "id=" + id +
? ? ? ? ? ? ? ? ", userName='" + userName + '\'' +
? ? ? ? ? ? ? ? ", userBalance='" + userBalance + '\'' +
? ? ? ? ? ? ? ? '}';
? ? }
}
~~~
### 6.在父類工程pom獲取資源
~~~ xml
<build>
? ? ? ? <resources>
? ? ? ? ? ? <resource>
? ? ? ? ? ? ? ? <directory>src/main/java</directory>
? ? ? ? ? ? ? ? <includes>
? ? ? ? ? ? ? ? ? ? <include>**/*.xml</include>
? ? ? ? ? ? ? ? </includes>
? ? ? ? ? ? </resource>
? ? ? ? ? ? <resource>
? ? ? ? ? ? ? ? <directory>src/main/resources</directory>
? ? ? ? ? ? ? ? <includes>
? ? ? ? ? ? ? ? ? ? <include>**/*.xml</include>
? ? ? ? ? ? ? ? ? ? <include>**/*.properties</include>
? ? ? ? ? ? ? ? </includes>
? ? ? ? ? ? </resource>
? ? ? ? </resources>
? ? </build>
~~~
### 7.測試
~~~ java
@Test
public void test() throws IOException {?
? ? /**? ? ?
? ? a)曹洽、讀取mybatis的配置文件? ?
? ? b)鳍置、加載配置文件創(chuàng)建SqlSessionFactory? ?
? ? c)、根據(jù)SqlSessionFactory創(chuàng)建SqlSession?
? ? d)送淆、通過sqlSession操作數(shù)據(jù)庫? ? ?
? ? e)税产、處理結(jié)果? ?
? ? f)、關(guān)閉session?
? ? */? ? ?
? ? /**? ?
? ? * 加載配置到內(nèi)存
? ? */?
? ? InputStream is= Resources.getResourceAsStream("mybatis.xml");? ?
? ? /**?
? ? *? 創(chuàng)建SqlSessionFactory 對象? hibernate 也是如此 必須先獲取SqlSessionFactory 實例化對象? ? ? */? ?
? ? SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);? ?
? ? /**? ?
? ? *? 獲取session以便操作數(shù)據(jù)庫?
? ? *? 參數(shù)一:指定UserMapper.xml 映射文件id? 必須加入命名空間? ?
? ? *? 參數(shù)二: 指定輸入?yún)?shù)? ?
? ? */? ?
? ? SqlSession session=factory.openSession();?
? ? Customer customer = session.selectOne("com.xxx.mapper.customerMapper.queryCustomerById", 2);
? ? /**? ?
? ? * 將返回的結(jié)果輸出? ?
? ? */?
? ? ? System.out.println(customer);
? ? /**?
? ? * 操作完數(shù)據(jù)庫 關(guān)閉session? ?
? ? */?
? ? session.close();
}
~~~
## 擴(kuò)展
### MyBatis 框架體系結(jié)構(gòu)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-oNWfSB4T-1602464466574)(https://imgkr.cn-bj.ufileos.com/71894e06-f527-4e91-ae25-8a5cac546481.png)]
說明:
#### 1 Configuration-mybatis配置
1)偷崩、與spring 一樣,可以通過配置文件或注解的形式進(jìn)行配置;
2)辟拷、**mybatis.xml,此文件作為mybatis的全局配置文件阐斜,配置了mybatis的運(yùn)行環(huán)境等信息**;
3)衫冻、mapper文件即sql映射文件,文件中配置了操作數(shù)據(jù)庫的sql語句谒出。**此文件需要在mybatis.xml中加載**隅俘。
4)、有了配置文件后笤喳,通過mybatis環(huán)境等配置信息構(gòu)造**SqlSessionFactory**即會話工廠
5)为居、由會話工廠創(chuàng)建**sqlSession**即會話,操作數(shù)據(jù)庫需要通過sqlSession進(jìn)行
6)杀狡、sqlSession使用Executor(數(shù)據(jù)庫操作執(zhí)行器接口)操作數(shù)據(jù)庫蒙畴,同Executor 具體實現(xiàn)類實現(xiàn)指定dao 層數(shù)據(jù)訪問操作。
#### 2 Mapped Statement
框架底層封裝對象(sql語句呜象、輸入?yún)?shù)膳凝、輸出結(jié)果類型),它包裝了mybatis配置信息及sql映射信息等董朝,mapper文件(即Mapper.xml)中一個sql對應(yīng)一個Mapped Statement對象鸠项,sql的id即是Mapped statement的id。
#### 3 Sql的輸入映射參數(shù)
基本和簡單類型子姜、HashMap祟绊、自定義POJO等。輸入?yún)?shù)映射就是jdbc編程中對preparedStatement設(shè)置參數(shù)哥捕,Executor通過Mapped Statement在執(zhí)行sql前將輸入的java對象映射至sql中牧抽。
#### 4 Sql的輸出映射參數(shù)
基本和簡單類型、HashMap遥赚、自定義POJO扬舒。 Statement對sql執(zhí)行輸出結(jié)果進(jìn)行定義,輸出結(jié)果映射過程相當(dāng)于jdbc編程中對結(jié)果的解析處理過程凫佛,Executor通過Mapped Statement在執(zhí)行sql后將輸出結(jié)果映射至java對象中讲坎。
#### 3 Sql的輸入映射參數(shù)
基本和簡單類型孕惜、HashMap、自定義POJO等晨炕。輸入?yún)?shù)映射就是jdbc編程中對preparedStatement設(shè)置參數(shù)衫画,Executor通過Mapped Statement在執(zhí)行sql前將輸入的java對象映射至sql中。
#### 4 Sql的輸出映射參數(shù)
基本和簡單類型瓮栗、HashMap削罩、自定義POJO。 Statement對sql執(zhí)行輸出結(jié)果進(jìn)行定義费奸,輸出結(jié)果映射過程相當(dāng)于jdbc編程中對結(jié)果的解析處理過程弥激,Executor通過Mapped Statement在執(zhí)行sql后將輸出結(jié)果映射至java對象中。
這里使用Maven 工程愿阐,對應(yīng)的mybatis jar包下載通過maven 倉庫統(tǒng)一管理下載微服。
需要項目資料源碼+我們程序員小姐姐v:lezijie007(加好友時備注:B站-LT,不備注拒絕添加喲)