MyBatis笔记1:从JDBC到MyBatis

mybatis学习笔记(1)-对原生jdbc程序中的问题总结 本文总结jdbc编程的一般步骤,总结这样编程存在的问题,并附上典型地jdbc示 阅读详情

原文链接:点击打开链接

1.引言

本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。

 

 

2.JDBC实现查询分析

我们先看看我们最熟悉也是最基础的通过JDBC查询数据库数据,一般需要以下七个步骤:

(1)  加载JDBC驱动

(2)  建立并获取数据库连接

(3)  创建 JDBC Statements 对象

(4)  设置SQL语句的传入参数

(5)  执行SQL语句并获得查询结果

(6)  对查询结果进行转换处理并将处理结果返回

(7)  释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)

 

以下是具体的实现代码:

    public static List<Map<String,Object>> queryForList(){  
            Connection connection = null;  
            ResultSet rs = null;  
            PreparedStatement stmt = null;  
            List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();  
              
            try {  
                //加载JDBC驱动  
                Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  
                String url = "jdbc:oracle:thin:@localhost:1521:ORACLEDB";  
                  
                String user = "trainer";   
                String password = "trainer";   
                  
                //获取数据库连接  
                connection = DriverManager.getConnection(url,user,password);   
                  
                String sql = "select * from userinfo where user_id = ? ";  
                //创建Statement对象(每一个Statement为一次数据库执行请求)  
                stmt = connection.prepareStatement(sql);  
                  
                //设置传入参数  
                stmt.setString(1, "zhangsan");  
                  
                //执行SQL语句  
                rs = stmt.executeQuery();  
                  
                //处理查询结果(将查询结果转换成List<Map>格式)  
                ResultSetMetaData rsmd = rs.getMetaData();  
                int num = rsmd.getColumnCount();  
                  
                while(rs.next()){  
                    Map map = new HashMap();  
                    for(int i = 0;i < num;i++){  
                        String columnName = rsmd.getColumnName(i+1);  
                        map.put(columnName,rs.getString(columnName));  
                    }  
                    resultList.add(map);  
                }  
                  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                try {  
                       //关闭结果集  
                    if (rs != null) {  
                        rs.close();  
                        rs = null;  
                    }  
                       //关闭执行  
                    if (stmt != null) {  
                        stmt.close();  
                        stmt = null;  
                    }  
                    if (connection != null) {  
                        connection.close();  
                        connection = null;  
                    }  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
            }  
              
            return resultList;  
        }  

 

3.JDBC演变到Mybatis过程

   上面我们看到了实现JDBC有七个步骤,哪些步骤是可以进一步封装的,减少我们开发的代码量。

 

 

第一步优化:连接获取和释放

 

问题描述:

数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。

解决问题:

数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题。通过连接池就可以反复利用已经建立的连接去访问数据库了。减少连接的开启和关闭的时间。

 

问题描述:

但是现在连接池多种多样,可能存在变化,有可能采用DBCP的连接池,也有可能采用容器本身的JNDI数据库连接池。

 

解决问题:

我们可以通过DataSource进行隔离解耦,我们统一从DataSource里面获取数据库连接,DataSource具体由DBCP实现还是由容器的JNDI实现都可以,所以我们将DataSource的具体实现通过让用户配置来应对变化。

 

 

第二步优化:SQL统一存取

 

问题描述:

我们使用JDBC进行操作数据库时,SQL语句基本都散落在各个JAVA类中,这样有三个不足之处:

第一,可读性很差,不利于维护以及做性能调优。

第二,改动Java代码需要重新编译、打包部署。

第三,不利于取出SQL在数据库客户端执行(取出后还得删掉中间的Java代码,编写好的SQL语句写好后还得通过+号在Java进行拼凑)。

 

解决问题:

我们可以考虑不把SQL语句写到Java代码中,那么把SQL语句放到哪里呢?首先需要有一个统一存放的地方,我们可以将这些SQL语句统一集中放到配置文件或者数据库里面(以key-value的格式存放)。然后通过SQL语句的key值去获取对应的SQL语句。

既然我们将SQL语句都统一放在配置文件或者数据库中,那么这里就涉及一个SQL语句的加载问题。

 

 

第三步优化:传入参数映射和动态SQL

 

 

问题描述:

很多情况下,我们都可以通过在SQL语句中设置占位符来达到使用传入参数的目的,这种方式本身就有一定局限性,它是按照一定顺序传入参数的,要与占位符一一匹配。但是,如果我们传入的参数是不确定的(比如列表查询,根据用户填写的查询条件不同,传入查询的参数也是不同的,有时是一个参数、有时可能是三个参数),那么我们就得在后台代码中自己根据请求的传入参数去拼凑相应的SQL语句,这样的话还是避免不了在Java代码里面写SQL语句的命运。既然我们已经把SQL语句统一存放在配置文件或者数据库中了,怎么做到能够根据前台传入参数的不同,动态生成对应的SQL语句呢?

 

解决问题:

第一,我们先解决这个动态问题,按照我们正常的程序员思维是,通过if和else这类的判断来进行是最直观的,这个时候我们想到了JSTL中的<if test=””></if>这样的标签,那么,能不能将这类的标签引入到SQL语句中呢?假设可以,那么我们这里就需要一个专门的SQL解析器来解析这样的SQL语句,但是,if判断的变量来自于哪里呢?传入的值本身是可变的,那么我们得为这个值定义一个不变的变量名称,而且这个变量名称必须和对应的值要有对应关系,可以通过这个变量名称找到对应的值,这个时候我们想到了key-value的Map。解析的时候根据变量名的具体值来判断。

假如前面可以判断没有问题,那么假如判断的结果是true,那么就需要输出的标签里面的SQL片段,但是怎么解决在标签里面使用变量名称的问题呢?这里我们需要使用一种有别于SQL的语法来嵌入变量(比如使用#变量名#)。这样,SQL语句经过解析后就可以动态的生成符合上下文的SQL语句。

还有,怎么区分开占位符变量和非占位变量?有时候我们单单使用占位符是满足不了的,占位符只能为查询条件占位,SQL语句其他地方使用不了。这里我们可以使用#变量名#表示占位符变量,使用$变量名$表示非占位符变量。

 

第四步优化:结果映射和结果缓存

 

问题描述:

执行SQL语句、获取执行结果、对执行结果进行转换处理、释放相关资源是一整套下来的。假如是执行查询语句,那么执行SQL语句后,返回的是一个ResultSet结果集,这个时候我们就需要将ResultSet对象的数据取出来,不然等到释放资源时就取不到这些结果信息了。我们从前面的优化来看,以及将获取连接、设置传入参数、执行SQL语句、释放资源这些都封装起来了,只剩下结果处理这块还没有进行封装,如果能封装起来,每个数据库操作都不用自己写那么一大堆Java代码,直接调用一个封装的方法就可以搞定了。

 

解决问题:

我们分析一下,一般对执行结果的有哪些处理,有可能将结果不做任何处理就直接返回,也有可能将结果转换成一个JavaBean对象返回、一个Map返回、一个List返回等等,结果处理可能是多种多样的。从这里看,我们必须告诉SQL处理器两点:第一,需要返回什么类型的对象;第二,需要返回的对象的数据结构怎么跟执行的结果映射,这样才能将具体的值copy到对应的数据结构上。

    接下来,我们可以进而考虑对SQL执行结果的缓存来提升性能。缓存数据都是key-value的格式,那么这个key怎么来呢?怎么保证唯一呢?即使同一条SQL语句几次访问的过程中由于传入参数的不同,得到的执行SQL语句也是不同的。那么缓存起来的时候是多对。但是SQL语句和传入参数两部分合起来可以作为数据缓存的key值。

 

 

第五步优化:解决重复SQL语句问题

问题描述:

由于我们将所有SQL语句都放到配置文件中,这个时候会遇到一个SQL重复的问题,几个功能的SQL语句其实都差不多,有些可能是SELECT后面那段不同、有些可能是WHERE语句不同。有时候表结构改了,那么我们就需要改多个地方,不利于维护。

 

解决问题:

     当我们的代码程序出现重复代码时怎么办?将重复的代码抽离出来成为独立的一个类,然后在各个需要使用的地方进行引用。对于SQL重复的问题,我们也可以采用这种方式,通过将SQL片段模块化,将重复的SQL片段独立成一个SQL块,然后在各个SQL语句引用重复的SQL块,这样需要修改时只需要修改一处即可。

 

 

4. 优化总结:

我们总结一下上面对JDBC的优化和封装:

(1) 使用数据库连接池对连接进行管理

(2) SQL语句统一存放到配置文件

(3) SQL语句变量和传入参数的映射以及动态SQL

(4) 动态SQL语句的处理

(5) 对数据库操作结果的映射和结果缓存

(6) SQL语句的重复

 

5.    Mybaits有待改进之处

问题描述:

Mybaits所有的数据库操作都是基于SQL语句,导致什么样的数据库操作都要写SQL语句。一个应用系统要写的SQL语句实在太多了。

 

改进方法:

我们对数据库进行的操作大部分都是对表数据的增删改查,很多都是对单表的数据进行操作,由这点我们可以想到一个问题:单表操作可不可以不写SQL语句,通过JavaBean的默认映射器生成对应的SQL语句,比如:一个类UserInfo对应于USER_INFO表, userId属性对应于USER_ID字段。这样我们就可以通过反射可以获取到对应的表结构了,拼凑成对应的SQL语句显然不是问题。



mybatis与原生jdbc的对比 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问。它由一组用Java语言编写的类和接口组成,是Java访问数据库的标准规范。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。 阅读详情

相关推荐

UReport2 报表设计器 在线表格

UReport2官网 一、UReport2报表设计器 UReport2是一个开源的可视化报表设计器,功能强大,操作简单,可以实现复杂的报表统计,有各种各样的导出和打印功能,支持导入Excel表格! 1、报表设计器 2、设计一个简单的用户列表展示 二、可编辑表格 扩展了layui的表格,支持多元化数据编辑(单选,多些、日期、下拉联动),开发简单、高效、便捷。有了它就可以轻松开发类似进销存系统的表格录入功能了,用户拿来即用! 三、主从表录......

ejinxian的专栏 2万+

Mybatis原理分析-----从JDBC到Mybaits

1.引言 本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。 2.JDBC实现查询分析 我们先看看我们最熟悉也是最基础的通过JDBC查询数据库数据,一般需要以下七个步骤: (1) 加载JDBC驱动 (2) 建立并获取数据库连接 ...

yingrenzhe68的专栏 678

Agent框架系列:1-低代码智能体平台深度解析Dify、Coze、n8n

Dify、Coze 和 n8n 是三大主流低代码智能体平台,各有侧重。Dify 适合企业级 AI 应用,具备强大的 RAG 和知识库管理能力,技术栈为 Python + React。Coze 由字节推出,主打零代码和快速原型开发,集成 60+ 插件,极适合非技术用户。n8n 以工作流自动化和系统集成为核心,支持 400+ 外部应用,基于 Node.js + Vue,扩展性极强。选择建议:非技术团队选 Coze,AI 应用选 Dify,复杂自动化与集成选 n8n。可根据实际需求混合使用,最大化平台优势。

3078

JDBC和MyBatis的使用

JDBC 就是使用Java语言操作关系型数据库的一套API全称:( Java DataBase Connectivity ) Java 数据库连接我们开发的同一套Java代码是无法操作不同的关系型数据库,因为每一个关系型数据库的底层实现细节都不一样。如果这样,问题就很大了,在公司中可以在开发阶段使用的是MySQL数据库,而上线时公司最终选用oracle数据库,我们就需要对代码进行大批量修改,这显然并不是我们想看到的。

weixin_67201964的博客 3010

RAG-Anything 实战:构建企业级多模态知识图谱问答系统

本文详细介绍了如何利用RAG-Anything构建企业级多模态知识图谱问答系统,解决跨模态文档处理的痛点。通过架构设计解析、部署实战指南和典型业务场景解决方案,帮助企业实现高效的知识管理和智能检索,提升决策效率。

weixin_29089057的博客 385

使用Label Studio标注车牌数据:YOLOv26模型训练指南

在计算机视觉领域,数据标注是模型训练的基础环节,直接影响最终模型的识别精度。Label Studio作为专业的标注工具,支持多种标注类型和格式导出,特别适合目标检测任务的数据准备。通过多边形标注技术,可以精确捕捉车牌的四个角点,生成旋转矩形框(OBB)标注数据,这种标注方式相比传统水平框能更好地处理倾斜车牌场景。标注完成后,数据可导出为YOLO格式,直接用于YOLOv26等先进目标检测模型的训练。在实际工程中,合理的标注策略和严格的质量控制能显著提升车牌识别模型在复杂场景下的鲁棒性,适用于智能交通、停车场管

chuozhi7142的博客 904

Mybatis学习之路--使用JDBC实现与数据库的操作

在项目中虽然很少会直接使用jdbc进行数据库操作,但是jdbc是java代码访问数据库的基础,比如mybatis的底层使用的是jdbc写的,所以了解java代码是如何使用jdbc访问数据库还是很重要的。 1.使用jdbc做查询 @Test public void queryPrepareStatementTest() { Connection conn = null; P...

u012548939的专栏 614

树莓派驱动DLPDLCR230NPEVM+framebuffer显示图片

DLPDLCR230NPEVM DLP® LightCrafter™ Display 230NP 是一个易于使用的紧凑型即插即用评估平台,适用于消费类产品、工业、医疗和物联网 (IoT) 市场中的各种超便携显示应用。此评估模块 (EVM) 采用 DLP230NP 芯片组,该芯片组由DLP230NP.23 1080p DMD、DLPC3436显示控制器和DLPA2005PMIC/LED 驱动器组成。此 EVM 外形小巧,配备生产就绪型光学引擎以及支持 18 位 RGB 并行视频接口...

L_Y000的博客 2618

第2关:MyBatis插入用户数据

在上一关我们练习了用JDBC的方式操作数据库,那接下来这关我们将学习并使用MyBatis来操作数据库。本关任务:使用MyBatis插入一条用户数据到MySQL表t_user中。

Grant的博客 2676

MaxEnt物种分布预测中的常见误区与优化技巧:如何提高模型准确率

本文深入探讨了MaxEnt物种分布预测模型从基础应用到精准预测的进阶实践。针对模型准确率提升,文章系统分析了环境变量筛选、模型参数调优、结果批判性解读等核心环节的常见误区,并提供了基于生态位模型原理的深度优化技巧,帮助研究者产出更可靠、可解释的预测结果。

weixin_29219539的博客 594

Trae AI开发工具:大前端环境配置与避坑指南

大前端开发的第一步往往不是选框架,而是搭建一套可靠的工具链。IDE作为编码、调试与AI能力协同的载体,直接决定后续开发的顺畅度。传统编辑器需要手动拼装插件生态,而新一代AI开发工具将对话、代码生成与项目脚手架能力内置到编辑器底层,降低了环境准备的门槛。Trae基于VS Code内核,兼容其插件体系,同时提供Chat、Builder、内联对话三种AI交互模式,适合从VS Code迁移的开发者,也适合大前端新人快速上手。安装时需认准官方渠道,注意Node.js、Git版本联动,配置自动格式化与手动更新策略,并结

weixin_26833139的博客 281

使用JDBC连接和操作数据库以及myBatis初级入门

使用jdbc是java操作数据库的第一步

烛照@123的博客 426

AI时代敏捷开发新范式——意图驱动开发IDD

具体的功能代码、单元测试、集成测试用例,以及最终可运行的、支持PlantUML的Markdown转Word工具新版本。:业务方(如技术文档团队)反馈,现有的Markdown转Word工具在处理包含PlantUML代码块的文档时,无法正确生成图表,导致技术方案、架构图等关键信息丢失,严重影响了文档交付质量和团队效率。这不仅带来了交付周期显著缩短、资源效能倍增的可观收益,更深远的意义在于,它描绘了未来软件工业化、智能化的新图景:一个由精准意图驱动、AI自主执行、人类智慧引领的敏捷、高效、高质的新世界。

LiuJunjiang的专栏 550

Mybatis学习笔记1——原生JDBC总结

一、jdbc编程步骤(jdbc编程六部曲) 1.注册数据库驱动    1)创建驱动对象 :告知 JDBC  我们即将连接哪个数据库    2) 通过 DriverManager.registerDriver(driver) 注册驱动 2.获取数据库连接 URL    1)  通过 DriverManager.getConnection(url,user,pwd)    重点:Conne...

lifeflower 450

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【MyBatis学习笔记1】-【MyBatis介绍,MyBatis官网,传统的JDBC的缺点,MyBatis优化JDBC的地方,MyBatis快速入门及步骤】

MyBatis介绍,MyBatis官网,传统的JDBC的缺点,MyBatis优化JDBC的地方,MyBatis快速入门及步骤

爱吃凉拌辣芒果的博客 237

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Mybatis学习笔记[1]之原生JDBC总结分析

原生JDBC连接数据库 加载数据库驱动 通过驱动管理类Connection获得数据库连接 创建JDBC Statement对象 编写SQL语句并设置参数(使用preparedStatement) 通过PreparedStatement执行SQL并获取ResultSet结果集 对结果进行解析处理 释放资源resultSet --&gt; preparedStatement --&gt;...

Rabbit_Judy的博客 249

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

mybatis学习笔记(1)---- 原生JDBC编程中存在的问题

mybatis学习笔记(一)---- 原生JDBC编程中存在的问题 JDBC编程的步骤 注册数据库驱动 创建连接者对象(Connection) 定义sql语句 创建执行者对象(用Preparestatement,解决sql注入问题) 执行sql语句(DML,DQL) 处理结果 释放资源 问题分析 数据库连接问题:原生JDBC每次连接数据库的时候,都会创建一个连接者对象,用完之后,就会释放这个...

博客 250

JDBC 与 Mybatis 对比

介绍了JDBC与Mybatis 的基本使用,以及他们对应的配置以及依赖的创建,对比了两者的使用场景以及优缺点。

m0_74209411的博客 2520

JDBC 与 MyBatis 详解:从基础到实践

MyBatis 则是数据库开发的 “效率加速器”,它深度简化 JDBC 操作,通过简洁的 XML 配置与注解,实现 Java 对象和数据库表的智能映射。其丰富的辅助配置与高性能连接池,让开发如虎添翼,显著提升代码质量与开发效率,是 Java 开发者必备的 “数据库开发神兵”!

m0_71744084的博客 3164

关于Mybatis和JDBC的联系

前言基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

weixin_50055999的博客 1489

JavaWeb学习记录:JDBC--Mybatis

本文介绍了Java数据库操作相关技术,重点讲解了JDBC和MyBatis框架的使用。主要内容包括:1. JDBC基础:介绍了JDBC作为Java操作关系型数据库的API规范,通过示例演示了查询、增删改操作,并分析了预编译SQL的优势;2. MyBatis框架:详细讲解了MyBatis的快速入门、配置方式(注解和XML)、数据库连接池技术以及增删改查操作实现;3. SpringBoot配置文件:对比了properties和yml两种配置方式,推荐使用yml格式进行配置管理。

ficker13的博客 1888

JDBC与MyBatis全面解析:从基础到比较

JDBC是Java操作数据库的标准API,需要手动编写SQL、管理连接和结果集转换,代码冗长但控制精细。MyBatis作为半ORM框架,通过XML/注解配置SQL,自动处理参数绑定和对象映射,大幅简化CRUD操作,支持动态SQL和缓存机制。核心区别在于:JDBC更接近底层,适合性能敏感场景或学习原理;MyBatis通过抽象提升开发效率,特别适合复杂查询和企业级应用。现代开发中,MyBatis在维护性和扩展性上优势显著,但理解JDBC有助于掌握数据库交互本质。两者配合使用能兼顾灵活性与开发效率。

wll0417yj的博客 2574

JDBC和Mybatis

用于加载驱动类,获取连接对象,所有SQL的执行和事务的处理都在connection连接环境中进行。getConnection(String url) 获取连接registerDriver(Driver driver) 注册驱动// 由于`com.mysql.cj.Driver` 源码已经注册了驱动,所以没用到方法 regiserDriver()// com.mysql.cj.Driver 源码static {try {");同时从之后,注册驱动的代码可以不用写了,原因是得力于此版本之后的。

weixin_45411898的博客 1024

【JDBC & MyBatis】快速上手MyBatis

方法名就是SQL映射文件的sql语句id,参数类型和返回值类型需要保持一致。

2301_76391858的博客 777
上一篇: java.sql.SQLException: Zero date value prohibited 异常的解决方法
下一篇: MyBatis笔记2:每个包的功能
sunforraining
博客等级 码龄9年 13粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值