(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,作用 ...
随机推荐
- spring jar 包 用处功能:
自己积累的: @ spring-context-3.0.5.RELEASE.jar :主要用于 spring程序中加载类 ApplicationContext 用.eq: ApplicationC ...
- Web 如何搭建自己的个人网站
如何搭建自己的个人技术博客网站 学习目标 1.[了解]搭建网站需要的web构件和网站运行原理 2.[掌握]如何搭建个人博客网站 学习前言 大家都是学习开发的,相信都接触过百度,新浪,淘宝,京东...等 ...
- Linux protobuf
生成C# protobuf 最终文件Net.cs .protoc --descriptor_set_out=a.protobin a.proto .mono protogen.exe -i:Net.p ...
- sudo -s 命令 [oh-my-zsh] 提示检测到不安全目录
运行sudo -s 命令时,[oh-my-zsh] 冒出下面一大堆提示: [oh-my-zsh] Insecure completion-dependent directories detected: ...
- 牛客网 - vivo2020届春季
牛客网 - vivo2020届春季 1.[编程题]手机屏幕解锁模式 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M 现有一个 3x3 规格的 Android ...
- sqlilabs less18-22 HTTP头的注入
less18 user-agent的注入 源码分析: check_input对name,password进行了过滤 function check_input($value) { if(!empty($ ...
- 2019-2020-1 20199308《Linux内核原理与分析》第一周作业
Linux 基础入门(新版)学习笔记 实验二 基本概念及操作 重要快捷键 Tab 补全命令 Ctrl+c 强行终止当前命令 历史命令 方向上键↑,恢复之前输入过的命令 通配符 在命令行中获取帮助 某个 ...
- 2019-2020-1 20199328《Linux内核原理与分析》第六周作业
使用gdb跟踪分析一个系统调用内核函数 首先我们删除本身的menu目录,并从github上克隆一个menu,并进行编译 编译过程 现在找到test.c文件,加入上个实验中做的getPid()方法 利用 ...
- SpringBoot @ConfigurationProperties详解
文章目录 简介 添加依赖关系 一个简单的例子 属性嵌套 @ConfigurationProperties和@Bean 属性验证 属性转换 自定义Converter SpringBoot @Config ...
- 计算4的n次幂html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...