MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍

MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍

为了方便操作,我们在sjdwz_test数据库下建立一张表:

CREATE TABLE `t_student` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(255) DEFAULT NULL COMMENT '名字',`age` int(255) DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

数据如下:

数据

实体类如下:

package com.sjdwz.db;import lombok.*;/*** @Description 数据库实体* @Created by 随机的未知*/
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Student {private Long id;private String name;private Integer age;
}

JDBC操作数据库

我们先来回顾一下JDBC操作数据库的代码:

package com.sjdwz.jdbc;import com.sjdwz.db.Student;import java.sql.*;
import java.util.ArrayList;
import java.util.List;/*** @Description JDBC操作数据库代码示例* @Date 2023/12/14* @Created by 随机的未知 sjdwz.com*/
public class JDBCMain {public static void main(String[] args) throws SQLException, ClassNotFoundException {//数据库连接地址String url = "jdbc:mysql://localhost:3306/sjdwz_test";String user = "root";//用户名String password = "1234567";//密码//1.注册数据库驱动Class.forName("com.mysql.jdbc.Driver");//2.获取数据库连接对象Connection。Connection conn = DriverManager.getConnection(url, user, password);//3.创建Sql语句对象Statement,填写SQL语句PreparedStatement preparedStatement = conn.prepareStatement("select * from t_student where `name` = ?; ");//传入查询参数preparedStatement.setString(1, "张三");//4.执行SQL查询,返回结果集对象ResultSetResultSet resultSet = preparedStatement.executeQuery();List<Student> studentList = new ArrayList<>();//5.循环解析结果集,获取查询用户list集合while (resultSet.next()) {Student student = Student.builder().id(resultSet.getLong("id")).name(resultSet.getString("name")).age(resultSet.getInt("age")).build();studentList.add(student);}//打印查询结果System.out.println(studentList);//6.关闭连接,释放资源resultSet.close();//关闭结果集对象preparedStatement.close();//关闭Sql语句对象conn.close();//关闭数据库连接对象}
}

运行截图如下:

运行截图

这段代码主要有如下四点问题:

  1. 结果集解析复杂,列名硬编码,sql变化导致解析代码变化,系统不易维护;
  2. sql语句硬编码,数据库配置硬编码,难以维护;
  3. 频繁连接、释放数据库资源,没有用到池化思想,系统性能不高;
  4. prepareadStatement向占位符传参数存在硬编码,不易维护。

所以我们需要一个ORM框架,来解决这些痛点。我用的最多的ORM框架是MyBatis,我们就来从源码角度来分析它,看看MyBatis是怎么解决这些问题的。

MyBatis介绍

什么是MyBatis

  • MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。
  • MyBatis对JDBC封装使得开发者只需要关注SQL语句与业务本身即可,无需开发者处理加载驱动、获取连接、创建Statement等繁琐的过程。
  • MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。
  • MyBatis是一个实现了ORM思想的持久层框架。

什么是ORM?为什么说MyBatis是一个半ORM框架?

  • ORM:Object/Relation Mapping 对象/关系映射。
  • ORM思想:将数据库中的关系数据表映射为Java中的对象,把对数据表的操作转换为操作对象,实现面向对象编程。因此,ORM的目的是使得开发人员以面向对象的思想来操作数据库
  • MyBatis框架是一个半自动的ORM持久层框架,也可以在Java中实现类似insert(Student)的操作最终操作数据库,但是需要我们自己写SQL语句。

MyBatis操作数据库

项目结构截图如下:

项目结构截图

在resources目录下创建mybatis-config.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/sjdwz_test?useSSL=false"/><property name="username" value="root"/><property name="password" value="1234567"/></dataSource></environment></environments><mappers><!--        加载sql映射文件--><mapper resource="StudentMapper.xml"/></mappers>
</configuration>

在resources目录下创建StudentMapper.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test"><!--    id是指sql的唯一标识,resulttype是指返回值的类型--><select id="findListByName" resultType="com.sjdwz.db.Student" parameterType="string">select * from t_student where `name` = #{name};</select>
</mapper>

MyBatis操作数据库代码如下:

package com.sjdwz.mybatis;import com.sjdwz.db.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;
import java.util.List;/*** @Description Mybatis示例* @Created by 随机的未知*/
public class MybatisTest {public static void main(String[] args) throws IOException {//1.创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//2.SqlSessionFactoryBuilder对象创建工厂对象InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);//3.工厂对象Factory打开SqlSession会话SqlSession sqlSession = sqlSessionFactory.openSession();//4.SqlSession会话对象执行SQL语句,findListByName(命名空间+查询语句唯一标识)List<Student> studentList = sqlSession.selectList("test.findListByName","张三");//5.打印查询结果System.out.println(studentList);//6.关闭sqlSession会话sqlSession.close();}
}

运行截图如下:

运行截图

Mybatis配置和代码解决的问题

在前文,使用JDBC存在四个问题,而Mybatis就解决了这四个问题。

JDBC编码存在的第一个问题的解决

第一个问题是结果集解析复杂,列名硬编码,sql变化导致解析代码变化,系统不易维护;

MyBatis编码中我们不需要进行结果集解析,只需要在编码时指定sql即可,MyBatis会给我们结果;

List<Student> studentList = sqlSession.selectList("test.findListByName","张三");

JDBC编码存在的第二个问题的解决

第二个问题是sql语句硬编码,数据库配置硬编码,难以维护;

数据库的配置和sql语句,我们写到了xml文件,解决了硬编码的问题

JDBC编码存在的第三个问题的解决

第三个问题是频繁连接、释放数据库资源,没有用到池化思想,系统性能不高

MyBatis使用了池化思想,解决了这个问题;

JDBC编码存在的第四个问题的解决

第三个问题是prepareadStatement向占位符传参数存在硬编码,不易维护

我们在配置文件标签上写明了参数,并在代码中传入,避免了占位符的硬编码,解决了此问题。

截图

截图

总结

我们回顾了JDBC和MyBatis的编码方式,了解了JDBC编码存在的问题,并知道了MyBatis编码确实解决了这几个问题。

后面我们就来分析MyBatis源码了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/643996.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Science Robotics 美国斯坦福大学研制了外行星洞穴探测机器人

月球和火星上的悬崖、洞穴和熔岩管已被确定为具有地质和天体生物学研究理想地点。由于其隔绝特性&#xff0c;这些洞穴提供了相对稳定的条件&#xff0c;可以促进矿物质沉淀和微生物生长。在火星上&#xff0c;这些古老的地下环境与火星表面可能适合居住时几乎没有变化&#xf…

URL短链接有什么用

URL短链接 短链接(Short Link)是将长URL压缩成较短的URL&#xff0c;如: https://t.oxings.com/u/RWQ82a 通常由短字符串或数字组成&#xff0c;减少字符数量&#xff0c;看起来更加美观和易于阅读。在某些输入字数受限的场合&#xff0c;如微博、短信&#xff0c;长URL会浪费…

LabVIEW和MES系统的智能化车间数据对接

LabVIEW和MES系统的智能化车间数据对接 随着工业4.0时代的到来&#xff0c;智能制造成为推动制造业高质量发展的重要手段。其中&#xff0c;数字化车间作为智能制造的重要组成部分&#xff0c;其设计与实现至关重要。在数字化车间环境下&#xff0c;如何利用LabVIEW软件与MES系…

Mybatis 缓存机制

序言 本文和大家聊聊 Mybatis 缓存。 一、本地缓存 Mybatis 内置了一个强大的事务性查询缓存机制&#xff0c;它可以非常方便地配置和定制。 默认情况下&#xff0c;只启用了本地的会话缓存&#xff08;又称一级缓存&#xff09;&#xff0c;它仅仅对一个会话中的数据进行缓…

飞行汽车飞行控制系统功能详解

飞行汽车是一种创新的交通工具&#xff0c;结合了汽车和飞机的特点。它可以在陆地上行驶&#xff0c;同时也具备在空中飞行的能力。飞行汽车的概念已经存在多年&#xff0c;并且近年来随着技术的进步和研发的深入&#xff0c;这种交通工具正在逐渐从概念走向现实。 飞行汽车的…

Java中的BIO、NIO与AIO

1.概述 I/O 模型简单的理解&#xff1a;就是用什么样的通道进行数据的发送和接收&#xff0c;很大程度上决定了程序通信的性能。Java 共支持 3 种网络编程模型 I/O 模式&#xff1a;BIO、NIO、AIO。 2.Java BIO Java BIO(Blocking I/O)&#xff1a;是传统的java io 编程&#…

微信小程序开发六(自定义组件)

自定义组件的创建&#xff1a; 如何创建&#xff1a; 右键选择新建component 创建完成之后需要打开app.json&#xff0c;这是全局使用这个组件&#xff0c;想要单独的页面使用&#xff0c;就在当前页面的json文件中定义 "usingComponents": {"my-zj": &quo…

影像仪在工业测量中的优势

在工业制造领域&#xff0c;测量是确保产品质量和生产效率的关键步骤之一。 影像仪在工业测量中的优势 1、表面检测和缺陷检测的应用 影像仪能够通过高分辨率的相机和精密的镜头系统&#xff0c;实现对产品的高精度三维成像&#xff0c;提供高分辨率的图像&#xff0c;并且可…

ZYNQ之嵌入式开发04——自定义IP核实现呼吸灯、固化程序

文章目录 自定义IP核——呼吸灯实验固化程序 自定义IP核——呼吸灯实验 Xilinx官方提供了很多IP核&#xff0c;在Vivado的IP Catalog中可以查看这些IP核&#xff0c;在构建自己复杂的系统时&#xff0c;只使用Xilinx官方的免费IP核一般满足不了设计的要求&#xff0c;因此很多…

社交媒体数据恢复:Facebook

在使用Facebook的过程中&#xff0c;可能会出现数据丢失的情况&#xff0c;如误删了重要的帖子、照片或其他文件。在这种情况下&#xff0c;你可以尝试以下方法来恢复Facebook的数据。 首先&#xff0c;确保你备份了Facebook的数据。如果你定期备份数据&#xff0c;那么恢复起…

1张图片+3090显卡微调Qwen-VL视觉语言大模型(仅做演示、效果还需加大数据量)

原项目地址&#xff1a;https://github.com/QwenLM/Qwen-VL/blob/master/README_CN.md 环境本地部署&#xff08;见之前博文&#xff09; 【本地部署 】23.08 阿里Qwen-VL&#xff1a;能对图片理解、定位物体、读取文字的视觉语言模型 (推理最低12G显存) 一、数据集格式说明 …

检索增强生成(RAG)技术

随着大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域的显著进步&#xff0c;它们在多个评估基准测试中显示出超越人类水平的语言和知识掌握能力。然而&#xff0c;这些模型在实际应用中也面临着一系列挑战&#xff0c;如制造事实、知识…