MyBatis 單獨使用步驟(不結(jié)合Spring)

參考

mybatis 入門官方中文文檔


使用 Myeclipse+maven 構(gòu)建項目

1. 導(dǎo)包

要使用 MyBatis,只需將 mybatis-x.x.x.jar 文件置于 classpath 中即可。

如果使用 Maven 來構(gòu)建項目尘分,則需將下面的 dependency 代碼置于 pom.xml 文件中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

2. XML 配置文件

創(chuàng)建一個 XML 配置文件裙犹,XML 配置文件(configuration XML)中包含了對 MyBatis 系統(tǒng)的核心設(shè)置员凝,包含:

  • 數(shù)據(jù)庫連接實例的數(shù)據(jù)源(DataSource)
  • 決定事務(wù)作用域和控制方式的事務(wù)管理器(TransactionManager)

當然摇锋,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>
    
    <!-- 外部屬性配置文件 -->
    <properties resource="jdbc.properties" />

    <!-- 為SQL映射配置文件的parameterType和resultType來設(shè)置別名油狂。別名默認為首字母小寫历恐。 -->
    <typeAliases>
        <package name="com.itiis.client.entity"/>
    </typeAliases>
    
    <!-- environment 元素體中包含了事務(wù)管理和連接池的配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- DBCP數(shù)據(jù)源 -->
            <dataSource type="com.itiis.client.dataSource.DBCPDataSourceFactory">
                <property name="driverClassName" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
                <property name="minIdle" value="5"/>
                <property name="maxIdle" value="10"/><!-- maxIdle,最大空閑數(shù) -->
                <property name="maxActive" value="10"/>
                <property name="validationQuery" value="SELECT 1"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- mappers 元素包含一組 mapper 映射器(這些 mapper 的 XML 文件包含了 SQL 代碼和映射定義信息) -->
    <mappers>
        <mapper resource="mappersClient/TrafficSourceMapper.xml"/>
    </mappers>
    
</configuration>

注意點1:使用自定義數(shù)據(jù)源

MyBatis的數(shù)據(jù)源并不是很強大专筷,所以它也可以不使用其本身自帶的數(shù)據(jù)源弱贼,而配置成其它的數(shù)據(jù)源如DBCP/C3P0等等。

官方文檔 XML 數(shù)據(jù)源配置

官方也給出了C3P0的數(shù)據(jù)源配置方法磷蛹。

DBCP的配置方法

(1) 創(chuàng)建一個java類吮旅,代碼如下,將MyBatis的數(shù)據(jù)源設(shè)置為DBCP數(shù)據(jù)源味咳。

package com.itiis.client.dataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;

public class DBCPDataSourceFactory extends UnpooledDataSourceFactory {

    public DBCPDataSourceFactory() {
        this.dataSource = new BasicDataSource();
    }
    
}

(2) 在 XML 配置文件中配置數(shù)據(jù)源

    <!-- DBCP數(shù)據(jù)源 -->
    <dataSource type="com.itiis.client.dataSource.DBCPDataSourceFactory">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <property name="minIdle" value="5"/> 
        <property name="maxIdle" value="10"/><!-- maxIdle庇勃,最大空閑數(shù) -->
        <property name="maxActive" value="10"/>
        <property name="validationQuery" value="SELECT 1"/>
    </dataSource>

注意點2:MyBatis的 xml 配置嚴格講究順序,比如 properties 不能配置到 typeAliases 后面莺葫,否則就會出錯而不能加載 xml

3. Mapper映射器

Mapper XML 文件

(1) 創(chuàng)建一個接口類 ***Mapper.java

package com.itiis.client.dao;

import java.util.Map;

import com.itiis.client.entity.EarthMagneticModel;

public interface TrafficSourceMapper {
    
    public Map<String, String> getLinkAndLaneById(String id);
    
    public String getById(String id);
    
    public void insertEarthMagnetic(EarthMagneticModel model);
    
}

(2) 創(chuàng)建一個 ***Mapper.xml 匪凉,包含了 SQL 代碼和映射定義信息

<?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.itiis.client.dao.TrafficSourceMapper">
   
    <!--獲得資源的link和lane -->
    <select id="getLinkAndLaneById" parameterType="String" resultType="Map">
        SELECT 
            ID_Link , ID_Lane
        FROM 
            t_trafficsource  
        WHERE
            ID_TrafficSource LIKE CONCAT('%',#{id},'%')
    </select>
    <!--獲得資源的link和lane -->
    <select id="getById" parameterType="String" resultType="String">
        SELECT 
            ID_Link
        FROM 
            t_trafficsource  
        WHERE
            ID_TrafficSource = #{id}
    </select>
    
    <insert id="insertEarthMagnetic" parameterType="earthMagneticModel">
      INSERT INTO
            t_earthmagnetic 
            (ID_EMPosition,stationSerial,ID_Link,ID_Lane,vehicleCount,speed,createTime,Note)
      VALUES 
            (#{ID_EMPosition},#{stationSerial},#{ID_Link},#{ID_Lane},#{vehicleCount},#{speed},#{createTime},#{Note})
    </insert>
</mapper>

注意點1:mapper的命名空間namespace="com.itiis.client.dao.TrafficSourceMapper" 關(guān)聯(lián)到(1)創(chuàng)建的接口文件。

注意點2:parameterType和resultType對于自定義的java實體類默認使用全路徑捺檬,可以在 MyBatis 的配置文件中配置使用別名再层,上面 xml 已經(jīng)配置。

(3) 在 MyBatis 的 xml 配置文件中配置 Mapper 映射文件堡纬,上面的 xml 中已經(jīng)配置

<mappers>
    <mapper resource="mappersClient/TrafficSourceMapper.xml"/>
</mappers>

4. 使用

(1) SqlSessionFactory 使用單例聂受,全局唯一

SqlSessionFactoryUtil類,使用靜態(tài)代碼塊創(chuàng)建單例

package com.itiis.client.utils;

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
 * MyBatis下烤镐,全局唯一SqlSessionFactory蛋济,使用單例模式獲取
 */
public class SqlSessionFactoryUtil {

    //首先創(chuàng)建靜態(tài)成員變量sqlSessionFactory,靜態(tài)變量被所有的對象所共享炮叶。
    public static SqlSessionFactory sqlSessionFactory = null;
    
    private SqlSessionFactoryUtil() {}
    
    //使用靜態(tài)代碼塊保證線程安全問題
    static{
        
        String resource = "mybatisConfig.xml";
        
        try {
            
            InputStream inputStream = Resources.getResourceAsStream(resource);

            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            
        } catch (IOException e) {

            e.printStackTrace();
        }
        
    }

}

(2) 使用

    SqlSessionFactory factory = SqlSessionFactoryUtil.sqlSessionFactory;
    
    //true 不開啟事務(wù)碗旅,自動提交
    SqlSession s = factory.openSession(true);
      
    try {
    
        TrafficSourceMapper mapper = s.getMapper(TrafficSourceMapper.class);
        
        Map<String, String> linkAndLane = mapper.getLinkAndLaneById(ID_TrafficSource);
        
    } finally {
                
        s.close();
        //s.commit(); 如果開啟事務(wù)的話,要使用此代碼執(zhí)行任務(wù)
    }
      

注意點1:確保 SqlSession 的關(guān)閉

最好使用如下代碼塊

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}

注意點2:映射器實例(Mapper Instances)

映射器是一個你創(chuàng)建來綁定你映射的語句的接口镜悉。映射器接口的實例是從 SqlSession 中獲得的祟辟。因此從技術(shù)層面講,任何映射器實例的最大作用域是和請求它們的 SqlSession 相同的侣肄。盡管如此丈秩,映射器實例的最佳作用域是方法作用域柴钻。也就是說吝沫,映射器實例應(yīng)該在調(diào)用它們的方法中被請求浆劲,用過之后即可廢棄。并不需要顯式地關(guān)閉映射器實例,盡管在整個請求作用域(request scope)保持映射器實例也不會有什么問題,但是很快你會發(fā)現(xiàn),像 SqlSession 一樣怖竭,在這個作用域上管理太多的資源的話會難于控制。所以要保持簡單锣咒,最好把映射器放在方法作用域(method scope)內(nèi)侵状。下面的示例就展示了這個實踐:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // do work
} finally {
  session.close();
}

注意點3:事務(wù)的開啟

Java API

默認的 sqlSessionFactory.openSession(); 方法沒有參數(shù),它會開啟一個事務(wù)毅整,必須使用 commit 方法進行提交趣兄。

sqlSessionFactory.openSession(true); 會自動進行提交

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悼嫉,隨后出現(xiàn)的幾起案子艇潭,更是在濱河造成了極大的恐慌,老刑警劉巖戏蔑,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹋凝,死亡現(xiàn)場離奇詭異,居然都是意外死亡总棵,警方通過查閱死者的電腦和手機鳍寂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來情龄,“玉大人迄汛,你說我怎么就攤上這事≈枋樱” “怎么了鞍爱?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長专酗。 經(jīng)常有香客問我睹逃,道長,這世上最難降的妖魔是什么祷肯? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任沉填,我火速辦了婚禮,結(jié)果婚禮上佑笋,老公的妹妹穿的比我還像新娘翼闹。我一直安慰自己,他們只是感情好允青,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般颠锉。 火紅的嫁衣襯著肌膚如雪法牲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天琼掠,我揣著相機與錄音拒垃,去河邊找鬼。 笑死瓷蛙,一個胖子當著我的面吹牛悼瓮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艰猬,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼横堡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冠桃?” 一聲冷哼從身側(cè)響起命贴,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎食听,沒想到半個月后胸蛛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡樱报,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年葬项,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迹蛤。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡民珍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笤受,到底是詐尸還是另有隱情穷缤,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布箩兽,位于F島的核電站津肛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏汗贫。R本人自食惡果不足惜身坐,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望落包。 院中可真熱鬧部蛇,春花似錦、人聲如沸咐蝇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抹腿,卻和暖如春岛请,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背警绩。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工崇败, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肩祥。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓后室,卻偏偏與公主長得像,于是被迫代替她去往敵國和親混狠。 傳聞我的和親對象是個殘疾皇子岸霹,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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