MyBatis简介
为什么引入持久层框架?
三层架构
- 表现层—展示数据
- 业务层—处理业务需求
- 持久层—和数据库交互
持久层技术解决方案
- JDBC技术(最底层)
- Apache的DBUtils:QueryRunnner
- Spring的JdbcTemplate:Spring中对jdbc的简单封装
以上都不是框架,jdbc是规范,其它两个是工具包,都封装的不够细致,需要关注加载驱动、创建连接、创建Statement等繁杂过程。而且功能简单,sql语句编写在java代码里,硬编码高耦合(sql变化时需要修改源码)。
持久层技术框架
框架是一种整体性解决方案,目前流行的有两种:
- Hibernate:全自动全映射ORM框架,旨在消除sql。但是存在开发人员无法自主优化sql语句的缺点。
- MyBatis:是优秀的基于java持久层的半自动轻量级框架,它内部封装了jdbc,sql与java编码分离(sql单独提取到配置文件中,由开发者控制),开发者只需要关注sql语句本身(剩下的预编译、设置参数、执行sql、封装结果由框架完成)。它使用了ORM的思想实现了结果集的封装。
ORM:Object Relational Mapping 对象关系映射 将数据库表和实体类、实体类的属性对应起来,让我们可以实现操作实体类即操作数据表 Mybatis通过xml或注解的方式将要执行的statement(sql语句)配置起来,通过java对象 和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由Mybatis框架执行语句并将结果映射为java对象返回。
MyBatis
详细介绍看官网:https://mybatis.org/mybatis-3/zh/index.html
MyBatis快速入门
创建父工程
创建一个Maven工程:
引入依赖
在父工程的 pom 文件中引入依赖:
<!--引入依赖-->
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--junit4-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--lombok(可选)-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
静态资源过滤
在 pom.xml 文件中引入:
<!--解决静态资源过滤问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
数据库准备
先创建一个 mybatis 数据库,然后建立一张表:
CREATE TABLE `tbl_employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`last_name` varchar(255) DEFAULT NULL,
`gender` char(1) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
再添加一些数据:
入门案例
创建子工程
创建 Bean 类
package com.atguigu.mybatis.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
private Integer id;
private String lastName;
private String gender;
private String email;
}
创建 Mapper 接口
package com.atguigu.mybatis.mapper;
import com.atguigu.mybatis.bean.Employee;
public interface EmployeeMapper {
Employee getEmpById(Integer id);
}
创建 Mapper 对应的 XML 文件
在接口同级目录下创建,例如:EmployeeMapper.xml
,这是 SQL 映射文件,封装了 SQL 代码
<?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">
<!--namespace 使用接口的全类名-->
<mapper namespace="com.atguigu.mybatis.mapper.EmployeeMapper">
<!--id 使用接口的方法名-->
<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
select id, last_name lastName, gender, email from tbl_employee where id = #{id}
</select>
</mapper>
mybatis 核心配置文件
在 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>
<!--配置数据源-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="12345678"/>
</dataSource>
</environment>
</environments>
<!--注册 mapper 文件,需要在pom文件中解决静态资源过滤的问题-->
<mappers>
<mapper resource="com/atguigu/mybatis/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
测试代码
public class MyBatisTest {
//1、获取 sqlSessionFactory
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() throws IOException {
//2、获取 sqlSession
SqlSession sqlSession = getSqlSessionFactory().openSession();
//3、获取接口的实现类对象
//会为接口自动创建一个代理对象,让代理对象去执行增删改查
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee emp = mapper.getEmpById(2);
System.out.println(emp);
//4、关闭连接
sqlSession.close();
}
}
总结
1、接口式编程
- 原生: Dao ====> DaoImpl
- mybatis: Mapper ====> xxxMapper.xml
2、SqlSession
代表和数据库的一次会话,用完必须关闭;
3、SqlSession
和connection
一样都是非线程安全,每次使用都应该去获取新的对象。
4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。(将接口和xml进行绑定)EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
5、两个重要的配置文件:
- mybatis 全局配置文件:包含数据库连接池信息,事务管理器信息、系统运行环境信息等。
- SQL 映射文件:保存了每一个sql语句的映射信息,将sql抽取出来。