MyBatis核心对象的生命周期与封装
2016-03-22 14:26
435 查看
通过上一篇入门级别的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进行关闭。
二:项目总目录
三:工程搭建
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;
}
}
4000
ls;
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);
}
}
}
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映射文件中代码。
<!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>
<!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>
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();
}
}
这篇文章将重点介绍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 dbtoo4000
ls;
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();
}
}
相关文章推荐
- 基于WinInet API的HTTP编程
- iOS巅峰之将时间戳转化成标准的时间格式
- 继承
- WebBindingInitializer学习
- mybatis3通用crud的研究二
- AndroidSample之ZoomActivity的学习
- Hibernate的Hql语句使用in关键字
- 拦截器
- WIN7下使用iis搭建php环境(上)
- mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
- squid代理服务器搭建及配置
- 自定义控件入门(二)
- Android 从相册中选择照片并返回
- 获取元素CSS值之getComputedStyle方法熟悉
- [LeetCode]题解(python):125-Valid Palindrome
- 开启关闭功能没有生效的原因
- VC CFont 用法
- 如何离线查看Windows API和网上查询Windows API
- Shell技巧
- VS2008加快编译速度方法