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需要程序員自己寫sql,但是也存在映射(輸入?yún)?shù)映射蛉迹,輸出結(jié)果映射)傅寡,學(xué)習(xí)門檻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)?strong>需要經(jīng)常靈活去編寫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 **
<!-- mybatis jar 包依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 數(shù)據(jù)庫(kù)驅(qū)動(dòng) -->
<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ù)庫(kù)名mybatis,表 user)
<?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ù)庫(kù)連接相關(guān)配置信息 -->
<configuration>
<environments default="development">
<environment id="development">
<!-- 加入事務(wù)控制 -->
<transactionManager type="jdbc" />
<!-- 配置數(shù)據(jù)庫(kù)連接信息 -->
<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ù)量可配置多個(gè)-->
<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
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-PjkueQDe-1599817235392)(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模板中對(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配置文件
<?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編號(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();
}
PS:獲取學(xué)習(xí)資源技術(shù)干貨:lezijie006(暗號(hào)13)
擴(kuò)展
說(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)一管理下載。