MyBatis 单独使用步骤(不结合Spring)

参考

mybatis 入门官方中文文档


使用 Myeclipse+maven 构建项目

1. 导包

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

如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

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

2. XML 配置文件

创建一个 XML 配置文件,XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含:

  • 数据库连接实例的数据源(DataSource)
  • 决定事务作用域和控制方式的事务管理器(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来设置别名。别名默认为首字母小写。 -->
    <typeAliases>
        <package name="com.itiis.client.entity"/>
    </typeAliases>
    
    <!-- environment 元素体中包含了事务管理和连接池的配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- DBCP数据源 -->
            <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,最大空闲数 -->
                <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:使用自定义数据源

MyBatis的数据源并不是很强大,所以它也可以不使用其本身自带的数据源,而配置成其它的数据源如DBCP/C3P0等等。

官方文档 XML 数据源配置

官方也给出了C3P0的数据源配置方法。

DBCP的配置方法

(1) 创建一个java类,代码如下,将MyBatis的数据源设置为DBCP数据源。

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 配置文件中配置数据源

    <!-- DBCP数据源 -->
    <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,最大空闲数 -->
        <property name="maxActive" value="10"/>
        <property name="validationQuery" value="SELECT 1"/>
    </dataSource>

注意点2:MyBatis的 xml 配置严格讲究顺序,比如 properties 不能配置到 typeAliases 后面,否则就会出错而不能加载 xml

3. Mapper映射器

Mapper XML 文件

(1) 创建一个接口类 ***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) 创建一个 ***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" 关联到(1)创建的接口文件。

注意点2:parameterType和resultType对于自定义的java实体类默认使用全路径,可以在 MyBatis 的配置文件中配置使用别名,上面 xml 已经配置。

(3) 在 MyBatis 的 xml 配置文件中配置 Mapper 映射文件,上面的 xml 中已经配置

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

4. 使用

(1) SqlSessionFactory 使用单例,全局唯一

SqlSessionFactoryUtil类,使用静态代码块创建单例

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 {

    //首先创建静态成员变量sqlSessionFactory,静态变量被所有的对象所共享。
    public static SqlSessionFactory sqlSessionFactory = null;
    
    private SqlSessionFactoryUtil() {}
    
    //使用静态代码块保证线程安全问题
    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 不开启事务,自动提交
    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(); 如果开启事务的话,要使用此代码执行任务
    }
      

注意点1:确保 SqlSession 的关闭

最好使用如下代码块

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

注意点2:映射器实例(Mapper Instances)

映射器是一个你创建来绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显式地关闭映射器实例,尽管在整个请求作用域(request scope)保持映射器实例也不会有什么问题,但是很快你会发现,像 SqlSession 一样,在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法作用域(method scope)内。下面的示例就展示了这个实践:

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

注意点3:事务的开启

Java API

默认的 sqlSessionFactory.openSession(); 方法没有参数,它会开启一个事务,必须使用 commit 方法进行提交。

sqlSessionFactory.openSession(true); 会自动进行提交

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容