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

<h1><span style="font-size:24px;color:#ff0000;"><strong>一、MybatisUtil获取或者关闭SqlSession对象</strong></span></h1><pre name="code" class="java">public class MybatisUtil {
	
	private MybatisUtil(){}//建立构造方法
	private static final String resource="mybatis-config.xml";//配置文件名称用常量标示
	private static SqlSessionFactory sqlsf=null;//建立sqlsession工厂
	private static ThreadLocal<SqlSession> threadLocal=new ThreadLocal<SqlSession>();//建立本地线程
	创建线程局部变量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();
		}
	}
}


 
</pre><pre name="code" class="java">

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

2-1映射文件

<?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">
<mapper namespace="com.yunhe.dao.EmpDao"><!--命名空间为dao层,方法在实现类中-->
<select id="empCount" resultType="int">
	select count(1) from emp
</select>
<!--resultType为实体类的类型,对返回值类型在配置文件中命名别名-->
<!--单个参数进行查询,返回对象,但是该对象只有一个属性-->
<select id="empbyid" resultType="Empp" parameterType="Integer">
	select ename from emp where empno=#{empNo}
</select>
</mapper>

2-2配置文件

<?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>

<typeAliases><!--对返回值类型进行别名命名-->
<typeAlias type="com.yunhe.entity.Emp" alias="Empp"/>
</typeAliases>

<environments default="XX">
<environment id="XX">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
	<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
	<property name="url" value="jdbc:oracle:thin:@172.16.17.160:1521:orcl"/>
	<property name="username" value="scott"/>
	<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
 <mappers>
       <mapper  resource="com/yunhe/dao/EmpDao-mapper.xml"/>
    </mappers>
</configuration>
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
<span style="font-size:24px;color:#ff6666;">3.通过对象的属性(多个)返回单个对象</span>

3-1映射文件

<pre name="code" class="java"><select id="empbyempid" resultType="Empp" parameterType="Empp">
	select ename from emp where empno=#{empno} and job=#{job}
</select>


 


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());
	}

<span style="font-size:24px;color:#ff6666;">4.通过map集合(多个)返回多个对象</span>

4-1,映射文件

<pre name="code" class="java">


 
</pre><span style="color: rgb(255, 102, 102); font-size: 18px; ">4-2,dao的实现类中的方法</span><p></p><pre name="code" class="java">	

</pre><pre name="code" class="java">
4-3,单元测试的方法











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值