写在前面
??MyBatis学习
??今天我们进行MyBatis框架的学习,认识MyBatis及其执行原理,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!!
如果觉得博主文章还不错,可以??三连支持一下哦??
文章目录
Java MyBatis的介绍及其执行原理
回顾JDBC编程
在了解MyBatista编程之前,让我们先回顾一下JDBC编程吧!
JDBC使用步骤
1. 引入依赖jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
引入MySQL的相关依赖,因为小编电脑里装的MySQL
为8.0版本,所以我引入的依赖也为8.0的版本。
2. 编程流程
public static void main(String[] args) throws ClassNotFoundException {
//1.加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
try {
//2.获取数据库的连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/Java2022", "root", "111111");
//3.创建Statementd对象
Statement statement = connection.createStatement();
//4.执行相关的SQL
String sql = "select * from student";
ResultSet resultSet = statement.executeQuery(sql);
//5.对结果集进行处理
while (resultSet.next()) {
int sid = resultSet.getInt("SID");
String sname = resultSet.getString("Sname");
int sage = resultSet.getInt("Sage");
String sex = resultSet.getString("Ssex");
System.out.println(sid + "," + sname + "," + sage + "," + sex);
}
//6.关闭资源
connection.close();
statement.close();
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
JDBC编程存在的问题
1. 每次都要加载连接驱动,假如我们在开发的过程中MySQL版本换了呢?就要加载别的数据库驱动, 驱动名称存在硬编码的问题
2. 每次都需要获取连接,指明数据库,用户名,密码等, 连接信息存在硬编码问题
3. 在上述JDBC编程代码中,我们执行的SQL语句是查询学生的信息,如果我们有别的查询需求呢?这时候就要更换查询语句了 SQL和Java代码存在耦合的问题
4. 在对结果集的处理过程中, 需要对结果集的数据类型进行判断,列名也需要手动判断
5. 每次需要关闭资源,另外再加上每次连接数据库 会造成资源的浪费
?? 总结 ??
1. 数据库的连接创建和释放的频繁会造成系统的资源浪费从而影响系统性能。
2. SQL语句在Java代码中存在硬编码,造成了代码不易维护,实际使用过程中SQL变化可能比较大,SQL变动需要修改Java代码。
3. 对结果集的解析存在硬编码(需要查询列号),SQL变化导致解析的代码发生变化,使得系统不易维护。
JDBC编程问题的解决
那么该如何解决以上的问题呢?
1. 数据库的连接创建和释放的频繁会造成系统的资源浪费从而影响系统性能。
【解决方法】: 使用连接池来复用数据库的连接
2. SQL语句在Java代码中存在硬编码,造成了代码不易维护,实际使用过程中SQL变化可能比较大,SQL变动需要修改Java代码。
【解决方法】: 将SQL语句放在配置文件中(XML),这样即使需求改变我们直接修改配置文件,而不用修改Java代码本身
3. 对结果集的解析存在硬编码(需要查询列号),SQL变化导致解析的代码发生变化,使得系统不易维护。
【解决方法】: 将数据库中的数据集映射成Java对象
其实对以上的解决方案, mybatis 已经给我们提供了,并且提供了一些其他特征。
mybatis的介绍及原理
mybatis介绍
MyBatis
是一款优秀的持久层框架,它支持 自定义 SQL、 存储过程以及 高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
mybatis执行原理
执行原理图
??【解读mybatis执行原理图】??
1.全局配置文件:**SqlMapConfig.xml,用来配置数据源、事务、引入映射文件。
2.映射文件:**Mapper1.xml、Mapper2.xml…Mappern.xml 有多个,对查询数据库的SQL,参数类型以及结果集进行封装。
3.SqlSessionFactory:session工厂,创建SqlSession会话。
4.SqlSession: 会话,进行CRUD 操作。
5.执行器Executor: 有缓存和数据库两种实现方式。SQL输入参数后,执行器生成Statement对象(mybatis其实就是对JDBC的封装)然后Statement对象通过参数在数据库中进行查询,最后输出查询结果。
mybatis的使用示例
以查询java2022库下的student表为例:通过SID查询学生的信息。
1. 新建maven工程
2. 引入mybatis依赖,还有MySQL相关依赖
<!-- mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- MySQL驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
3. 配置全局配置文件:mybatisConfig.xml
第一步: 首先在main文件夹下创建一个 resources文件夹 ,与Java原文件目录同级。
??【注意】?? ,一定要把 resources文件夹 设置成Test Sources Root类型。
设置方法: 右键resources文件夹 —> 选择Mark Directory as —> 选择Test Sources Root。
第二步: 在 resources文件夹 创建 mybatisConfig.xml文件 并配置,如下:
4. 创建pojo类(Student 类),将数据库中student表数据映射成student对象,Student类中属性类型要和student表中的数据类型要相对应。
5. 创建Mapper接口文件(StudentMapper.java)
public interface StudentMapper {
Student selectStudentById(Integer id);
}
6. 创建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">
<!--根标签 namespace命令空间:给定接口文件的全路径-->
<mapper namespace="com.wyscoder.mybatis.mapper.StudentMapper">
<!--
select 标签为查询操作标签
id属性:Statement的id,必填的,和接口文件的方法名保持一致
parameterType:表示输入参数的类型
resultType:表示输出参数的类型
#{XXX}:表示占位符,XXX:接口方法中的参数名称
-->
<select id="selectStudentById" parameterType="int" resultType="com.wyscoder.mybatis.pojo.Student">
select * from student where SID = #{id}
</select>
</mapper>
7. 修改全局配置文件(mybatisConfig.xml)需要将mapper.xml的路径配置到全局配置文件中
<!-- 映射文件-->
<mappers>
<!-- resource属性,指定mapper.xml文件的路径-->
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
8. 测试
package com.wyscoder.mybatis;
import com.wyscoder.mybatis.mapper.StudentMapper;
import com.wyscoder.mybatis.pojo.Student;
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 wyscoder
* @version 1.0
*/
public class TestMabatis {
public static void main(String[] args) throws IOException {
//1.读取全局配置文件
String path = "mybatisConfig.xml";
//2.通过Resources获取配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(path);
//3.创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//4.创建会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//5.通过代理模式创建代理类
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//查询sid = 1的学生信息
Student student = mapper.selectStudentById(1);
System.out.println(student);
//关闭资源
sqlSession.close();
}
}
运行结果:
??【MyBatis的使用步骤】??
1. 配置mybatis的全局配置文件(数据源、mapper映射)
2. 创建SqlSessionFactory对象
3. 通过SqlSessionFactory创建SqlSession对象
4. 通过SqlSession对象来对数据库进行CRUD操作
5. 关闭SqlSession资源
源码地址
Gitee源码地址https://gitee.com/wang-yongsheng666/java-study2/tree/master/MyBatis