搭建MyBatis工作環(huán)境(一)

最近在學(xué)習(xí)MyBatis相關(guān)的技術(shù)棒拂,根據(jù)教程搭建一個(gè)簡(jiǎn)單的MyBatis入門工程,現(xiàn)在將搭建思路簡(jiǎn)單的總結(jié)一下谜诫,所有流程均是按照《SpringMVC+MyBatis開發(fā)(朱要光)》書中的教程攻旦。目前處于比照葫蘆畫瓢階段,至于為什么要這么做牢屋,還是處于很懵懂的階段烙无,希望經(jīng)過一段時(shí)間的學(xué)習(xí),可以整理一份自己的見解怀估。

一合搅、數(shù)據(jù)庫準(zhǔn)備

//創(chuàng)建一個(gè)名為“mybatis_test"的數(shù)據(jù)庫
CREATE DATABASE mybatis_test;
//創(chuàng)建一張名為user的表
DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(120) COLLATE utf8_bin DEFAULT NULL,
  `password` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `gender` varchar(5) COLLATE utf8_bin DEFAULT NULL,
  `email` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `province` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `city` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
//插入測(cè)試數(shù)據(jù)
INSERT INTO user (id, username, password, gender, email, province, city, birthday) values
(1, '張三', '111', '男', '1111@126.com', '河南省', '鄭州市', '1991-04-23'),
(2, '李四', '222', '男', '2222@126.com', '河北省', '邯鄲市', '1989-10-13'),
(3, '劉麗', '333', '女', '3333@126.com', '江蘇省', '蘇州市', '1994-06-09'),
(4, '李麗', '444', '女', '4444@126.com', '四川省', '成都市', '1992-11-07');

二灾部、搭建工程環(huán)境

2.1、創(chuàng)建工程

我用的開發(fā)工具為idea从藤,在idea中創(chuàng)建一個(gè)maven項(xiàng)目锁蠕,為什么我們要用maven項(xiàng)目,而不是普通的java項(xiàng)目悯搔,如果是普通的java項(xiàng)目舌仍,我們?nèi)绻蕾嚻渌捻?xiàng)目,我們就需要手動(dòng)把依賴的jar包復(fù)制到lib下灌曙,而且如果依賴的jar升級(jí)在刺,我們就需要重新copy,特別麻煩蚣驼,而且不容易管理隙姿。使用maven項(xiàng)目的話输玷,我們只需要在pom文件中維護(hù)依賴jar包的坐標(biāo)即可靡馁。maven的一些具體介紹和如果創(chuàng)建maven項(xiàng)目,大家可以自行百度赔嚎。

2.2胧弛、引入jar包

我們需要引入我們項(xiàng)目依賴的jar包结缚,在pom文件中維護(hù)依賴jar的坐標(biāo),如下:

<dependencies>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--數(shù)據(jù)庫連接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>
        <!--日志輸出-->
        <!--log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--SLF4J使你的代碼獨(dú)立于任意一個(gè)特定的日志API-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.1</version>
        </dependency>
        <!--Java 字節(jié)碼操控框架-->
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>7.0</version>
        </dependency>
        <!--Code生成類庫-->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.10</version>
        </dependency>
        <!--使用spring的必備包,用來記錄程序運(yùn)行時(shí)的活動(dòng)的日志記錄-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <!--分析茵宪、編輯和創(chuàng)建Java字節(jié)碼的類庫-->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.24.0-GA</version>
        </dependency>
    </dependencies>

2.3稀火、創(chuàng)建工程目錄結(jié)構(gòu)

在src文件夾下創(chuàng)建三個(gè)包c(diǎn)n.com.mybatis.datasource(數(shù)據(jù)庫連接)、cn.com.mybatis.po(持久層對(duì)象)憾股、cn.com.mybatis.test(測(cè)試主程序)服球。
在src同級(jí)創(chuàng)建一個(gè)resource包,該目錄下放置mapper包(該包下創(chuàng)建一個(gè)UserMapper.xml文件斩熊,SQL映射文件)、log4j.properties(日志輸出配置文件)分冈、SqlMapConfig.xml(數(shù)據(jù)庫連接池配置文件)。
基本工程目錄結(jié)構(gòu)如下:


工程目錄.png

2.4集乔、編寫日志輸出環(huán)境配置文件---log4j.properties

這里使用的是目前比較流行的輸出日志信息的開源工具log4j扰路。

#日志輸出級(jí)別倔叼,經(jīng)常使用的級(jí)別:DEBUG(調(diào)試級(jí)別)、INFO(標(biāo)準(zhǔn)信息級(jí)別)哩罪、ERROR(錯(cuò)誤級(jí)別)巡验、WARN(異常級(jí)別)
# 在開發(fā)環(huán)境下日志級(jí)別要設(shè)成DEBUG,生產(chǎn)環(huán)境設(shè)為INFO或ERROR
#stdout將等級(jí)為DEBUG的日志信息輸出到stdout參數(shù)所指定的輸出載體中
log4j.rootLogger = DEBUG, stdout
# 設(shè)置stdout的輸出載體是哪種類型腹鹉,ConsoleAppender代表控制臺(tái)
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
#設(shè)置stdout的輸出載體的界面布局是哪種類型功咒,PatternLayout可以靈活地指定布局模式绞蹦,即自己去配置布局
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
#界面布局選擇靈活布局類型,指定打印信息的具體格式景殷,
#%p 輸出優(yōu)先級(jí)猿挚,即DEBUG,INFO绩蜻,WARN办绝,ERROR,F(xiàn)ATAL
#%t 輸出產(chǎn)生該日志事件的線程名
#%m 輸出代碼中指定的消息
#%n 輸出一個(gè)回車換行符
log4j.appender.stdout.layout.ConversionPattern = %5p [%t] - %m%n

2.5孕蝉、編寫數(shù)據(jù)庫連接池配置文件---SqlMapConfig.xml

該配置文件是Mybatis與數(shù)據(jù)庫建立連接的核心文件降淮。

<?xml version="1.0" encoding="utf-8"?>
<!--指定xml的版本信息和編碼格式信息(為上面一句配置的注釋,第一句必須是xml配置信息纳本,注釋也不可以-->
<!--DTD文檔定義類型腋颠,用來校驗(yàn)xml文件是否符合約定好的某種規(guī)范-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <!--日志模式-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!--和spring整合后environments配置將被廢除-->
    <environments default="development">
        <environment id="development">
            <!--使用JDBC事務(wù)管理-->
            <transactionManager type="JDBC"/>
            <!--數(shù)據(jù)庫連接池-->
            <dataSource type="POOLED">
                <!--數(shù)據(jù)庫驅(qū)動(dòng)信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--數(shù)據(jù)庫連接地址-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8"/>
                <!--數(shù)據(jù)庫用戶名-->
                <property name="username" value="user"/>
                <!--數(shù)據(jù)庫密碼-->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

2.6淑玫、編寫SQL映射配置文件---UserMapper.xml

在Mybatis中絮蒿,幾乎所有的SQL語句都配置在Mapper映射文件中叁鉴。在mapper--UserMapper.xml文件中首先添加一個(gè)select語句配置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybtis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace對(duì)SQL進(jìn)行分類化管理幌墓,實(shí)現(xiàn)不同業(yè)務(wù)SQL隔離-->
<mapper namespace="test">
    <!--select:查詢語句常侣,id:唯一標(biāo)識(shí),對(duì)應(yīng)statement胳施,parameterType:輸入?yún)?shù)類型舞肆,resultType:結(jié)果類型-->
    <select id="findUserById" parameterType="int" resultType="cn.com.mybatis.po.User">
        SELECT * FROM user WHERE id=#{id}
    </select>
</mapper>

2.7椿胯、配置映射文件

為了能讓Mybatis資源文件加載類解析Mapper文件,需要把Mapper文件的路徑配置在全局配置文件SqlMapConfig.xml的configuration結(jié)尾標(biāo)簽前仆抵。

  <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

2.8、編寫持久化實(shí)體類----cn.com.mybatis.po

持久化實(shí)體類是一個(gè)類中的成員變量與數(shù)據(jù)庫表中字段一一對(duì)應(yīng)的java類镣丑,一般這種類成為JavaBean。
在User類中金吗,創(chuàng)建了User的所有屬性信息摇庙,以及get和 set方法遥缕,并且創(chuàng)建了一個(gè)無構(gòu)造參數(shù)函數(shù)和一個(gè)有參構(gòu)造函數(shù)。

package cn.com.mybatis.po;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private int id;
    private String username;
    private String password;
    private String gender;
    private String email;
    private String province;
    private String city;
    private Date birthday;

    public User() {
    }

    public User(int id, String username, String password, String gender, String email, String province, String city, Date birthday) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.email = email;
        this.province = province;
        this.city = city;
        this.birthday = birthday;
    }

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

2.9单匣、編寫數(shù)據(jù)庫交互類----cn.com.mybatis.datasource

DataConnection類通過resource資源加載SqlMapConfig.xml配置文件夕凝,然后獲取SQL會(huì)話工廠sqlSessionFactory,之后使用會(huì)話工廠創(chuàng)建可以與數(shù)據(jù)庫交互的sqlSession類的實(shí)例對(duì)象户秤。

package cn.com.mybatis.datasource;

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;

public class DataConnection {
    //配置文件
    private String resource = "SqlMapConfig.xml";
    private SqlSessionFactory sqlSessionFactory;
    private SqlSession sqlSession;

    public SqlSession getSqlSession() throws IOException{
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

2.10码秉、編寫測(cè)試用例----cn.com.mybatis.test

MyBatisTest類的功能為從數(shù)據(jù)庫中讀取id=1的用戶數(shù)據(jù),并在控制臺(tái)中打印出來鸡号。

package cn.com.mybatis.test;

import cn.com.mybatis.po.User;
import cn.com.mybatis.datasource.DataConnection;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.text.SimpleDateFormat;

public class MyBatisTest {

    public DataConnection dataConn = new DataConnection();

    @Test
    public void TestSelect() throws IOException {
        //通過DataConnection類獲取sqlSession會(huì)話對(duì)象
        SqlSession sqlSession = dataConn.getSqlSession();
        //sqlSession.selectOne最終結(jié)果與映射文件中所匹配的resultType類型
        // statement對(duì)應(yīng)UserMappper.xml中的namespace加statement配置的id
        // parameter對(duì)應(yīng)UserMappper.xml中parameterType類型的參數(shù)#{id}
        User user = sqlSession.selectOne("test.findUserById", 1);
        System.out.println("姓名:" + user.getUsername());
        System.out.println("性別:" + user.getGender());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("生日:" + sdf.format(user.getBirthday()));
        System.out.println("所在地:" + user.getProvince() + user.getCity());
        //關(guān)閉sqlSession會(huì)話
        sqlSession.close();
    }
}

2.11转砖、測(cè)試樣例輸出結(jié)果

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鲸伴,隨后出現(xiàn)的幾起案子汞窗,更是在濱河造成了極大的恐慌杉辙,老刑警劉巖蜘矢,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖食,死亡現(xiàn)場(chǎng)離奇詭異泡垃,居然都是意外死亡蔑穴,警方通過查閱死者的電腦和手機(jī)存和,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門纵朋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來操软,“玉大人聂薪,你說我怎么就攤上這事≈饨唬” “怎么了涯呻?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長效诅。 經(jīng)常有香客問我乱投,道長戚炫,這世上最難降的妖魔是什么施掏? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任七芭,我火速辦了婚禮抖苦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘峦筒。我一直安慰自己物喷,他們只是感情好峦失,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布帆精。 她就那樣靜靜地躺著卓练,像睡著了一般襟企。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上表蝙,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天府蛇,我揣著相機(jī)與錄音务荆,去河邊找鬼函匕。 笑死盅惜,一個(gè)胖子當(dāng)著我的面吹牛抒寂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播朴译,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盯拱!你這毒婦竟也來了坟乾?” 一聲冷哼從身側(cè)響起甚侣,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎详羡,沒想到半個(gè)月后实柠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窒盐,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年份殿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卿嘲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凭语,靈堂內(nèi)的尸體忽然破棺而出似扔,到底是詐尸還是另有隱情炒辉,我是刑警寧澤黔寇,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站憋飞,受9級(jí)特大地震影響榛做,放射性物質(zhì)發(fā)生泄漏升敲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹏氧。 院中可真熱鬧把还,春花似錦、人聲如沸艇炎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至暇榴,卻和暖如春蔼紧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背查吊。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工逻卖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炼杖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像邮弹,于是被迫代替她去往敵國和親员帮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 1 Mybatis入門 1.1 單獨(dú)使用jdbc編程問題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,307評(píng)論 0 38
  • 逅弈 轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝胀溺! 以前的日子 以前我們寫代碼時(shí),jar包都默認(rèn)放在一個(gè)叫 /lib 的目錄下无埃,然后...
    逅弈閱讀 2,885評(píng)論 3 45
  • 認(rèn)識(shí) Spring 框架 更多詳情請(qǐng)點(diǎn)擊這里:這里 Spring 框架是 Java 應(yīng)用最廣的框架织阅,它的成功來源于...
    我沒有三顆心臟閱讀 17,349評(píng)論 13 52
  • 感賞:昨天我感冒全身酸痛,回家睡覺,晚上女兒從圖書館回來吃完飯昵观,女兒很貼心的叫我去休息啊犬,讓女兒洗完碗再玩游戲觉至,也能...
    苗苗朱閱讀 85評(píng)論 0 0
  • 18歲的我?guī)е鴫?mèng)想走進(jìn)武傳席怪,第一眼看見的是"夢(mèng)想在路上"這幾個(gè)大字碉纺,這些字,道出了我的心聲态贤。武傳是一個(gè)充滿了夢(mèng)想...
    梌枖閱讀 411評(píng)論 0 0