mybatis工作流程
1)通过Reader对象读取src目录下的mybatis.xml配置文件(该文本的位置和名字可任意)
2)通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象
3)从当前线程中获取SqlSession对象
4)事务开始,在mybatis中默认
5)通过SqlSession对象读取StudentMapper.xml映射文件中的操作编号,从而读取sql语句
6)事务提交,必写
7)关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收
mybatis.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="db.properties"/>
<!-- 设置类型别名 -->
<typeAliases >
<typeAlias type="cn.buaa.mybatis.app1.Student" alias="student"/>
</typeAliases>
<!-- 设置默认的连接环境信息 -->
<environments default="mysql_developer">
<!-- 连接环境信息 ,随便起一个唯一的名字 -->
<environment id="mysql_developer">
<!-- mybatis使用jdbc事物管理方式 -->
<transactionManager type="jdbc"></transactionManager>
<!-- mybatis使用连接池方式来获取连接 -->
<dataSource type="pooled">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/emp"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<!-- 连接环境信息 ,随便起一个唯一的名字 -->
<environment id="oracle_developer">
<!-- mybatis使用jdbc事物管理方式 -->
<transactionManager type="jdbc"></transactionManager>
<!-- mybatis使用连接池方式来获取连接 -->
<dataSource type="pooled">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521/orcl"/>
<property name="username" value="zhangdong"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件-->
<mappers>
<mapper resource="cn/buaa/mybatis/app1/studentMapper.xml"/>
</mappers>
</configuration>
studentMapper.xml
<?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="studentNamespace">
<!-- resultMap标签:映射实体与表
type属性:表示实体全路径名
id属性:为实体与表的映射取一个任意的唯一的名字
-->
<resultMap type="student" id="studentMap">
<!-- id标签:映射主键属性
result标签:映射非主键属性
property属性:实体的属性名
column属性:表的字段名
-->
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sal" column="sal"/>
</resultMap>
<!--
insert标签:要书写insert这么一个sql语句
id属性:为insert这么一个sql语句取一个任意唯一的名字
parameterType:要执行的dao中的方法的参数,如果是类的话,必须使用全路径类
-->
<insert id="add1">
insert into students(id,name,sal) values(2,'哈哈',7000)
</insert>
<!--
<insert id="add2" parameterType="student">
insert into students(id,name,sal) values(#{id},#{name},#{sal})
</insert>
<insert id="add3" parameterType="student">
insert into students(id,name,sal) values(#{id},#{name},#{sal})
</insert>
-->
</mapper>
StudentDao.java
package cn.buaa.mybatis.app1;
import org.apache.ibatis.session.SqlSession;
import cn.buaa.mybatis.util.MybatisUtil;
/**
* 持久层
* @author 梧桐下的茵
*
*/
public class StudentDao {
/**
* 增加学生
*/
public void add1() throws Exception{
SqlSession sqlSession = null;
try {
sqlSession = MybatisUtil.getSqlSession();
int i = sqlSession.insert("studentNamespace.add1");
System.out.println("本次操作影响了" + i + "行");
//事物提交
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}finally{
MybatisUtil.closeSqlSession();
}
}
//测试
public static void main(String[] args) throws Exception{
StudentDao dao = new StudentDao();
dao.add1();
//dao.add2(new Student(2,"呵呵",8000D));
//dao.add3(new Student(3,"嘻嘻",9000D));
//dao.add3(new Student(4,"笨笨",9000D));
}
}
MybatisUtil.java mybatis工具类
package cn.buaa.mybatis.util;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 工具类
* @author 梧桐下的茵
*
*/
public class MybatisUtil {
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
private static SqlSessionFactory sqlSessionFactory;
/**
* 加载位于src/mybatis.xml配置文件
*/
static{
try {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
//禁止外部 new
private MybatisUtil(){}
/**
* 获取SqlSession
*/
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
/**
* 关闭SqlSession与当前线程分离
*/
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close();
}
//分离当前线程与SqlSession对象的关系,目的是让GC尽早回收
threadLocal.remove();
}
/**
* 测试
*/
public static void main(String[] args) {
Connection connection = MybatisUtil.getSqlSession().getConnection();
System.out.println(connection != null ? "连接成功" : "连接失败");
}
}