通过上一篇入门级别的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进行关闭。
二:项目总目录
三:工程搭建
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;
}
}
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);
}
}
}
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
所有CRUD参数都用Map对象进行了封装,所以要查看SQL映射文件中代码。
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}
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();
}
}