MyBatis 本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。
iBATIS一詞來(lái)源于“internet”和“abatis”的組合,是一個(gè)基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)
MyBatis是一個(gè)支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及對(duì)結(jié)果集的檢索封裝。MyBatis可以使用簡(jiǎn)單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。
mybatis不是一個(gè)完全的orm框架,Mybatis需要程序員自己寫(xiě)sql,但是也存在映射(輸入?yún)?shù)映射,輸出結(jié)果映射),學(xué)習(xí)門(mén)檻mybatis比hibernate低;同時(shí)靈活性高,特別適用于業(yè)務(wù)模型易變的項(xiàng)目,使用范圍廣。
簡(jiǎn)單概括:更加簡(jiǎn)化jdbc代碼,簡(jiǎn)化持久層,sql語(yǔ)句從代碼中分離,利用反射,將表中數(shù)據(jù)與java bean 屬性一一映射即ORM(Object Relational Mapping 對(duì)象關(guān)系映射)
使用范圍:
在日常的開(kāi)發(fā)項(xiàng)目中,如中小型項(xiàng)目,例如ERP(Crm客戶關(guān)系管理系統(tǒng),OA系統(tǒng)),需求與關(guān)系模型相對(duì)固定建議使用Hibernate,對(duì)于需求不固定的項(xiàng)目,比如:互聯(lián)網(wǎng)項(xiàng)目,建議使用mybatis,因?yàn)?b>需要經(jīng)常靈活去編寫(xiě)sql語(yǔ)句。總之,mybatis成為當(dāng)下必須學(xué)習(xí)掌握的一個(gè)持久層框架。
Mybatis框架搭建的方式
新建Maven項(xiàng)目
log4j 日志添加
resources目錄下配置文件添加
映射文件添加
實(shí)體類Customer添加
在父類工程pom獲取資源
測(cè)試
案例實(shí)操
1.新建Maven項(xiàng)目
新建maven項(xiàng)目 ,pom文件添加依賴jar
<dependency>??
<groupId>org.mybatis</groupId>?
<artifactId>mybatis</artifactId>??
<version>3.4.1</version>
</dependency>
<dependency>??
<groupId>mysql</groupId>?
<artifactId>mysql-connector-java</artifactId>?
<version>5.1.39</version>
</dependency>
<dependency>?
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>?
<version>1.2.16</version>
</dependency>
2.log4j 日志添加
在src/main/resources 資源包下添加log4j日志輸出properties文件,便于查看日志輸出信息
# 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ù)庫(kù)名mybatis,表 user)
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"?/>
<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>
<mappers>
<mapper resource="com/xxx/mapper/CustomerMapper.xml"?/>
</mappers>
</configuration>
對(duì)于標(biāo)簽的配置可能不會(huì)出現(xiàn)自動(dòng)提示:
解決辦法:引入mybatis-3-config.dtd 文件
Window-preferences-搜索xml-xml catalog
在User Specified Entries目錄下 ? add->
Locattion:http://mybatis.org/dtd/mybatis-3-mapper.dtd ? ? (值與xml模板中對(duì)應(yīng)) Key Type:URI Key:-//mybatis.org//DTD Mapper 3.0//EN ? ? (值與xml模板中對(duì)應(yīng)) 第二步: 關(guān)閉xml,重新打開(kāi),如果重新打開(kāi)不可以,重啟Eclipse即可。
最后點(diǎn)擊確定即可
4.映射文件添加
新建CustomerMapper.xml配置文件
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
1.命名空間配置 ?全局唯一 ?包名+文件名
2.配置Mapped Statement?
3. statement配置?
id 值聲明statement編號(hào) ?同一命名空間(同一文件)下不可重復(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 字符串拼接形式 ?無(wú)法避免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.實(shí)體類Customer添加
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獲取資源
<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.測(cè)試
@Test
public void test() throws IOException {?
/**?
a)、讀取mybatis的配置文件
b)、加載配置文件創(chuàng)建SqlSessionFactory?
c)、根據(jù)SqlSessionFactory創(chuàng)建SqlSession?
d)、通過(guò)sqlSession操作數(shù)據(jù)庫(kù)
e)、處理結(jié)果
f)、關(guān)閉session?
*/?
/**
* 加載配置到內(nèi)存?
*/?
InputStream is= Resources.getResourceAsStream("mybatis.xml");
/**
* ?創(chuàng)建SqlSessionFactory 對(duì)象 ?hibernate 也是如此 必須先獲取SqlSessionFactory 實(shí)例化對(duì)象 ? ? ? */
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
/**?
* ?獲取session以便操作數(shù)據(jù)庫(kù)
* ?參數(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ù)庫(kù) 關(guān)閉session
*/
session.close();
}
擴(kuò)展
MyBatis 框架體系結(jié)構(gòu)
說(shuō)明:
1 Configuration-mybatis配置
1)、與spring 一樣,可以通過(guò)配置文件或注解的形式進(jìn)行配置;
2)、mybatis.xml,此文件作為mybatis的全局配置文件,配置了mybatis的運(yùn)行環(huán)境等信息;
3)、mapper文件即sql映射文件,文件中配置了操作數(shù)據(jù)庫(kù)的sql語(yǔ)句。此文件需要在mybatis.xml中加載。
4)、有了配置文件后,通過(guò)mybatis環(huán)境等配置信息構(gòu)造SqlSessionFactory即會(huì)話工廠
5)、由會(huì)話工廠創(chuàng)建sqlSession即會(huì)話,操作數(shù)據(jù)庫(kù)需要通過(guò)sqlSession進(jìn)行
6)、sqlSession使用Executor(數(shù)據(jù)庫(kù)操作執(zhí)行器接口)操作數(shù)據(jù)庫(kù),同Executor 具體實(shí)現(xiàn)類實(shí)現(xiàn)指定dao 層數(shù)據(jù)訪問(wèn)操作。
2 Mapped Statement
框架底層封裝對(duì)象(sql語(yǔ)句、輸入?yún)?shù)、輸出結(jié)果類型),它包裝了mybatis配置信息及sql映射信息等,mapper文件(即Mapper.xml)中一個(gè)sql對(duì)應(yīng)一個(gè)Mapped Statement對(duì)象,sql的id即是Mapped statement的id。
3 Sql的輸入映射參數(shù)
基本和簡(jiǎn)單類型、HashMap、自定義POJO等。輸入?yún)?shù)映射就是jdbc編程中對(duì)preparedStatement設(shè)置參數(shù),Executor通過(guò)Mapped Statement在執(zhí)行sql前將輸入的java對(duì)象映射至sql中。
4 Sql的輸出映射參數(shù)
基本和簡(jiǎn)單類型、HashMap、自定義POJO。 Statement對(duì)sql執(zhí)行輸出結(jié)果進(jìn)行定義,輸出結(jié)果映射過(guò)程相當(dāng)于jdbc編程中對(duì)結(jié)果的解析處理過(guò)程,Executor通過(guò)Mapped Statement在執(zhí)行sql后將輸出結(jié)果映射至java對(duì)象中。
這里使用Maven 工程,對(duì)應(yīng)的mybatis jar包下載通過(guò)maven 倉(cāng)庫(kù)統(tǒng)一管理下