利用 ThreadLocal获取或者关闭SqlSession对象,实现同一线程为同一SqlSession

一、MybatisUtil获取或者关闭SqlSession对象

public class MybatisUtil {
	
	private MybatisUtil(){}//建立构造方法
	private static final String resource="mybatis-config.xml";//配置文件名称用常量标示
	private static SqlSessionFactory sqlsf=null;//建立sqlsession工厂
	private static ThreadLocal threadLocal=new ThreadLocal();//建立本地线程
	创建线程局部变量threadLocal,用来保存Mybatis的threadLocal
	
	static{//静态与,加载时执行一次,在类初始化之前实现
		SqlSessionFactoryBuilder builder=null;
		Reader reader=null;
		try {
			reader=Resources.getResourceAsReader(resource);//将配置文件资源作为字符流
			builder=new SqlSessionFactoryBuilder();//初始化sqlsession工厂构造器对象
			sqlsf=builder.build(reader);//通过sqlsession工厂构造器对象将字符流建立SqlSession对象
		} catch (IOException e) {
			e.printStackTrace();
			throw new ExceptionInInitializerError("初始化mybatis错误!");
		}
	}
	
	
	public static SqlSessionFactory getSqlSessionFactory(){
		return sqlsf;
	}
	public static SqlSession getSession(){
		SqlSession session=threadLocal.get();//得到线程当前的SqlSession
		//可以保证每个线程对应一个数据对象,在任何时刻都操作的是这个对象。 
		if(session==null){
			session=sqlsf.openSession();//建立SqlSession
			threadLocal.set(session);//将新建立的SqlSession放在本地线程中
		}
		return session;
	}


	public static void closeSession(){
		SqlSession session=threadLocal.get();//得到本地线程中的SqlSession
		threadLocal.set(null);//设置本地线程threadLocal为空
		if (session !=null){
			session.close();
		}
	}
}


 
  
 
  

二、查询数量以及根据一个参数查询对象的属性

2-1映射文件









2-2配置文件













	
	
	
	



 
       
    
2-3dao的实现类中的方法

/**
	 * 无参数:查询总数
	 */

	public  int empCount() {
		// TODO Auto-generated method stub
		int count=0;
		SqlSession sqlsession=null;
		try {
			sqlsession=MybatisUtil.getSession();
			count=sqlsession.selectOne("com.yunhe.dao.EmpDao.empCount");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return count;
	}
	/**
	 * 通过id查询某一个对象
	 */
	public Emp empbyid(Integer id){
		SqlSession sqlsession=null;
		Emp emp=null;
		try {
			sqlsession=MybatisUtil.getSession();
			emp=sqlsession.selectOne("com.yunhe.dao.EmpDao.empbyid",id);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return emp;
	}
2-4单元测试的方法


@Test
	public void empcount(){
		int i=edi.empCount();
		System.out.println(i);
	}
	@Test
	public void empbyid(){
		Emp emp=edi.empbyid(7654);
		System.out.println(emp.getEname());
	}
	@Test
3.通过对象的属性(多个)返回单个对象

3-1映射文件



 
  


3-2dao的实现类中的方法

	/**
	 * 通过对象查询某一个对象
	 */
	public Emp empbyempid(Emp emp){
		SqlSession sqlsession=null;
		Emp emp1=null;
		try {
			sqlsession=MybatisUtil.getSession();
			emp1=sqlsession.selectOne("com.yunhe.dao.EmpDao.empbyempid",emp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return emp1;
	}



3-3单元测试的方法

@Test
	public void empbyempid(){
		Emp emp=new Emp();
		emp.setEmpno(7654);
		emp.setJob("SALESMAN");
		Emp emp1=edi.empbyempid(emp);
		System.out.println(emp1.getEname());
	}

4.通过map集合(多个)返回多个对象

4-1,映射文件



 
  
4-2,dao的实现类中的方法

	

 
  4-3,单元测试的方法 
  











你可能感兴趣的:(mybatis)