Mybatis整理_01

时间:2022-01-08 16:32:30

Mybatis专题

Mybaits介绍

Mybatis是一个持久化框架,它有不同语言的版本,比如.NET和Java都有Mybatis对应的类库;它有大多数ORM框架都具有的功能,比如自定义的SQL语句、调用存储过程和一些高级映射,但是它是一种半自动化的ORM框架,与Hibernate的使用方式还是有很大的区别。Mybatis它是以SQL语句作为映射基础。Mybatis可以使用XML或Annotaions注解的方式将数据表中的记录映射成一个Map或者Java POJO对象。Hibernate和大多数JPA规范实现都可以使用Annotations注解的方式来设计程序。

Mybatis操作数据库的步骤

Mybatis的核心框架是SqlSessionFactory对象,它是创建SqlSession对象的工厂。但SqlSessionFactory对象的创建来自于SqlSessionFactoryBuilder,也就是使用SqlSessionFactoryBuilder类创建SqlSessionFactory对象

1.使用XML配置文件创建SqlsessionFactory对象

package test;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
 * 取得SqlsessionFactory工厂对象
 * @author Ljx
 *
 */
public class Test {

	public static void main(String[] args) {
		String resource = "mybatis-config.xml";
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			System.out.println(sqlSessionFactory);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

 

mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"mybatis-3-config.dtd">
<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver"
					value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://127.0.0.1:3306/mybatis" />
				<property name="username" value="root" />
				<property name="password" value="0000" />
			</dataSource>
		</environment>
	</environments>
</configuration>

运行结果:

Mybatis整理_01

SqlsessionFactory类结构:

Mybatis整理_01

SqlSessionFactory类结构:

Mybatis整理_01

从两个类的结构中基本上都是重载的方法,主要是为了取得SqlSessionFactory和SqlSession对象。

Mybatis核心对象的生命周期与封装

对象的生命周期也就是重创建到销毁的过程,在这个过程中,如果实现的代码不佳,很容易造成程序上的错误或效率低下。

  1. SqlSessionFactoryBuilder对象可以被JVM虚拟机所实例化、使用或者销毁。一旦使用SqlsessionFactoryBuilder创建SqlsessionFactory对象后,SqlsessionFactoryBuilder就不需要存在了,不需要在保持此对象的状态,可以随意任JVM销毁。所以SqlSessionFactoryBuilder对象的使用范围最好是方法之内,可以在方法内部声明SqlSessionFactoryBuilder对象来创创建SqlSessionFactory对象。

  2.SqlSessionFactory对象由SqlSessionFactoryBuilder对象创建,一旦创建SqlSessionFactory类的实例,该实例应该在程序运行期间都存在,不需要每次操作数据库都重新创建,应用它的最佳方法就是写一个单例模式,或者使用spring框架来实现单例模式对SqlsessionFactory对象进行有效的管理。

  3.SqlSession对象由SqlSessionFactory对象创建,每个线程都应该有他自己的SqlSession实例,SqlSession实例不能共享,它是线程不安全的。关闭SqlSession很重要,确保使用finally来关闭它。

1.关于Mybatis生命周期创建的实例:

创建GetSqlsessionFactory类:

package test;

import org.apache.ibatis.session.SqlSession;

public class GetSqlSession {

	private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();
	public static SqlSession getSqlSession(){
		SqlSession sqlSession = tl.get();
		if(sqlSession == null){
			sqlSession = GetSqlSessionFactory.getSqlSessionFactory().openSession();
			tl.set(sqlSession);
		}
		System.out.println("获得的SqlSession的hashcode:"+sqlSession.hashCode());
		return sqlSession;
	}

	public static void commit(){
		if(tl.get() != null){
			tl.get().commit();
			tl.get().close();
			tl.set(null);
		}
	}
	public static void rollback(){
		if(tl.get() != null){
			tl.get().rollback();
			tl.get().close();
			tl.set(null);
		}
	}
}

测试:

package test;

import java.io.InputStream;

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

import dbtool.GetSqlSession;
/**
 * 取得SqlsessionFactory工厂对象
 * @author 梁家翔
 *
 */
public class Test {

	public static void main(String[] args) {
		try {
			GetSqlSession.getSqlSession();
			GetSqlSession.getSqlSession();
			GetSqlSession.getSqlSession();
			GetSqlSession.getSqlSession();
			GetSqlSession.getSqlSession();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

运行结果:

Mybatis整理_01