您的位置:首页 > 其它

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

二:项目总目录



三:工程搭建

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

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: