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进行关闭。


二:项目总目录


三:工程搭建

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<SqlSession> thread1=new ThreadLocal<SqlSession>();
	
        //获取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<Map> 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包中

<?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="mybatis.testcurd">
	<insert id="insertInfos" parameterType="map"
	  useGeneratedKeys="true" keyProperty="id">
		insert into
		INFOS(STUID,STUNAME,GENDER,ID)
		values(#{stuid},#{stuname},#{gender},#{id})
	</insert>
	
	<select id="selectInfos" parameterType="map" resultType="map">
	select * from INFOS where ID=#{id}
	</select>
	
	<delete id="deleteInfos" parameterType="map">
	delete from INFOS where ID=#{id}
	</delete>
	
	<select id="getAllInfos" resultType="map">
	select * from INFOS
	</select>
	
	<update id="updateInfos" parameterType="map">
	update INFOS
	set STUID=#{stuid},STUNAME=#{stuname},GENDER=#{gender}
	where ID=#{id}
	</update>
</mapper>

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

<?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>
 	<environments default="development">
 		<environment id="development">
 		<transactionManager type="JDBC"/>
 		<dataSource type="POOLED">
 			<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <!--自己oracle中的url-->
                        <property name="url" value="jdbc:oracle:thin:@192.168.xxx.xxx:1521:TC83"/>
 			<property name="username" value="admin"/>
 			<property name="password" value="admin"/>
 		</dataSource>
 		</environment>
 	</environments>
        <!--上一步创建的InfoMapping.xml文件路径-->
         <mappers>
 		<mapper resource="orm/InfosMapping.xml"/>
 	</mappers>
 </configuration>

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<String,String> valueMap=new HashMap<String,String>();
		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();
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值