Java MyBatis的介绍及其执行原理
⭐写在前面⭐
🧭MyBatis学习
📢今天我们进行MyBatis框架的学习,认识MyBatis及其执行原理,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!!
♨️如果觉得博主文章还不错,可以👍三连支持⭐一下哦😀
文章目录
Java MyBatis的介绍及其执行原理
回顾JDBC编程
在了解MyBatis编程之前,让我们先回顾一下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
相关文章
- 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES
- Java renameTo()重新命名此抽象路径名表示的文件
- Java中String类型,int类型,double等常用类型转换 bigint
- 大杂烩 -- Java内存布局【图】以及java各种存储区【详解】
- Java StringBuffer 和StringBuilder
- Java Date Time 教程-java.util.Date
- Java Invoked OOM-Killer - OOM不一定是来自于java heap
- Java详解,java后端应届生面试题
- 2022 秋招,Java 岗最全面试攻略,吃透 25 个技术栈 Offer 拿到手软
- 【Java】Mybatis-Plus获取不到数据库表中的部分字段(带下划线_的字段)
- Java CAS 和ABA问题
- MySQL分段统计SQL写法 与 Mybatis 异常 java.math.BigDecimal cannot be cast to java.lang.Integer
- java实现的一个【快速排序 】算法【原创】
- Java之创建对象>4.Enforce noninstantiability with a private constructor
- Java jackson配置类,Java jackson工具类,SpringBoot Jackson类配置
- java提取字符串数字,Java获取字符串中的数字
- java中公平锁和非公平锁的通俗解释
- Java学习-084-java.sql.SQLException: Zero date value prohibited 问题解决
- Java .class 反编译 Luyten,导出 .java文件,查看jar 包目录,超级简单,实用
- mybatis或hibernate框架连接数据库报错:java.sql.SQLException: Access denied for user 'Administrator'@'localhost' (using password: YES)
- Java项目打war包的方法
- Java_类似java.lang.VerifyError: Expecting a stackmap frame at branch target 22 in method的解决方法
- java导出txt文件
- Java向PostgreSQL发送prepared statement 与 libpq 向PostgreSQL发送prepared statement之比较:
- Eclipse迅速执行:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- 深入理解java虚拟机(十四)正确利用 JVM 的方法内联
- java数据结构
- 简单的JAVA MVC框架模式--Java-servlet-JavaBean
- Java多次启动相同jar程序
- java如何实现多继承(实现:子类中二个方法,分别继承不同父类)