(3).mybatis编写工具类
编写工具类
复用与重构
复用:使用方法与函数,复用的类,构成JAR包。(工具类属于复用)
一。创建工具类(一般在src下创建util包,在util包下创建工具类)。
例如:MybatisUtilds为工具类:

二:本工具类,作用如下:
1.创建和初始化SqlSessionFactory封装成方法
2.能够创建在一定范围内(线程)有效的SqlSession
3.能够关闭在一定范围内()有效的SqlSession
4.能够进行事务控制
5.一些额外的支持Dao层便捷开发的方法
实现:
ThreadLocal:线程本地存储(只能存储一个对象,但是可以保证这个线程一直有效,除非线程销毁)
ThreadGroup:线程组
ThreadPool:线程池
泛型方法:
public static <T> T getMapper(Class<T> tClass){
return open().getMapper(tClass);
}
eg:
public static void rollback(){
SqlSession session = threadLocal.get();
if(session!=null) session.rollback();
UsersMapper dao=session.getMapper(UsersMapper.class);
NewsMapper newDao=session.getMapper(NewsMapper.class);
}
public static <T> T getMapper(Class<T> tClass){
return open().getMapper(tClass);
}
可更改:
public static void rollback(){
SqlSession session = threadLocal.get();
if(session!=null) session.rollback();
UsersMapper dao=getMapper(UsersMapper.class);
NewsMapper newDao=getMapper(NewsMapper.class);
}
public static <T> T getMapper(Class<T> tClass){
return open().getMapper(tClass);
}
三:完整代码:
MybatisUtils类:
package com.util; import com.dao.NewsMapper;
import com.dao.UsersMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream; public class MybatisUtils {
/**
* 1.创建和初始化SqlSessionFactory
* 2.能够创建在一定范围内(线程)有效的SqlSession
* 3.能够关闭在一定范围内()有效的SqlSession
* 4.能够进行事务控制
* 5.一些额外的支持Dao层便捷开发的方法
* * 场景1:重定向
* * me -> A(伊滨) 1request->response 1线程
* * -> B(西工) 2request->response 2线程
* * -> C(涧西) 3request->response 3线程
* * -> A(伊滨) 4request->response 4线程
* * 场景2:转发 1request->response 1线程
* * me -> A(伊滨)
* * -电话-> B(西工)
* * -电话-> C(涧西)
* * <-
* * 多线程环境下访问SqlSession是同一个么、需要是同一个么? 不是同一个
* * 单线程环境下访问SqlSession是同一个么、需要是同一个么? 是同一个
*/
static final String CONFIG_FILE = "mybatis-config.xml";
static SqlSessionFactory factory;
static{
initFactory(CONFIG_FILE);
}
public static void initFactory(String configName){
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
try {
InputStream resourceAsStream =
Resources.getResourceAsStream(configName);
factory = builder.build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
public static SqlSession open(){
SqlSession session = threadLocal.get();
if(session==null){
session = factory.openSession();
threadLocal.set(session);//线程绑定session,保证每次调用的是同一个线程
}
return session;
}
public static void close(){
SqlSession session = threadLocal.get();
if(session!=null){
session.close();
threadLocal.set(null);
}
}
public static void commit(){
SqlSession session = threadLocal.get();
if(session!=null) session.commit();
}
public static void rollback(){
SqlSession session = threadLocal.get();
if(session!=null) session.rollback();
UsersMapper dao=getMapper(UsersMapper.class);
NewsMapper newDao=getMapper(NewsMapper.class);
}
public static <T> T getMapper(Class<T> tClass){
return open().getMapper(tClass);
} }
测试类MybatisUtilsTest:
package com.dao; import org.apache.ibatis.session.SqlSession;
import org.junit.Test; import static com.util.MybatisUtils.open; public class MybatisUtilsTest {
//单线程测试
@Test
public void openInUniqueThread() throws InterruptedException{
SqlSession s1=open();
Thread.sleep(2000);
SqlSession s2=open();
Thread.sleep((int)(Math.random()*10000)+1000);
SqlSession s3=open();
Thread.sleep((int)(Math.random()*10000)+1000);
assert s1==s2&&s1==s3;
}
//多线程测试
SqlSession s1 = null;//全局变量
SqlSession s2 = null;
SqlSession s3 = null;
@Test
public void openInMultiplyThread() throws InterruptedException {
// 匿名类对象(匿名内部类)。1.创建匿名内部类(thread)2.重写run方法 3.创建对象
new Thread(){//子线程
public void run(){
s1 = open();
}
}.start();
new Thread(){
public void run(){
s2 = open();
}
}.start();
new Thread(){
public void run(){
s3 = open();
}
}.start();
// 等待,轮训
while(true){
if(s1 != null && s2 != null && s3 != null){
System.out.println("结束了!");
break;
}
System.out.println("等待:s1=" + s1 +",s2=" + s2 + ",s3=" + s3);
Thread.sleep(10);
}
assert s1 != s2 && s2 != s3 && s1 != s3;//主线程,s1,S2,S3为子线程。
} }
(3).mybatis编写工具类的更多相关文章
- Mybatis通过工具类根据用户名查找用户列表
抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程 /** * SqlSessionFactory工具类 * @author:Mr.Tan * @C ...
- MyBatis工厂工具类 MyBatisUtils
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apach ...
- mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口
搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里
- Android自定义工具类获取按钮并绑定事件(利用暴力反射和注解)
Android中为按钮绑定事件的有几种常见方式,你可以在布局文件中为按钮设置id,然后在MainActivity中通过findViewById方法获取按钮对象实例,再通过setOnClickListe ...
- Lucene第二篇【抽取工具类、索引库优化、分词器、高亮、摘要、排序、多条件搜索】
对Lucene代码优化 我们再次看回我们上一篇快速入门写过的代码,我来截取一些有代表性的: 以下代码在把数据填充到索引库,和从索引库查询数据的时候,都出现了.是重复代码! Directory dire ...
- Json转换工具类(基于google的Gson和阿里的fastjson)
在项目之中我们经常会涉及到字符串和各种对象的转换,为此特地整理了一下常用的转换方法 一.基于com.google.code.gson封装的json转换工具类 1. 在pom.xml文件里面引入gson ...
- java(List或Array数组)求交集、并集、差集, 泛型工具类
业务需要求不同类型的交集.并集.差集为避免代码冗余编写工具类. 注:list 转数组需传入数组,如果将原数组传入将会改变原数组的值,同时泛型数组又不可以实例化,解决方案:Arrays.copyOf(n ...
- java 编程基础:【注解】 提取注解信息,利用自定义注解编写测试类,注解绑定事件
提取注解信息 使用注解修饰了类.方法.成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应工具来提取并处理注解信息. Java使用java.lang.annotation.Annotat ...
- 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作
一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...
随机推荐
- Mysqldump参数大全 这 些参数 不同于 mysql 的那些参数(下边文章开头有链接) :2 种类型的参数含义是不一样的
Mysqldump参数大全 这 些参数 不同于 mysql 的那些参数 :2 种类型的参数含义是不一样的 Mysqldump参数大全(参数来源于mysql5.5.19源码) 参数 参数说明 --a ...
- L24 word2vec
词嵌入基础 我们在"循环神经网络的从零开始实现"一节中使用 one-hot 向量表示单词,虽然它们构造起来很容易,但通常并不是一个好选择.一个主要的原因是,one-hot 词向量无 ...
- L12 Transformer
Transformer 在之前的章节中,我们已经介绍了主流的神经网络架构如卷积神经网络(CNNs)和循环神经网络(RNNs).让我们进行一些回顾: CNNs 易于并行化,却不适合捕捉变长序列内的依赖关 ...
- CodeForces - 913C (贪心)
点完菜,他们发现好像觉得少了点什么? 想想马上就要回老家了某不愿透露姓名的林姓学长再次却陷入了沉思......... 他默默的去前台打算点几瓶二锅头. 他发现菜单上有n 种不同毫升的酒. 第 i 种有 ...
- PHP函数:get_class()
get_class() -返回对象的类名 说明: get_class ([ object $object = NULL ] ) : string 参数: object:要测试的对象.如果在类里,此参 ...
- redis:key命令(二)
设置一个key:set name hello 获取一个key的值:get name 查看所有的key:keys * 查看key是否存在:exists name 移动key到指定库:move name ...
- js获取数组中最大值
1.es6拓展运算符... Math.max(...arr) 2.es5 apply(与方法1原理相同) Math.max.apply(null,arr) 3.for循环 let max = arr[ ...
- ajaxReturn案例
请查看:http://www.cnblogs.com/bushe/p/4625097.html 不用自己写json格式啦,直接拿这个用就可以啦
- 防止html标签转义
function htmlDecode ( str ) { var ele = document.createElement('span'); ele.innerHTML = str; return ...
- sql语句------合并结果集
select id,max(val) FROM (select id,a 列名 val from 表名unionselect id,b 列名 val from 表名unionselect id,c 列 ...