MyBatis核心对象的生命周期与封装

通过上一篇入门级别的MyBatis介绍,可以看得出来SqlSessionFactory,SqlSessionFactoryBuilder,SqlSession三个对象是MyBatis的核心对象,

这篇文章将重点介绍MyBatis核心对象的生命周期与封装。对象的生命周期指的是对象由创建到销毁的过程。


一:MyBatis核心对象生命周期介绍

1.SqlSessionFactoryBuilder可被JVM虚拟机所实例化,使用与销毁,但SqlSessionFactoryBuilder在创建SqlSessionFactory后便不许要存在了,既不需要时刻保持该对象的状态,所以可以在方法内部声明SqlSessionFactoryBuilder对象创建SqlSessionFactory.


2.SqlSessionFactory作为由SqlSessionFactory创建的对象,其实例在运行期间应当一直存在,不需要每次调用数据库时进行创建,故使用的它的最佳方式是使用单例模式。


3.SqlSession对象由SqlSessionFactory对象创建。每个线程都应该由一个自己的SqlSession实例,该实例不可共享且线程是不安全的,所以千万不要在Servlet中声明对象的实例变量。又因为Servlet是单例的,声明成实例变量会造成线程的不安全,也绝对不能将SqlSession放在一个类的静态字段甚至实例字段中,还不可以将SqlSession实例对象放在任何类型的管理中,如Servlet的HttpSession会话中。最后务必在finally语句中对SqlSession进行关闭。


二:项目总目录

MyBatis核心对象的生命周期与封装_第1张图片


三:工程搭建

1.新建web项目,新建包dbtools,创建GetSqlSessionFactory.java类

package dbtools;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class GetSqlSessionFactory {

	private static SqlSessionFactory sqlSessionFactory;
	//单例模式
	public GetSqlSessionFactory() {
	}
		// TODO Auto-generated constructor stub
		synchronized public static SqlSessionFactory getSqlSessionFactory() {
			if(sqlSessionFactory==null){
				String resource="mybatis-config.xml";
				InputStream inputStream=GetSqlSessionFactory.class.getResourceAsStream(resource);
				sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
			}
			return sqlSessionFactory;
		}
	}



2.新建GetSqlSession.java类

package dbtools;

import org.apache.ibatis.session.SqlSession;

public class GetSqlSession {

	private static ThreadLocal thread1=new ThreadLocal();
	
        //获取SqlSession
	public static SqlSession getSqlSession() {
		// TODO Auto-generated constructor stub
		SqlSession sqlSession=thread1.get();
		if(sqlSession==null){
			sqlSession=GetSqlSessionFactory.getSqlSessionFactory().openSession();
			thread1.set(sqlSession);
		}
		return sqlSession;
	}

	public static void commit(){
		if(thread1.get()!=null){
			thread1.get().commit();
			thread1.get().close();
			thread1.set(null);
		}
	}
	
        //回滚
	public static void rollBack(){
		if(thread1.get()!=null){
			thread1.get().rollback();
			thread1.get().close();
			thread1.set(null);
		}
	}
}

3.创建数据库操作类DBoperate.java

package dbtools;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

public class DBoperate {

	public int insert(String sql, Map valueMap) {
		SqlSession sqlSession = GetSqlSession.getSqlSession();
		return sqlSession.insert(sql, valueMap);
	}

	public int delete(String sql, Map valueMap) {
		SqlSession sqlSession = GetSqlSession.getSqlSession();
		return sqlSession.delete(sql, valueMap);
	}

	public int update(String sql, Map valueMap) {
		SqlSession sqlSession = GetSqlSession.getSqlSession();
		return sqlSession.update(sql, valueMap);
	}

	public List select(String sql, Map valueMap) {
		SqlSession sqlSession = GetSqlSession.getSqlSession();
		return sqlSession.selectList(sql, valueMap);
	}
}

所有CRUD参数都用Map对象进行了封装,所以要查看SQL映射文件中代码。


4.使用MyBatis反向生成数据库映射POJO类,并将其置于orm包中(反向生成方法参考上一篇MyBatis入门)

    新建InfosMapping.xml文件置入orm包中




	
		insert into
		INFOS(STUID,STUNAME,GENDER,ID)
		values(#{stuid},#{stuname},#{gender},#{id})
	
	
	
	
	
	delete from INFOS where ID=#{id}
	
	
	
	
	
	update INFOS
	set STUID=#{stuid},STUNAME=#{stuname},GENDER=#{gender}
	where ID=#{id}
	

5.在dbtools包下新建mybatis配置文件mybatis-config.xml



 
 	
 		
 		
 		
 			
                
                        
 			
 			
 		
 		
 	
        
         
 		
 	
 

6.新建servlet

package servlet;

import java.io.IOException;
import java.util.HashMap;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dbtools.DBoperate;
import dbtools.GetSqlSession;


public class insertServlet extends HttpServlet implements Servlet {
	

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	try {
		HashMap valueMap=new HashMap();
		valueMap.put("stuid", "stu003");
		valueMap.put("stuname", "xiaoming");
		valueMap.put("gender", "Boy");
		valueMap.put("id", "12");
		
		DBoperate dbOperate=new DBoperate();
		dbOperate.insert("insertInfos", valueMap);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		GetSqlSession.rollBack();
	}
	GetSqlSession.commit();
	}

}


你可能感兴趣的:(MyBatis)