编写工具类

复用与重构

复用:使用方法与函数,复用的类,构成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编写工具类的更多相关文章

  1. Mybatis通过工具类根据用户名查找用户列表

    抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程 /** * SqlSessionFactory工具类 * @author:Mr.Tan * @C ...

  2. MyBatis工厂工具类 MyBatisUtils

    import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apach ...

  3. mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口

    搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里

  4. Android自定义工具类获取按钮并绑定事件(利用暴力反射和注解)

    Android中为按钮绑定事件的有几种常见方式,你可以在布局文件中为按钮设置id,然后在MainActivity中通过findViewById方法获取按钮对象实例,再通过setOnClickListe ...

  5. Lucene第二篇【抽取工具类、索引库优化、分词器、高亮、摘要、排序、多条件搜索】

    对Lucene代码优化 我们再次看回我们上一篇快速入门写过的代码,我来截取一些有代表性的: 以下代码在把数据填充到索引库,和从索引库查询数据的时候,都出现了.是重复代码! Directory dire ...

  6. Json转换工具类(基于google的Gson和阿里的fastjson)

    在项目之中我们经常会涉及到字符串和各种对象的转换,为此特地整理了一下常用的转换方法 一.基于com.google.code.gson封装的json转换工具类 1. 在pom.xml文件里面引入gson ...

  7. java(List或Array数组)求交集、并集、差集, 泛型工具类

    业务需要求不同类型的交集.并集.差集为避免代码冗余编写工具类. 注:list 转数组需传入数组,如果将原数组传入将会改变原数组的值,同时泛型数组又不可以实例化,解决方案:Arrays.copyOf(n ...

  8. java 编程基础:【注解】 提取注解信息,利用自定义注解编写测试类,注解绑定事件

    提取注解信息 使用注解修饰了类.方法.成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应工具来提取并处理注解信息.   Java使用java.lang.annotation.Annotat ...

  9. 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作

    一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...

随机推荐

  1. java网络编程socket\server\TCP笔记(转)

    java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅     1 TCP的开销 a ...

  2. Java成长第三集--基础重点详细说明

    接上篇文章,继续阐述相关的重点基础知识,话不多说! 一.Java中equals()和“==”区别 1.对于8种基础数据类型,使用“=="比较值是否相等: 2.对于复合数据类型(类),使用eq ...

  3. day01,了解gcc

    今天主要是学一下gcc 功能选项: 一. 1.  gcc -E:表示预处理,把指令处理掉 2.gcc -o:改变目标文件名称 3. gcc -c: 表示只编译不链接(也就是不生成a.out) 4. g ...

  4. ASE课程总结 by 张葳

    本期ASE课程分为两个阶段,第一阶段的personal project与第二阶段的team project,其中,第一阶段旨在锻炼我们个人的问题解决能力和编程能力,第二阶段则锻炼主要我们的管理能力,合 ...

  5. H - Knight Moves DFS

    A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the sh ...

  6. Python函数的返回值和作用域

    函数的返回值和作用域 1.返回值 def guess(x):    if x > 3:        return "> 3"    else:        retu ...

  7. PHP Curl 请求https 60错误解决办法

      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 

  8. 解决cvc-complex-type.2.4.a: Invalid content was found starting with element

    今天用myeclipse导入 一个项目出现后出现cvc-complex-type.2.4.a: Invalid content was found starting with element 'inf ...

  9. tp5.0--多个条件查询全部数据

    用where来查询的话(非主键): 查找:

  10. linux sort 命令实用手册

    Linux 中的sort 命令是一个很实用的工具,用于对文本内容以行为单位进行ASCII 码排序,默认按照升序进行排序(当然也可以按照降序). sort 命令的格式如下: sort `参数` `文件名 ...