目录
MyBatis----01
1. MyBatis简介
1.1 软件开发三层架构
MyBatis作用于持久层,属于数据持久化框架。
1.2 什么是框架?
简单来说框架可以理解为一个半成品项目,已经有人完成好了一部分功能,我们只需要在其基础上完成我们需要做的业务逻辑即可,将重复的代码抽取出来,让程序员把精力专注于业务逻辑之上。
1.3 常见的框架
Java的世界中存在着无数的框架,每个框架都为了解决某一领域的问题而存在的。
- 持久层框架:专注于解决持久化,例如:Hibernate|MyBatis|JPA规范
- 表现成框架:专注于解决与用户交互,例如:struts2|SpringMVC
- 全栈框架:能在各层都发会作用的框架,例如:Spring
目前市面上流行的框架组合:SSM(Spring | SpringMVC | MyBatis),早年曾经流行SSH(Spring | Strusts2 | Hiberbate),SSH已经过时了。
1.4 MyBatis介绍
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
- iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
- 当前,最新版本是MyBatis 3.5.5 ,其发布时间是2020年6月4日。
特点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
1.5 MyBatis是一款半自动ORM框架
ORM是能够完全面向对象操作数据库的框架,因为SQL语句完全由Hibernate负责生成,我们只需要负责面向对象的调用API操作数据库即可,不需要写SQL;
MyBatis是半自动的ORM框架,因为SQL语句还是由开发人员手写,MyBatis负责封装结果到对象中,以及从对象中提取参数。
Hibernate与MyBatis:
Hibernate缺点:
- 运行效率低,内存占用高->功能强大
- 因为Hibernate对于持久层的封装过于完整(甚至帮我们书写SQL)导致sql语句优化不容易进行,不适用于数据量大的大型项目
MyBatis优点:
- MyBatis灵活,因为SQL语句还是由我们负责书写,书写到XML中
- SQL语句与程序分离,降低了耦合度,便于管理
- 执行效率较高
2. MyBatis搭建
2.1 准备数据库
CREATE TABLE t_user(
id INT PRIMARY KEY,
NAME VARCHAR(255) NOT NULL,
PASSWORD VARCHAR(255) NOT NULL
)
2.2 添加测试数据
INSERT INTO t_user VALUE
(1,'Tom','1234'),(2,'Jerry','1234'),
(3,'Jack','1234'),(4,'Rose','1234')
2.3 创建Maven工程
引入依赖
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
2.4 创建MyBatis主配置文件
<?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 default="development">
<!-- 一个environment元素就是一套配置环境
id:为当前配置起一个名字
-->
<environment id="development">
<!-- 事务管理方式 -->
<transactionManager type="JDBC"/>
<!-- 数据源配置,使用连接池 -->
<dataSource type="POOLED">
<!-- 四大连接信息配置-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="hanjuechen"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--<mapper resource="org/mybatis/example/BlogMapper.xml"/>-->
</mappers>
</configuration>
2.5 创建实体类映射表
public class User {
private Integer id;
private String name;
private String password;
public User() {
}
public User(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
2.6 创建Mapper接口
public interface UserMapper {
//查询所有用户
List<User> findAll();
}
2.7 创建xxxMapper.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接口做配置 -->
<mapper namespace="com.leo.mapper.UserMapper">
<!-- 接口方法配置
xml元素决定了方法的性质
select元素:查询
insert元素:插入
update元素:删除以及修改操作
id属性:映射方法名
resultType: 返回结果的类型,注意:属性名必须与列名相对应
标签体:书写要执行的sql语句
-->
<select id="findAll" resultType="com.leo.domain.User">
select * from t_user
</select>
</mapper>
2.8 将xxxMapper.xml注册到主配置文件
在mybatis-config.xml配置文件末尾注册:
<mappers>
<!-- 注册Mapper文件
resource属性:指定Mapper文件路径
-->
<mapper resource="com/leo/mapper/UserMapper.xml"/>
</mappers>
2.9 其他配置
为了让src/main/java目录中的xml文件能够作为资源文件编译输出,在pom.xml中加入如下配置:
<build>
<!-- 资源配置 -->
<resources>
<resource>
<!-- 指定资源目录 -->
<directory>src/main/resources</directory>
<!-- 资源文件规则 -->
<includes>
<!-- 所有文件都符合资源文件规则 -->
<include>**/*.*</include>
<!-- <include>**/*.xml</include>-->
<!-- <include>**/*.yml</include>-->
<!-- <include>**/*.properties</include>-->
</includes>
<!-- 不需要gaojiguolv -->
<filtering>false</filtering>
</resource>
<!-- 新加入规则 -->
<resource>
<!-- 将src/main/java 目录也定义为资源目录 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
<!-- 文件排除条件,排除Java文件 -->
<excludes>
<exclude>**/*.java</exclude>
</excludes>
<filtering>false</filtering>
</resource>
</resources>
</build>
2.10 代码测试
public class UserMapperTest {
@Test
public void testFindAll(){
//定义配置文件路径
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
//加载配置文件
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
//根据配置文件创建SessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获得SqlSession
SqlSession session = sqlSessionFactory.openSession();
//获得UserMapper接口的实现类
UserMapper mapper = session.getMapper(UserMapper.class);
//调用UserMapper方法,执行xml中定义的SQL语句
List<User> list = mapper.findAll();
//打印list: list.sout
System.out.println(list);
}
}