一、mybatis概念
MyBatis(半自动) 是一款优秀的持久层dao框架,它支持定制化 sql、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.1 持久层框架 orm 框架 ( object relation mapping ) 对象关系映射
java |
database |
类 |
表 |
对象 |
一行数据(主键) |
列 |
二、 mybatis配置文件
2.1 properties
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:
<!-- 全局配置-->
<properties resource="db.properties">
<property name="driver" value="com.MysqL.jdbc.Driver"/>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
2.2 settings
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等
<settings>
<!-- 关闭二级缓存-->
<setting name="cacheEnabled" value="false"/>
<!-- 开启日志-->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
测试一级缓存:mybatis的一级缓存,在同一个sqlsession中生效,一旦sqlsession关闭,缓存自动消失,查询相同的内容,需要重新连接数据库获取。
@Test
// mybatis的一级缓存,在同一个sqlsession中生效,
// 一旦sqlsession关闭,缓存自动消失,查询相同的内容,需要重新连接数据库获取
public void findAllEmpInfo() {
// 从测试案例可以看出,同一次会话,默认缓存数据,第二次查询相同的数据,直接从缓存中获取。
System.out.println("第一次查询");
List<EmpEntity> allEmpInfo = empDao.selectEmpInfo();
for (EmpEntity empEntity : allEmpInfo) {
System.out.println("实体类"+empEntity.toString());
}
System.out.println("第二次查询");
List<EmpEntity> 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<EmpEntity> allEmpInfo2 = empDao1.selectEmpInfo();
for (EmpEntity empEntity : allEmpInfo2) {
System.out.println("实体类"+empEntity.toString());
}
}
测试结果显示
2.3 typeAliases
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:
<!-- 设置别名-->
<typeAliases>
<typeAlias alias="xxx" type="com.aaa.entity.Emp"></typeAlias>
</typeAliases>
三、mybatis的具体使用
步骤一:pom.xml文件中引入jar包
如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
<mybatis.version>3.5.6</mybatis.version>
<!-- 引入mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
步骤二:配置全局配置文件mybatis-config.xml
每个基于 MyBatis 的应用都是以一个 sqlSessionFactory 的实例为核心的。sqlSessionFactory 的实例可以通过 sqlSessionFactoryBuilder 获得。而 sqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 sqlSessionFactory 实例。
在 resources中 创建一个全局配置文件 mybatis-config.xml
<?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>
<!-- 全局属性配置 resource导入外部文件进行属性配置-->
<properties resource="db.properties">
</properties>
<!-- 设置setting-->
<settings>
<!-- 关闭二级缓冲-->
<setting name="cacheEnabled" value="false"/>
<!-- 指定 MyBatis 所用日志的具体实现,未指定将自动查找-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 设置别名-->
<typeAliases>
<typeAlias type="com.aaa.entity.EmpEntity" alias="emp"></typeAlias>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件-->
<!-- 第六步 创建mapper 加载映射文件 注意文件路径位置-->
<mappers>
<mapper resource="Mapper/EmpMapper.xml"/>
</mappers>
</configuration>
第三步:构建 sqlSessionFactory
可以从配置或者直接编码来创建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;
}
}
步骤四:创建dao接口
import java.util.Map;
/**
* @description: 第四步 创建dao接口
*/
// 接口和映射文件是相关联的 他们是成对出现的
public interface EmpInfoMybatisDao {
List<EmpEntity> selectEmpInfo();
}
步骤五:创建mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 第五步 创建mapper映射文件-->
<!--关联dao层接口 书写接口的全路径-->
<mapper namespace="com.aaa.dao.EmpInfoMybatisDao">
<resultMap id="empResultMap" type="emp"> <!-- emp属性别名-->
<!-- id是对应数据库中的主键-->
<!-- property是javabean的属性名 column是数据库的列名 jdbcType数据库列的类型 java属性类型-->
<!-- <id property="empno" column="empno"></id>-->
<result property="gongzi" column="sal"></result>
</resultMap>
<!-- 如果 数据库 中的列名和 java实体类 中 属性名 完全一致,可以使用resultType。-->
<!-- 如果数据库的列名和实体类的属性名不一致,或者复杂查询产生临时列,新属性,临时列和新属性的名字不一致,resultmap就必须要使用了。-->
<select id="selectEmpInfo" resultMap="empResultMap">
select * from emp
</select>
<!-- id 方法名 resultType 方法值的返回的类型-->
<select id="selectEmpMapInfo" resultType="Map">
select * from emp
</select>
</mapper>
步骤六:调用session.commit()提交事务
步骤七:调用session.close()关闭会话
一定要记得关闭会话。
@After
// 测试之后
public void tearDown() throws Exception {
System.out.println("结束测试");
if(sqlSession!=null){
// 事物提交
sqlSession.commit();
}else {
// 关闭sqlSession
sqlSession.close();
}
}
步骤八:使用junit测试工具单元测试
- 导入junit的jarzai
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
在测试类中进行测试
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<EmpEntity> useInfo = empDao.queryUsesInfo2("张三",20000f);
for (EmpEntity empEntity : useInfo) {
System.out.println(empEntity);
}
}
}
测试结果: