MyBatis(半自动) 是一款优秀的持久层dao框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
mybatis – MyBatis 3 | 简介
1.1 持久层框架 orm 框架 ( object relation mapping ) 对象关系映射
java |
database |
类 |
表 |
对象 |
一行数据(主键) |
属性 |
列 |
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等
测试一级缓存:mybatis的一级缓存,在同一个sqlsession中生效,一旦sqlsession关闭,缓存自动消失,查询相同的内容,需要重新连接数据库获取。
@Test
// mybatis的一级缓存,在同一个sqlsession中生效,
// 一旦sqlsession关闭,缓存自动消失,查询相同的内容,需要重新连接数据库获取
public void findAllEmpInfo() {
// 从测试案例可以看出,同一次会话,默认缓存数据,第二次查询相同的数据,直接从缓存中获取。
System.out.println("第一次查询");
List allEmpInfo = empDao.selectEmpInfo();
for (EmpEntity empEntity : allEmpInfo) {
System.out.println("实体类"+empEntity.toString());
}
System.out.println("第二次查询");
List allEmpInfo1 = empDao.selectEmpInfo();
for (EmpEntity empEntity : allEmpInfo1) {
System.out.println("实体类"+empEntity.toString());
}
// 第三次关闭sqlsession,重新打开一个sqlsession
// 测试案例可以发现,一旦sqlsession关闭,缓存自动消失,查询相同的内容,需要重新连接数据库获取。
//重新打开一个新的sqlsession
SqlSession sqlSession1 = MySqlsessionFactory.getSQLSession();
EmpInfoMybatisDao empDao1 = sqlSession1.getMapper(EmpInfoMybatisDao.class);
System.out.println("第三次查询");
List allEmpInfo2 = empDao1.selectEmpInfo();
for (EmpEntity empEntity : allEmpInfo2) {
System.out.println("实体类"+empEntity.toString());
}
}
测试结果显示
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:
如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
3.5.6
org.mybatis
mybatis
${mybatis.version}
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
在 resources中 创建一个全局配置文件 mybatis-config.xml
可以从配置或者直接编码来创建SqlSessionFactory 通过SqlSessionFactory创建SqlSession
package com.aaa.util;
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;
/**
* @author :caicai
* @date :Created in 2022/6/9 11:08
* @description: 第三步 构建sqlsession的工具类 获取session
* @modified By:
* @version:
*/
public class MySqlsessionFactory {
// 全局配置文件
static String resource = "mybatis-config.xml";
static SqlSessionFactory sqlSessionFactory;
static {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* @create by:
* * @description: 获取sqlsession
* * @create time: 2020/12/9 10:29
* * @return SqlSession
*/
public static SqlSession getSQLSession() {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
import java.util.Map;
/**
* @description: 第四步 创建dao接口
*/
// 接口和映射文件是相关联的 他们是成对出现的
public interface EmpInfoMybatisDao {
List selectEmpInfo();
}
如果是更新、添加、删除语句,我们还需要提交一下事务。
一定要记得关闭会话。
@After
// 测试之后
public void tearDown() throws Exception {
System.out.println("结束测试");
if(sqlSession!=null){
// 事物提交
sqlSession.commit();
}else {
// 关闭sqlSession
sqlSession.close();
}
}
junit
junit
4.11
test
在测试类中进行测试
public class EmpInfoMybatisDaoTest {
private SqlSession sqlSession;
private EmpInfoMybatisDao empDao;
@Before
// 测试之前
public void setUp() throws Exception {
System.out.println("开始测试");
sqlSession = MySqlsessionFactory.getSQLSession();
empDao = sqlSession.getMapper(EmpInfoMybatisDao.class);
}
@After
// 测试之后
public void tearDown() throws Exception {
System.out.println("结束测试");
if(sqlSession!=null){
// 事物提交
sqlSession.commit();
}else {
// 关闭sqlSession
sqlSession.close();
}
}
@Test
public void searchUsesEmpInfo2() {
List useInfo = empDao.queryUsesInfo2("张三",20000f);
for (EmpEntity empEntity : useInfo) {
System.out.println(empEntity);
}
}
}
测试结果: