MyBatis的使用

概述

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)如圖:

mybatis01.png

打開項(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為主鍵自動增長:

mybatis02.png

前文介紹,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類:


mybatis03.png

編寫如下代碼:

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文件:


mybatis04.png

編寫如下代碼:

<?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文件:


mybatis05.png

編寫如下代碼:

<?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&amp;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è)持久化配置文件。

\color{red}{數(shù)據(jù)源:}
數(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文件:


mybatis06.png

編寫如下內(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:


mybatis07.png

編寫如下代碼:

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é)果:


mybatis08.png

查看數(shù)據(jù)庫表數(shù)據(jù):


mybatis09.png

Mybatis的持久化操作過程

  • 開發(fā)持久化類PO和編寫持久化操作的Mapper.xml,在其中定義要執(zhí)行的SQL語句庵楷。
  • 獲取SqlSessionFactory罢艾。
  • 獲取SqlSession楣颠。
  • 用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫。
  • 關(guān)閉事務(wù)咐蚯,關(guān)閉SqlSession童漩。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市春锋,隨后出現(xiàn)的幾起案子矫膨,更是在濱河造成了極大的恐慌,老刑警劉巖期奔,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侧馅,死亡現(xiàn)場離奇詭異,居然都是意外死亡呐萌,警方通過查閱死者的電腦和手機(jī)馁痴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肺孤,“玉大人罗晕,你說我怎么就攤上這事≡拢” “怎么了小渊?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顾腊。 經(jīng)常有香客問我粤铭,道長挖胃,這世上最難降的妖魔是什么杂靶? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮酱鸭,結(jié)果婚禮上吗垮,老公的妹妹穿的比我還像新娘。我一直安慰自己凹髓,他們只是感情好烁登,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔚舀,像睡著了一般饵沧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赌躺,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天狼牺,我揣著相機(jī)與錄音,去河邊找鬼礼患。 笑死是钥,一個(gè)胖子當(dāng)著我的面吹牛掠归,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悄泥,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼虏冻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弹囚?” 一聲冷哼從身側(cè)響起厨相,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎余寥,沒想到半個(gè)月后领铐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宋舷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年绪撵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祝蝠。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡音诈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绎狭,到底是詐尸還是另有隱情细溅,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布儡嘶,位于F島的核電站喇聊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蹦狂。R本人自食惡果不足惜誓篱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凯楔。 院中可真熱鬧窜骄,春花似錦、人聲如沸摆屯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虐骑。三九已至准验,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廷没,已是汗流浹背糊饱。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腕柜,地道東北人济似。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓矫废,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砰蠢。 傳聞我的和親對象是個(gè)殘疾皇子蓖扑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容