参考
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等等。
官方也给出了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映射器
(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:事务的开启
默认的 sqlSessionFactory.openSession(); 方法没有参数,它会开启一个事务,必须使用 commit 方法进行提交。
sqlSessionFactory.openSession(true); 会自动进行提交
网友评论