瑞蜀黍

导航

 

MyBatis注意事项总结

1. 增删改必须要提交事务。(事务自动开启,手动提交模式)
2. 参数绑定情况
	实体类型        							#{属性名}
    (单个参数)基本数据类型+包装类型+String		  #{随便}
    没有参数 
    多个参数
    
3. mapper文件转义字符。

MyBatisUtil的封装

MyBatis核心API

SqlSession:
	1. 相当于connection
		sqlSession.commit();//提交事务
		sqlSession.rollback();//回滚事务
		sqlSession.close();//将连接还回连接池。
	2. 获得XXxDAO接口的对象。
	轻量级对象,每次操作创建一个新的。
		比如: Action  SqlSession  Connection
SqlSessionFactory
	作用: 封装mybatis-config配置文件的信息。
	重量级对象,web应用只创建一个。对象的创建消耗资源。
package com.baizhi.demo4;

import java.io.IOException;
import java.io.InputStream;

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 MyBatisUtil2 {
	private static SqlSessionFactory factory = null;
	private static ThreadLocal<SqlSession> tdl = new ThreadLocal<SqlSession>();
	static{
		InputStream is = null;
		try {
			is = Resources.getResourceAsStream("mybatis-config.xml");
			factory =  new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			throw new RuntimeException("mybatis配置文件加载异常",e);
		}finally{
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	
	/**
	 * 获得SqlSession
	 * @throws IOException 
	 */
	public static SqlSession getSqlSession(){
		//1. 获得DAO对象  sqlSession
		SqlSession session = null;
		//从当前线程中获得session
		try {
			session = tdl.get();
			if(session == null){
				//当前线程如果没有sqlSEssion
				session = factory.openSession();
				//将session存入当前线程
				tdl.set(session);
			}
		} catch (Exception e) {
			throw new RuntimeException("获得SqlSession的异常",e);
		}
		return session;
	}
	
	/**
	 * 根据接口的类对象,获得dao的对象。
	 * @param clazz
	 * @return
	 */
	public static <T> T getMapper(Class<T> clazz){
		//获得sqlSession
		SqlSession session = getSqlSession();
		//调用session.getMapper(clazz);
		T t = session.getMapper(clazz);
		return t;
	}
	
	/**
	 * 提交事务+释放资源
	 */
	public static void commit(){
		//sqlSession.commit();
		try{
			SqlSession session = getSqlSession();
			session.commit();
		}catch(RuntimeException e){
			throw e;
		}finally{
			close();
		}
	}
	/**
	 * 回滚事务+释放资源
	 */
	public static void rollback(){
		try{
			SqlSession session = getSqlSession();
			session.rollback();
		}catch(RuntimeException e){
			throw e;
		}finally{
			//释放资源
			close();
		}
	}
	
	/**
	 * 释放session资源
	 */
	public static void close(){
		//session.close();
		SqlSession session = getSqlSession();
		if(session != null){
			session.close();
			//从当前线程中移除该session
			tdl.remove();
		}
	}
}
posted on 2020-10-10 16:45  瑞蜀黍  阅读(59)  评论(0)    收藏  举报