(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,作用 ...
随机推荐
- AJ学IOS(12)UI之UITableView学习(上)LOL英雄联盟练习
AJ分享,必须精品 先看效果图 源代码 NYViewController的代码 #import "NYViewController.h" #import "NYHero. ...
- [算法]Miller-Robbin素数判定
目录 一.实现原理 二.应用 判断一个正整数是否为素数 三.小结 一.实现原理 我们以前都是怎么判断素数的呢: 试除法: 若一个正整数N为合数,则存在一个能整除N的数k,其中\(2\leqslant ...
- Linux 下发送邮件
由于种种原因,需要由我这个兼职运维每天发送对账单文件给运营同学,故研究下 Linux 发送邮件,希望对大家有所帮助. 安装 # Centos,安装 mailx $ yum install -y mai ...
- 猜数字和飞机大战(Python零基础入门)
前言 最近有很多零基础初学者问我,有没有适合零基础学习案例,毕竟零基础入门的知识点是非常的枯燥乏味的,如果没有实现效果展示出来,感觉学习起来特别的累,今天就给大家介绍两个零基础入门的基础案例:猜数字游 ...
- Supermarket POJ - 1456(贪心)
题目大意:n个物品,每个物品有一定的保质期d和一定的利润p,一天只能出售一个物品,问最大利润是多少? 题解:这是一个贪心的题目,有两种做法. 1 首先排序,从大到小排,然后每个物品,按保质期从后往前找 ...
- F - What Is Your Grade?
“Point, point, life of student!” This is a ballad(歌谣)well known in colleges, and you must care about ...
- Python的6种方式实现单例模式
单例模式是一个软件的设计模式,为了保证一个类,无论调用多少次产生的实例对象,都是指向同一个内存地址,仅仅只有一个实例(只有一个对象). 实现单例模式的手段有很多种,但总的原则是保证一个类只要实例化一个 ...
- vue2.x学习笔记(二)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12555836.html. 声明式渲染 vue的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进DOM的系统. ...
- python3爬虫 爬取动漫视频
起因 因为本人家里有时候网速不行,所以看动漫的时候播放器总是一卡一卡的,看的太难受了.闲暇无聊又F12看看.但是动漫网站却无法打开控制台.这就勾起了我的兴趣.正好反正无事,去寻找下视频源. 但是这里事 ...
- JACTF Web部分
掘安团队的题目 平台已不运营 Web签到 发现请求URL为flag.php,但是会跳转到404.php页面,抓包发现有302重定向,查看响应包,flag经过base64编码,解码即可 Tips: 重定 ...