MyBatis 是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。MyBatis 几乎消 除了所有的JDBC 代码,也基本不需要手工去设置参数和获取检索结果。MyBatis 能够使用简单的 XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和POJOs(普通 java 对象)到 数据库中的记录。
总的来说,共有5部分需要写:1:Mybatis.xml文件
2:Mapper.xml文件
3:实体类
4:Dao类
5:工具类
其中,Mybatis.xml文件与工具类只需写一次就够了,而其他三个对应于不同的实体类需要多次进行编写。
准备开始
1. 所有的MyBatis 应用都以 SqlSessionFactory 实例为中心。SqlSessionFactory 实例通过 SqlSessionFactoryBuilder 来获得, SqlSessionFactoryBuilder 能够从XML 配置文件或者通过自 定义编写的配置类(Configuration class),来创建一个 SqlSessionFactory 实例。以下是工具类的代码。
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisTools {
//把session会话绑定在线程上,防止线程出现线程安全问题
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
//创建会话
private static SqlSessionFactory sqlSessionFactory;
static{
try {
Reader reader = Resources.getResourceAsReader("Mybatis.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建sqlsession会话对象
public static SqlSession createSqlSession(){
SqlSession sqlsession =threadLocal.get();
if (sqlsession ==null) {
//创建sqlsession对象
sqlsession=sqlSessionFactory.openSession();
//把当前创建session绑定在线程上
threadLocal.set(sqlsession);
}
return sqlsession;
}
public static void closeSqlsession(){
SqlSession sqlSession = threadLocal.get();
if (sqlSession !=null) {
sqlSession.close();
//把sqlsession与当前线程分离
threadLocal.remove();
}
}
}
2. XML 配置文件包含 MyBatis 框架的核心设置,包括获取数据库连接的 DataSource 实例,和包 括决定事务作用域范围和控制的事务管理等。您将能够在后面的章节中找到详细的 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>
<!-- 链接配置数据库 -->
<!-- 读取propreties文件 -->
<properties resource="db.properties"/>
<environments default="oracle">
<!-- 配置数据库信息 -->
<environment id="oracle">
<!--type:让谁来管理事务 -->
<transactionManager type="jdbc"/>
<!-- type:连接池 -->
<dataSource type="pooled">
<!-- name:是一个能被mybatis识别的文字,固定写法,不支持大写。全部小写 -->
<property name="driver" value="${oracle_driver}"/>
<property name="url" value="${oracle_url}"/>
<property name="username" value="${oracle_username}"/>
<property name="password" value="${oracle_password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="takeATest/StudentMapper.xml"/> //注意这里将mapper文件进行加载
</mappers>
</configuration>
虽然 XML 配置文件中还有很多其它的配置细节,但是,上面的示例显示了最重要的部分。注 意 XML 配置文件的头部,会使用DTD 验证文档来验证该 XML 配置文件。body 部分的environment 元素,包含了事务管理和连接池配置。Mappers 元素指定了映射配置文件--包含SQL 语句和映射 定义的XML 文件。
3.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">
<!-- namespace:空间名称 但是一定保证是唯一的 -->
<mapper namespace="StudentMapper">
<!-- 这里是映射实体与表的关系
type:这里存放时实体类的完整路径
id:实体与表映射的唯一标志
-->
<resultMap type="takeATest.Student" id="studentMap">
<!--
property:存放的是实体中的id属性
column:是数据库字段的id
-->
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<!-- 创建sql语句
id="add":是当前sql的标识符
注意:sql语句结束不需要有分号
parameterType:参数
resultMap:返回值。根据resultMap匹配
-->
<!-- 插入数据 -->
<insert id="add" parameterType="takeATest.Student">
insert into Student(id,name,age)values(#{id},#{name},#{age}) //这里展示的是一条动态插入的sql
</insert>
</mapper>
4.Dao层代码
public class StudentDao {
//插入数据
public void add(Student student){
SqlSession sqlSession=null;
try {
sqlSession = MybatisTools.createSqlSession();
int i=sqlSession.insert("StudentMapper.add", student);
//int i = sqlSession.insert("StudentMapper.add");
System.out.println("影响了"+i+"行");
sqlSession.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
sqlSession.rollback();
}finally{
MybatisTools.closeSqlsession();
}
}
5.实体类不用写了。