參考
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等等。
官方也給出了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映射器
(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ù)的開啟
默認的 sqlSessionFactory.openSession(); 方法沒有參數(shù),它會開啟一個事務(wù)毅整,必須使用 commit 方法進行提交趣兄。
sqlSessionFactory.openSession(true); 會自動進行提交