MyBatis的Util工具类的编写

MyBatis的Util工具类的编写

在用MyBatis框架连接数据库时,往往要经常创建sessionFactory,重复的编写大量代码,故将其中的重复代码提出成一个工具类,这样直接调用方法即可,可简化代码编写和优化运行效率,不需要重复的读取mybatis核心配置文件和反复new工厂对象

我编写的MyBatis的util工具类如下:

package com.zb.smbms.util;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {

	private static SqlSessionFactory sessionFactory = null;
	/*
	 * 创建本地线程变量,为每一个线程独立管理一个session对象 每一个线程只有且仅有单独且唯一的一个session对象
	 * 加上线程变量对session进行管理,可以保证线程安全,避免多实例同时调用同一个session对象
	 * 每一个线程都会new一个线程变量,从而分配到自己的session对象
	 */
	private static ThreadLocal<SqlSession> threadlocal = new ThreadLocal<SqlSession>();

	// 创建sessionFactory对象,因为整个应用程序只需要一个实例对象,故用静态代码块
	static {
		try {
			Reader reader = Resources.getResourceAsReader("Mybatis_config.xml");
			sessionFactory = new SqlSessionFactoryBuilder().build(reader);
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 返回sessionFactory对象 工厂对象
	 * 
	 * @return sessionFactory
	 */
	public static SqlSessionFactory getSessionFactory() {
		return sessionFactory;
	}

	/**
	 * 新建session会话,并把session放在线程变量中
	 */
	private static void newSession() {
		// 打开一个session会话
		SqlSession session = sessionFactory.openSession();
		// 将session会话保存在本线程变量中
		threadlocal.set(session);
	}
	
	/**
	 * 返回session对象
	 * @return session
	 */
	public static SqlSession getSession(){
		//优先从线程变量中取session对象
		SqlSession session = threadlocal.get();
		//如果线程变量中的session为null,
		if(session==null){
			//新建session会话,并把session放在线程变量中
			newSession();
			//再次从线程变量中取session对象
			session = threadlocal.get();
		}
		return session;
	}
	
	/**
	 * 关闭session对象,并从线程变量中删除
	 */
	public static void closeSession(){
		//读取出线程变量中session对象
		SqlSession session = threadlocal.get();
		//如果session对象不为空,关闭sessoin对象,并清空线程变量
		if(session!=null){
			session.close();
			threadlocal.set(null);
		}
	}
	
}

其中的Mybatis_config.xml是我的MyBatis的核心配置文件。

用静态代码块进行创建SqlSessionFactory,只在类加载时创建一次,保证了整个程序运行时只有一个工厂实例。

用线程变量保存session对象,是为了线程安全着想,这样自己的线程管理自己线程的session,不会出现多实例同时调用同一个session对象,造成数据不准确的情况出现。

MyBatisUtil.getSession(); 即可获得session对象;

MyBatisUtil.closeSession();  即可关闭线程对象,务必要在session使用完毕后关闭session。

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Sure! Here's an example implementation of a MyBatis Snowflake algorithm utility class in Java: ```java import java.util.Calendar; public class SnowflakeUtils { private final static long START_STAMP = 1480166465631L; private final static long SEQUENCE_BIT = 12; private final static long MACHINE_BIT = 10; private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); private final static long MACHINE_ID = getMachineId(); private static long lastTimestamp = -1L; private static long sequence = 0L; private static synchronized long nextId() { long timestamp = timeGen(); if (timestamp < lastTimestamp) { throw new RuntimeException("Clock moved backwards. Refusing to generate id."); } if (timestamp == lastTimestamp) { sequence = (sequence + 1) & MAX_SEQUENCE; if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; return ((timestamp - START_STAMP) << (SEQUENCE_BIT + MACHINE_BIT)) | (MACHINE_ID << SEQUENCE_BIT) | sequence; } private static long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } private static long timeGen() { return Calendar.getInstance().getTimeInMillis(); } private static long getMachineId() { // Replace this with logic to get a unique machine id return 1L; } public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println("Generated ID: " + nextId()); } } } ``` This utility class implements the Snowflake algorithm, which is a widely-used algorithm for generating unique IDs in a distributed system. The `nextId()` method generates the IDs based on the configured machine id and the current timestamp. Please note that the `getMachineId()` method needs to be implemented according to your specific environment to obtain a unique machine id. This can be done based on the network configuration of your machines, or you can use other methods such as reading a hardware identifier. You can run the `main` method to test the implementation and see generated IDs.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值