(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,作用 ...
随机推荐
- stand up meeting 1/15/2016 && work of weekend 1/16/2016~1/17/2016
part 组员 工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 组内对生词卡片又重新进行了讨论:准备最后的发布和整个开发的整理 ...
- K - Downgrade Gym - 101775K
题目大意:一天不玩相当于A-B中将A转换为经验值,B舍弃掉,然后A=1,在通过升级所需要的经验值来判断可以升几级 题目连接:https://codeforces.com/gym/101775/prob ...
- 原创hadoop2.6集群环境搭建
三台机器: Hmaster 172.168.2.3.Hslave1 172.168.2.4.Hslave2 172.168.2.6 JDK:1.8.49 OS:red hat 5.4 64 (由于后期 ...
- mysql 更改默认字符集
mysql 默认字符集概述 首先,MySQL的字符集问题主要是两个概念: haracter Sets Collations 前者是字符内容及编码,后者是对前者进行比较操作的一些规则.这两个参数集可以在 ...
- CentOS6.5环境下搭建Apache httpd服务器
前期准备: 1.CentOS6.5虚拟系统: 2.CentOS6.5 IP地址:192.168.2.99 3.虚拟系统能上外网 下面我们就开始配置: 第一步:安装 首先我们需要把Apache http ...
- WebApi参数检查验证FluentValidation的使用方法
右键打开NuGet程序包管理,进入浏览,搜索 FluentValidation,点击下载 在Model文件夹添加一个Person类进行校验 校验前,using需要引入相应的命名空间方可使用,Abstr ...
- 2、flink入门程序Wordcount和sql实现
一.DataStream Wordcount 代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 基于scala实现 maven依赖如下: <depend ...
- Python爬虫之记录一次下载验证码的尝试
好久没有写过爬虫的文章了,今天在尝试着做验证码相关的研究时,遇到了验证码的收集问题. 一般,验证码的加载都有着比较复杂的算法和加密在里边,但是笔者今天碰到的验证码却比较幸运,有迹可循.在此,给 ...
- String、String[]、ArrayList<String>之间的转换
1. ArrayList<String> 转换为 String[]: ArrayList<String> list = new ArrayList<>(); li ...
- java基于OpenCV的人脸识别
基于Java简单的人脸和人眼识别程序 使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html 注 ...