MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
导入MyBatis依赖
创建好maven工程后在pom.xml中添加mybatis的依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
为了连接数据库与测试可以添加mysql和junit依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
MyBatis配置文件
XML配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- default指向需要链接的数据库,environments可以包含多个链接信息,用id进行区分 -->
<environments default="development">
<environment id="development">
<!-- 链接方式,采用JDBC的方式链接 -->
<transactionManager type="JDBC"/>
<!-- 链接信息,type为创建链接的方式:POOLED为使用连接池连接,UNPOOLED直连数据库 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysqltest"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
dataSource的内容与JDBC相同,填写对应的数据库驱动包、驱动协议、用户名密码,MyBatis的基础信息就可以创建完成。
加载配置文件并创建连接
一般将配置文件放在项目的资源目录下(resource),使用mybatis提供的Resources
类的静态方法getResourceAsReader(Reader reader)
将配置文件加载到文件流中。
调用工厂类SqlSessionFactoryBuilder
提供的build(Reader reader)
方法,创建SqlSessionFactory
核心对象。
拥有核心对象后就可以创建SqlSession
对象,SqlSession
对象作为操作数据库的核心类,提供了很多操作数据库的方法。调用SqlSessionFactory
的openSession()
方法即可创建SqlSession
对象。
与JDBC相同,创建了数据的连接就需要释放连接避免资源长时间的占用,所以使用sqlSession.close()
方法释放资源
如果使用的是连接池(POOLED)方式连接数据库,会将创建的连接重新放回连接池中
如果使用直连(UNPOOLED)方式连接数据库,则会直接释放资源
package com.mybatis;
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 org.junit.Test;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
public class TestMyBatis {
@Test
public void myBatisTest() {
SqlSession sqlSession = null;
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
sqlSession = sqlSessionFactory.openSession();
Connection connection = sqlSession.getConnection();
System.out.println(connection);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null)
sqlSession.close();
}
}
}
一般来说创建连接不需要调用getConnection()方法进行创建,MyBatis可以自动创建连接
工具类的抽取
与JDBC相同,可以将配置的加载,数据库连接,数据库会话的创建与销毁集成在一个工具类中,既可以保证SqlSessionFactory对象的唯一性也可以方便使用
package com.mybatis.utils;
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.Reader;
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
public static void close(SqlSession sqlSession) {
if (sqlSession != null)
sqlSession.close();
sqlSession = null;
}
}
创建测试类
package com.mybatis;
import com.mybatis.utils.MyBatisUtils;
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 org.junit.Test;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
public class TestMyBatis {
@Test
public void myBatisUtilsTest() {
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.getSqlSession();
Connection connection = sqlSession.getConnection();
System.out.println(connection);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtils.close(sqlSession);
}
}
}