概述
Mybatis是Apache的一個(gè)開源項(xiàng)目iBatis赏壹,2010年改名為Mybatis。
Mybatis是一個(gè)支持普通SQL查詢、存儲過程和高級映射的優(yōu)秀持久層框架壤靶,對jdbc操作數(shù)據(jù)庫的過程進(jìn)行封裝线梗,使開發(fā)者只需要關(guān)注SQL本身椰于,而不需要花費(fèi)精力去處理注冊驅(qū)動、創(chuàng)建connection等jdbc繁雜的過程代碼仪搔。
Mybatis通過xml或者注解的方式將要執(zhí)行的各種statement配置起來瘾婿,并通過java對象(POJO)和statement中的sql進(jìn)行映射生成最終執(zhí)行的sql語句,然后由Mybatis框架執(zhí)行sql并將結(jié)果映射成java對象(POJO)并返回烤咧。
MyBatis作為持久層框架偏陪,其主要思想是將程序中的大量SQL語句剝離出來,配置在配置文件中煮嫌,以實(shí)現(xiàn)SQL的靈活配置笛谦。優(yōu)勢是將SQL與程序代碼分離,做到可以在不修改程序代碼的情況下昌阿,直接在配置文件中修改SQL揪罕。
MyBatis的使用非常簡單,只要在Java項(xiàng)目中添加相關(guān)依賴宝泵,就能以面向?qū)ο蟮姆绞讲僮麝P(guān)系數(shù)據(jù)庫好啰。
創(chuàng)建項(xiàng)目
創(chuàng)建項(xiàng)目的步驟此處不再贅述,與SpringMVC創(chuàng)建相同(前文鏈接:http://www.reibang.com/p/fde4557c527c)儿奶。
項(xiàng)目目錄結(jié)構(gòu)如圖:
打開項(xiàng)目的pom文件框往,添加Mybatis包依賴和連接MySQL數(shù)據(jù)庫的包依賴:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
創(chuàng)建數(shù)據(jù)庫
MySQL數(shù)據(jù)庫的安裝前文已經(jīng)記錄,此處不再贅述(前文連接:http://www.reibang.com/p/b96e55e86c98)闯捎。
使用客戶端連接數(shù)據(jù)庫椰弊,創(chuàng)建一個(gè)名為mybatis的數(shù)據(jù)庫,使用該數(shù)據(jù)庫瓤鼻,創(chuàng)建一張名為tb_user的表秉版,id為主鍵自動增長:
前文介紹,ORM框架是使用持久化對象完成持久化操作茬祷,即通過該對象對數(shù)據(jù)庫進(jìn)行增清焕、刪、改的操作,以面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫秸妥。
在Mybatis中使用的持久化對象就是PO對象(持久化后的POJO)滚停,它不要求持久化類繼承任何父類或者實(shí)現(xiàn)任何接口,保證代碼不被污染粥惧,這是Mybatis被稱為低侵入式設(shè)計(jì)的原因键畴。
在項(xiàng)目中創(chuàng)建POJO類
在項(xiàng)目中的java目錄下創(chuàng)建com.snow.dcl.domain包,在該包下創(chuàng)建User.java類:
編寫如下代碼:
public class User {
//用戶id
private Integer id;
//用戶名稱
private String name;
//用戶性別
private String sex;
//用戶年齡
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//無參構(gòu)造方法
public User() {
}
//帶參構(gòu)造方法
public User(Integer id, String name, String sex, Integer age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
創(chuàng)建XML文件
現(xiàn)在對于Mybatis來說還不理解User.java類與數(shù)據(jù)庫表tb_user的關(guān)系突雪,也不理解類中的屬性與數(shù)據(jù)庫表各個(gè)字段的關(guān)系起惕,要通過XML文件完成兩者之間的映射關(guān)系,使得Mybatis能夠理解和使用咏删。
在項(xiàng)目中的resources目錄下創(chuàng)建mapping目錄惹想,在該目錄下創(chuàng)建UserMapper.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">
<mapper namespace="com.snow.dcl.mapper.UserMapper">
<insert id="saveUser" parameterType="com.snow.dcl.domain.User" useGeneratedKeys="true">
insert into tb_user(name,sex,age) values (#{name},#{sex},#{age});
</insert>
</mapper>
在XML文件中定義了一條insert語句,解釋如下:
- <mapper namespace="com.snow.dcl.mapper.UserMapper">為該mapper定義了唯一的userspace饵婆,習(xí)慣上該值設(shè)置為包名+sql映射文件名,這樣可以保證該值唯一戏售。
- insert標(biāo)簽中編寫了插入sql語句侨核,id屬性值設(shè)置為saveUser,該值必須唯一灌灾。
- parameterType屬性指定了插入數(shù)據(jù)時(shí)使用的參數(shù)類型搓译,這里插入的數(shù)據(jù)就是User對象。
- useGeneratedKeys="true"表示使用數(shù)據(jù)庫的自動增長策略锋喜。
配置Mybatis的配置文件
現(xiàn)在對于Mybatis來說些己,理解了User.java類與數(shù)據(jù)庫表tb_user的關(guān)系,但是還不知道需要連接的數(shù)據(jù)庫地址嘿般、用戶名段标、密碼、連接池等信息炉奴,所以項(xiàng)目要對Mybatis的配置文件進(jìn)行這些信息的配置逼庞。
Mybatis的配置文件默認(rèn)為mybatis-config.xml,應(yīng)用程序運(yùn)行時(shí)瞻赶,需要先加載該文件赛糟。
在項(xiàng)目的resources目錄下創(chuàng)建mybatis-config.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">
<configuration>
<!-- 指定Mybatis所用日志的具體實(shí)現(xiàn) -->
<settings>
<setting name="log" value="LOG4J"/>
</settings>
<!--環(huán)境配置,連接的數(shù)據(jù)庫-->
<environments default="mysql">
<environment id="mysql">
<!--指定事務(wù)管理的類型砸逊,這里簡單使用Java的JDBC的提交和回滾設(shè)置-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource 指連接源配置璧南,POOLED是JDBC連接對象的數(shù)據(jù)源連接池的實(shí)現(xiàn)-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=UTF-8"></property>
<property name="username" value="root"></property>
<property name="password" value="****"></property>
</dataSource>
</environment>
</environments>
<mappers>
<!--告訴Mybatis持久化類的映射文件路徑-->
<mapper resource="com/snow/dcl/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
- <configuration>是Mybatis配置文件的根元素。
- <settings>子元素配置了日志信息师逸,可以在控制臺打印輸出語句司倚,便于調(diào)試,對Mybatis配置日志信息很重要。
- <environments>子元素用來配置Mybatis的環(huán)境对湃,用來將SQL映射用于多種數(shù)據(jù)庫之中崖叫。每個(gè)數(shù)據(jù)庫對應(yīng)一個(gè)SqlSessionFactory,可以配置多種環(huán)境拍柒,但是只能為SqlSessionFactory實(shí)例選擇一個(gè)環(huán)境心傀,default屬性表示選擇的環(huán)境。
- <environment>用于配置一個(gè)環(huán)境拆讯;<transactionManager>用來配置Mybatis中的事務(wù)管理脂男,type設(shè)置為JDBC,表示直接使用JDBC的提交和回滾設(shè)置种呐;<dataSource>用來配置數(shù)據(jù)源宰翅,Mybatis中并不推薦使用DriverManager來連接數(shù)據(jù)庫,推薦使用數(shù)據(jù)源來管理數(shù)據(jù)庫連接爽室,這樣能保證最好的性能汁讼;<property>用于配置Mybatis連接數(shù)據(jù)庫的包必要信息,驅(qū)動阔墩、URL嘿架、用戶名、密碼等啸箫。
- <mappers>子元素支持多個(gè)<mapper>子元素耸彪,每個(gè)<mapper>用于指定一個(gè)持久化配置文件。
數(shù)據(jù)源是一種用來提高數(shù)據(jù)庫連接性能的常規(guī)手段忘苛,它會負(fù)責(zé)維持一個(gè)數(shù)據(jù)庫連接池蝉娜,當(dāng)程序創(chuàng)建數(shù)據(jù)源實(shí)例時(shí),系統(tǒng)會一次性的創(chuàng)建多個(gè)數(shù)據(jù)庫連接扎唾,并把這些數(shù)據(jù)庫連接保存在連接池中召川。當(dāng)程序需要進(jìn)行數(shù)據(jù)庫訪問時(shí),無需重新獲得數(shù)據(jù)庫連接胸遇,直接從連接池中取出一個(gè)空閑的數(shù)據(jù)庫連接扮宠,當(dāng)程序使用數(shù)據(jù)庫連接訪問數(shù)據(jù)庫結(jié)束后,無須管理數(shù)據(jù)庫連接狐榔,而是將數(shù)據(jù)庫連接歸還給連接池即可坛增。通過這種方式可以避免頻繁的獲取和關(guān)閉數(shù)據(jù)庫連接導(dǎo)致性能下降。
配置LOG4J日志
Mybatis的配置文件中配置了日志信息薄腻,所以在此要對日至框架LOG4J進(jìn)行配置收捣。
首先在項(xiàng)目的pom文件中添加LOG4J的依賴:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
在項(xiàng)目的resources目錄下創(chuàng)建log4j.properties文件:
編寫如下內(nèi)容:
#全局的日志配置
log4j.rootLogger=ERROR, stdout
#Mybatis的日志配置
log4j.logger.com.snow.dcl.mapper.UserMapper=DEBUG
#控制臺輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss}-%t-[%p]\: %m%n
測試
在test目錄的java目錄下創(chuàng)建測試Java類文件Test.java:
編寫如下代碼:
public class Test {
public static void main(String[] args) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User("Dcl_Snow","男",18);
sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user);
sqlSession.commit();
sqlSession.close();
}
}
執(zhí)行結(jié)果:
查看數(shù)據(jù)庫表數(shù)據(jù):
Mybatis的持久化操作過程
- 開發(fā)持久化類PO和編寫持久化操作的Mapper.xml,在其中定義要執(zhí)行的SQL語句庵楷。
- 獲取SqlSessionFactory罢艾。
- 獲取SqlSession楣颠。
- 用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫。
- 關(guān)閉事務(wù)咐蚯,關(guān)閉SqlSession童漩。