Mybatis-01-入門

前言

從今天開始學習 Mybatis, 沖鴨.

參考資料

環(huán)境

  • jdk 1.8
  • mysql 8.0+
  • maven 4.0
  • IDEA

Mybatis 簡介

什么是 MyBatis?

MyBatis 是一款優(yōu)秀的持久層框架昭抒,它支持自定義 SQL钱床、存儲過程以及高級映射汽抚。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作掏缎。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄钞馁。

三層架構

  • 表現(xiàn)層: 展示數據
  • 業(yè)務層: 處理業(yè)務需求
  • 持久層: 與數據庫交互

所以 MyBatis 是與數據庫打交道的框架.

為什么要學 Mybatis?

Mybatis 百度百科

  • 簡單易學:本身就很小且簡單阐滩。沒有任何第三方依賴二打,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易于學習,易于使用掂榔,通過文檔和源代碼继效,可以比較完全的掌握它的設計思路和實現(xiàn)。
  • 靈活:mybatis不會對應用程序或者數據庫的現(xiàn)有設計強加任何影響装获。 sql寫在xml里瑞信,便于統(tǒng)一管理和優(yōu)化。通過sql語句可以滿足操作數據庫的所有需求穴豫。
  • 解除sql與程序代碼的耦合:通過提供DAO層凡简,將業(yè)務邏輯和數據訪問邏輯分離,使系統(tǒng)的設計更清晰精肃,更易維護秤涩,更易單元測試。sql和代碼的分離司抱,提高了可維護性溉仑。
  • 提供映射標簽,支持對象與數據庫的orm字段關系映射
  • 提供對象關系映射標簽状植,支持對象關系組建維護
  • 提供xml標簽浊竟,支持編寫動態(tài)sql。

入門程序

0. 準備工作

0.1 目錄結構

目錄結構

0.2 建立數據庫

數據庫

1. 創(chuàng)建一個 maven 項目

1.1 引入 pom.xml 依賴

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

2. 寫工具類 MybatisUtils.java

2.1 從 XML 中構建 SqlSessionFactory

因為這些代碼都是固定的,所以將其封裝為工具類.

2.1.1 使用 mybatis 獲取 sqlSessionFactory 對象

每個基于 MyBatis 的應用都是以一個 SqlSessionFactory 的實例為核心的津畸。SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得振定。而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先配置的 Configuration 實例來構建出 SqlSessionFactory 實例。

com.waciao.utils.MybatisUtils

    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.1.2 從 SqlSessionFactory 中獲取 SqlSession

既然有了 SqlSessionFactory肉拓,顧名思義后频,我們可以從中獲得 SqlSession 的實例例。SqlSession 提供了在數據庫執(zhí)行 SQL 命令所需的所有方法暖途。

com.waciao.utils.MybatisUtils

    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }

2.1.3 完整的 MybatisUtils

package com.waciao.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * @Author: Waciao
 * @Date: 2020/3/17 11:20
 * @Version: 1.0
 * @Github: https://github.com/byojiaoxianz7
 */


// 工具類  sqlSessionFactory --> sqlSession
// 這一段代碼屬于固定格式, 所以封裝成工具類
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            /**
             * 1. 使用mybatis獲取sqlSessionFactory對象
             */
            String resource = "mybatis-config.xml"; // resource下的mybatis-config.xml
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 2. 從 SqlSessionFactory 中獲取 SqlSession
     * 既然有了 SqlSessionFactory卑惜,顧名思義,我們可以從中獲得 SqlSession 的實例驻售。
     * SqlSession 提供了在數據庫執(zhí)行 SQL 命令所需的所有方法露久。
     *
     * @return
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

3. 寫 mybatis-config.xml, 配置數據庫連接信息

XML 配置文件中包含了對 MyBatis 系統(tǒng)的核心設置,包括獲取數據庫連接實例的數據源(DataSource)以及決定事務作用域和控制方式的事務管理器(TransactionManager)欺栗。

<?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>

    <!--環(huán)境 默認選擇development環(huán)境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="12345678"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

4. 寫實體類 User.java

構造

  • 有參
  • 無參
  • Getter and Setter
  • toString
package com.waciao.pojo;

/**
 * @Author: Waciao
 * @Date: 2020/3/17 11:32
 * @Version: 1.0
 * @Github: https://github.com/byojiaoxianz7
 */

// 實體類
public class User {
    private Integer id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(Integer id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    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 getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

5. 寫接口 UserMapper.java

package com.waciao.dao;

import com.waciao.pojo.User;

import java.util.List;

/**
 * @Author: Waciao
 * @Date: 2020/3/17 11:33
 * @Version: 1.0
 * @Github: https://github.com/byojiaoxianz7
 */
public interface UserMapper {

    /**
     * 獲取所有用戶
     * @return
     */
    List<User> getUserList();
}

6. 寫實現(xiàn)類 Usermapper.xml

在 namespace com.waciao.dao.UserMapper中定義了一個名為getUserList的映射語句,這樣就可以用全限定名com.waciao.dao.UserMapper.getUserList來調用 sql 語句了.

id 對應 UserMapper 里的方法名 resultType 里填執(zhí)行 sql 語句之后返回的結果集,在 UserMapper 中可以看到, getUserList 方法返回的是一個 List<User> ,所以填集合里泛型的東西,就是 User.

<?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.waciao.dao.UserMapper">
    <select id="getUserList" resultType="com.waciao.pojo.User">
        SELECT * FROM mybatis.user;
    </select>
</mapper>

到目前為止,所有的文件都寫完了,接下來就是測試一下能不能成功跑起來

7. 寫測試類

7.1 獲得 sqlSession 對象

調用工具類即可

SqlSession sqlSession = MybatisUtils.getSqlSession();

7.2 執(zhí)行 sql

存在幾個問題

怎么執(zhí)行 sql?

首先需要拿到 sql

怎么拿到 sql?

要么從 UserMapper 里拿,要么從 xml 里拿,因為是面向接口編程,所以直接從UserMapper 拿就行了

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

get到接口之后返回,就可以使用接口里的方法了

List<User> userList = mapper.getUserList();

返回結果

for (User user : userList) {
    System.out.println(user);
}

7.3 關閉 sqlSession

sqlSession.close();

7.4 完整的測試類代碼

package com.waciao.dao;

import com.waciao.pojo.User;
import com.waciao.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @Author: Waciao
 * @Date: 2020/3/17 11:45
 * @Version: 1.0
 * @Github: https://github.com/byojiaoxianz7
 */
public class UserMapperTest {
    @Test
    public void test() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}

8. 錯誤排查

運行程序之后會報兩個錯誤

8.1 org.apache.ibatis.binding.BindingException: Type interface com.waciao.dao.UserMapper is not known to the MapperRegistry.

報這個錯誤是因為在寫 mybatis-config.xml 的時候沒有注冊 mapper

需要配置才行

<mappers>
    <mapper resource="com/waciao/dao/UserMapper.xml" />
</mappers>

8.1.1 完整的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>

    <!--環(huán)境 默認選擇development環(huán)境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="12345678"/>
            </dataSource>
        </environment>
    </environments>

    <!--每一個Mapper.xml都需要在mybatis核心-->
    <mappers>
        <mapper resource="com/waciao/dao/UserMapper.xml" />
    </mappers>
</configuration>

8.2 java.lang.ExceptionInInitializerError,Caused by: org.apache.ibatis.exceptions.PersistenceException

第二個錯誤: 在 target/test-classes/com/waciao/dao 里沒有找到 UserMapper.xml

原因在 maven 中, 因為它的約定大于配置, 寫文件配置時可能無法被導出或生效

maven 中配置文件應該放在 resources 目錄下,但是這個程序放在了 java 文件下,所以沒有找到 xml 配置文件

所以需要在build中配置resources,來防止資源導出失敗的問題

解決方案:

在 ```pom.xml```文件中引入即可
    <!--在build中配置resources毫痕,來防止我們資源導出失敗的問題-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

配置之后可能還是會報錯, 那么可以這也解決:

  1. 把 filtering 改為 false
  2. mybatis-config.xml中的 url 把 useSSL 改為 false

總結

  1. 跟著狂神老師思路一步一步走下來,基本上沒遇到什么問題,結果還是比較令我滿意.

  2. 多看官方文檔

_

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末征峦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子消请,更是在濱河造成了極大的恐慌栏笆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臊泰,死亡現(xiàn)場離奇詭異蛉加,居然都是意外死亡,警方通過查閱死者的電腦和手機缸逃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門针饥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人察滑,你說我怎么就攤上這事打厘。” “怎么了贺辰?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵户盯,是天一觀的道長。 經常有香客問我饲化,道長莽鸭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任吃靠,我火速辦了婚禮硫眨,結果婚禮上,老公的妹妹穿的比我還像新娘巢块。我一直安慰自己礁阁,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布族奢。 她就那樣靜靜地躺著姥闭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪越走。 梳的紋絲不亂的頭發(fā)上棚品,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音廊敌,去河邊找鬼铜跑。 笑死,一個胖子當著我的面吹牛骡澈,可吹牛的內容都是我干的锅纺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼秧廉,長吁一口氣:“原來是場噩夢啊……” “哼伞广!你這毒婦竟也來了拣帽?” 一聲冷哼從身側響起疼电,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嚼锄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔽豺,有當地人在樹林里發(fā)現(xiàn)了一具尸體区丑,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年修陡,在試婚紗的時候發(fā)現(xiàn)自己被綠了沧侥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡魄鸦,死狀恐怖宴杀,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情拾因,我是刑警寧澤旺罢,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站绢记,受9級特大地震影響扁达,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蠢熄,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一跪解、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧签孔,春花似錦叉讥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至判耕,卻和暖如春透绩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壁熄。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工帚豪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人草丧。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓狸臣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昌执。 傳聞我的和親對象是個殘疾皇子烛亦,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容

  • 1. 簡介 1.1 什么是 MyBatis 诈泼? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,454評論 0 4
  • 1. Mybatis的介紹 MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由ap...
    itzhouq的筆記閱讀 657評論 0 5
  • MyBatis主要組成部分 1. SqlSessionFactoryBuilder(構造器) 根據配置信息或代碼生...
    onlyHalfSoul閱讀 1,190評論 1 3
  • mybatis 不會直接和數據庫進行打交道煤禽,mybatis 其實是對 jdbc api 的進一步封裝铐达,最終和數據庫...
    小毛1221閱讀 507評論 0 0
  • 之前在面試工作的時候,我當時用的是hibernate檬果,但是現(xiàn)在互聯(lián)網項目并發(fā)量大瓮孙,一般都會選擇使用Mybatis,...
    唐偉耀閱讀 550評論 1 0