一. MyBatis简介
1.什么是MyBatis?
官网:https://mybatis.org/mybatis-3/zh/index.html
MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java domain(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2.三种持久层框架的对比
-
JDBC
JDBC的全称为Java数据库连接(Java Database connect),他是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到数据库,并使用SQL语句来完成对数据库中数据的增删改查等操作。但是不太实用,主要缺点有:
- SQL语句夹杂在Java代码中的耦合度较高,导致编码太繁琐,对代码的可读性大大减低。
- 实际开发中对SQL语句的修改会非常频繁,就会导致可维护减低,维护不易。
- 代码冗余,开发的效率不高。
-
Hibernate和JPA
Hibernate和JPA分别是Java持久化API的不同实现,可以简单的理解为JPA是标准接口,Hibernate是实现,并不是对标关系Hibernate属于遵循JPA规范的一种实现,但是JPA是Hibernate遵循的规范之一,Hibernate还有其他实现的规范。
- 操作简单,开效率高
- 程序中较长和较难的复杂SQL语句会绕开框架
- 内部会自动生成SQL语句,不易做优化处理。
- 基于全映射的全自动框架,大量字段的domain进行部分映射时较困难。
- 反射的操作太多,会导致数据库性能大幅度下降。
-
MyBatis
- 轻量级的框架,性能非常出色
- SQl语句与Java的编码是分开的,功能的界限清楚,Java代码专注业务,SQl语句专注与数据,可读性与可维护性都非常高。
- 开发的效率比Hibernate略微逊色,但是在可接受的范围之内
开发效率:Hibernate>>Mybatis>>JDBC
运行效率:JDBC>>Mybatis>>Hibernate
3.如何使用MyBatis
1.当我们创建好项目后,找到pom.xml,将我们所需要的依赖导入
·pom.xml
<dependencies>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependencies/>
2.我们需要创建一个实体类(domain)
public class Employee {
private Integer empId;
private String empName;
private Double empSalary;
//并生成所对应的getter与setter的方法
}
3.准备Mapper接口,我们在java文件夹中创建一个文件夹(mapper),用于存放所有的mapper接口,在mapper文件夹中创建我们的mapper接口
/**
*
* 接口只规定方法,参数和返回值!
* mapper.xml中编写具体的SQl语句
*/
public interface EmployeeMapper{
/*
*编写要查询数据的方法接口
*/
/*
* 根据id查询数据
*/
Employee FindById(int empId)
}
4.定义mapper.xml,首先在resources文件夹中创建文件夹(mapper),在mapper文件夹中创建EmployeeMapper.xml
注意:在java文件夹中创建mapper文件的路径名称要和resources创建mapper文件夹的路径名称一致,且mapper接口名称与xml的名称要一致(注意大小写)
<?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 namespace="mapper.EmployeeMapper">
<!--
查询使用select标签
id = 方法名
resultType = 返回值的类型
标签内编写SQL语句
-->
<select id = "selectEmployee" resultTYpe = "domain.Employee">
<!--
此处编写对应的SQL语句
-->
</select>
注意
- 方法名和SQl的id一致
- 方法返回值和resultType一致
- 方法的参数和SQL的参数一致
- 接口的全类名和映射配置文件的名称空间一致
5.配置MyBatis配置文件(在resources文件夹创建xml文件)
mybatis框架配置文件: 数据库连接信息,性能配置,mapper.xml配置等!
习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以操作时可以直接复制、粘贴。
<?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">
<!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 -->
<configuration>
<!--引入mybatis的全局设置(日志)-->
<settings>
<!--开启驼峰式映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
<environments default="development">
<!-- environment表示配置Mybatis的一个具体的环境 -->
<environment id="development">
<!-- Mybatis的内置的事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<!-- 建立数据库连接的具体信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--将java文件夹中的mapper和resources中的xml文件连接到一起-->
<mapper resource="mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
6.运行与测试
在pom.xml中导入测试所需要的依赖
<!--junit5测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiterapi</artifactId>
<version>5.3.1</version>
</dependency>
在test文件夹中创建测试类
public class MyBatisTest {
@Test
public void testSelectEmployee() throwsIOException {
//1.创建SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.根据SqlSessionFactory对象开启一个会话
SqlSession session = sqlSessionFactory.openSession();
//3.根据SqlSessionFactory接口的class对象获取Mapper接口类型的对象
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
//4.调用代理类方法触发SQL语句
Employee employee = employeeMapper.saveEmployee(1);
System.out.println("姓名:"+employee.getEmpName());
//5. 关闭SqlSession
session.commit();//事务,无事务可省略
session.close();
}
}
``