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 ? "连接成功" : "连接失败"); } }