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í)掌握的一個持久層框架类垦。
Mybatis框架搭建的方式
新建Maven項目
log4j 日志添加
resources目錄下配置文件添加
映射文件添加
實體類Customer添加
在父類工程pom獲取資源
測試
案例實操
1.新建Maven項目
新建maven項目 ,pom文件添加依賴jar
<!-- 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文件狈邑,便于查看日志輸出信息
# 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)
<?xmlversion="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>
<environmentsdefault="development">
<environmentid="development">
<!-- 加入事務(wù)控制 -->
<transactionManagertype="jdbc"/>
<!-- 配置數(shù)據(jù)庫連接信息 -->
<dataSourcetype="pooled">
<propertyname="driver"value="com.mysql.jdbc.Driver"/>
<propertyname="url"value="jdbc:mysql://127.0.0.1:3306/spring-test"/>
<propertyname="username"value="root"/>
<propertyname="password"value=""/>
</dataSource>
</environment>
</environments>
<!-- mapper 配置文件指定 文件數(shù)量可配置多個-->
<mappers>
<mapperresource="com/xxx/mapper/CustomerMapper.xml"/>
</mappers>
</configuration>
對于標(biāo)簽的配置可能不會出現(xiàn)自動提示:
解決辦法:引入mybatis-3-config.dtd 文件
Window-preferences-搜索xml-xml catalog
在User Specified Entries目錄下? add->
Locattion:http://mybatis.org/dtd/mybatis-3-mapper.dtd? ? (值與xml模板中對應(yīng))Key Type:URIKey:-//mybatis.org//DTD Mapper 3.0//EN? ? (值與xml模板中對應(yīng))第二步:關(guān)閉xml蚤认,重新打開米苹,如果重新打開不可以,重啟Eclipse即可砰琢。
最后點擊確定即可
4.映射文件添加
新建CustomerMapper.xml配置文件
<?xmlversion="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 注入 ? ?
-->
<mappernamespace="com.xxx.mapper.customerMapper">
<!-- 查詢客戶-->
<selectid="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添加
packagecom.xxx.pojo;
?
publicclassCustomer{
privateintid;
privateStringuserName;
privateStringuserBalance;
?
publicintgetId() {
returnid;
?? }
?
publicvoidsetId(intid) {
this.id=id;
?? }
?
publicStringgetUserName() {
returnuserName;
?? }
?
publicvoidsetUserName(StringuserName) {
this.userName=userName;
?? }
?
publicStringgetUserBalance() {
returnuserBalance;
?? }
?
publicvoidsetUserBalance(StringuserBalance) {
this.userBalance=userBalance;
?? }
?
@Override
publicStringtoString() {
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.測試
@Test
publicvoidtest()throwsIOException{
/** ? ? ?
a)蘸嘶、讀取mybatis的配置文件 ? ?
b)良瞧、加載配置文件創(chuàng)建SqlSessionFactory ? ?
c)、根據(jù)SqlSessionFactory創(chuàng)建SqlSession ?
d)训唱、通過sqlSession操作數(shù)據(jù)庫 ? ? ?
e)褥蚯、處理結(jié)果 ? ?
f)、關(guān)閉session ?
*/
/** ? ?
* 加載配置到內(nèi)存
*/
InputStreamis=Resources.getResourceAsStream("mybatis.xml");
/** ?
*? 創(chuàng)建SqlSessionFactory 對象? hibernate 也是如此 必須先獲取SqlSessionFactory 實例化對象? */
SqlSessionFactoryfactory=newSqlSessionFactoryBuilder().build(is);
/** ? ?
*? 獲取session以便操作數(shù)據(jù)庫 ?
*? 參數(shù)一:指定UserMapper.xml 映射文件id? 必須加入命名空間 ? ?
*? 參數(shù)二: 指定輸入?yún)?shù) ? ?
*/
SqlSessionsession=factory.openSession();
Customercustomer=session.selectOne("com.xxx.mapper.customerMapper.queryCustomerById",2);
/** ? ?
* 將返回的結(jié)果輸出 ? ?
*/
System.out.println(customer);
/** ?
* 操作完數(shù)據(jù)庫 關(guān)閉session ? ?
*/
session.close();
}
擴展
MyBatis 框架體系結(jié)構(gòu)
說明:
1 Configuration-mybatis配置
1)况增、與spring 一樣,可以通過配置文件或注解的形式進(jìn)行配置;
2)赞庶、mybatis.xml,此文件作為mybatis的全局配置文件巡通,配置了mybatis的運行環(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對象中逛艰。
這里使用Maven 工程,對應(yīng)的mybatis jar包下載通過maven 倉庫統(tǒng)一管理下載搞旭。