JavaEE13-MyBatis查询数据库

news2024/11/19 4:38:02
前言:前面已经学习了Spring,Spring Boot,Spring MVC这3个框架,接下来学习第4个框架MyBatis(国内):将前端传递的数据存储起来(前身IBatis)或者查询数据库里面的数据。
PS:不同版本号区别
3.5.1 -> 3.5的第一个版本
3.5.10 -> 3.5的第十个版本
org -> 开源框架域名(非盈利性的公益组织)

1.MyBatis是什么?

MyBatis是一款优秀的持久层框架(ORM框架),它支持自定义SQL,存储过程(以程序里写方法的方式来写SQL,问题:无法一步步调试。企业里几乎不用)以及高级映射。MyBatis去除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型,接口和JavaPOJO(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。

简单来说MyBatis是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具/框架。

MyBatis支持的操作方式:
①3.1版本之前:支持XML的操作方式(主流90%企业在用)自由度灵活度大;
②3.1版本之后:使用注解实现数据库的操作(企业里几乎不用)实现特殊业务时会非常复杂。

2.为什么要学习MyBatis?

对于后端开发来说,程序是由①后端程序②数据库这两部分组成的。

而这两部分要通讯,就要依赖数据库连接工具(有JDBC,MyBatis)。

JDBC操作流程:

  1. 创建数据库连接池DataSource。

  1. 通过DataSource获取数据库连接Connection。

  1. 编写要执行带 ? 占位符的 SQL 语句。

  1. 通过 Connection 及 SQL 创建操作命令对象 Statement。

  1. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值。

  1. 使用 Statement 执行 SQL 语句。

  1. 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量。

  1. 处理结果集。

  1. 释放资源。

JDBC 操作示例回顾:通过 JDBC 的 API 向数据库中添加⼀条记录,修改⼀条记录,查询⼀条记

录:

-- 创建数据库
create database if not exists `library` default character set utf8mb4;
-- 使⽤数据库
use library;
-- 创建表
create table if not exists `soft_bookrack` (
 `book_name` varchar(32) NOT NULL,
 `book_author` varchar(32) NOT NULL,
 `book_isbn` varchar(32) NOT NULL primary key
) ;

以下是 JDBC 操作的具体实现代码:

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SimpleJdbcOperation {
    private final DataSource dataSource;
    
    public SimpleJdbcOperation(DataSource dataSource) {
        this.dataSource = dataSource;
   }
    
    /**
     * 添加⼀本书
     */
    public void addBook() {
        Connection connection = null;
        PreparedStatement stmt = null;
        try {
            //获取数据库连接
            connection = dataSource.getConnection();
            //创建语句
            stmt = connection.prepareStatement(
                    "insert into soft_bookrack (book_name, book_author,
book_isbn) values (?,?,?);"
           );
            //参数绑定
            stmt.setString(1, "Spring in Action");
            stmt.setString(2, "Craig Walls");
            stmt.setString(3, "9787115417305");
            //执⾏语句
            stmt.execute();
       } catch (SQLException e) {
            //处理异常信息
       } finally {
            //清理资源
            try {
                if (stmt != null) {
                    stmt.close();
               }
                if (connection != null) {
                    connection.close();
               }
           } catch (SQLException e) {
                //
           }
       }
   }
    
    /**
     * 更新⼀本书
     */
    public void updateBook() {
        Connection connection = null;
        PreparedStatement stmt = null;
        try {
            //获取数据库连接
            connection = dataSource.getConnection();
            //创建语句
            stmt = connection.prepareStatement("update soft_bookrack set book_author=? where book_isbn=?;"
           );
            //参数绑定
            stmt.setString(1, "张卫滨");
            stmt.setString(2, "9787115417305");
            //执⾏语句
            stmt.execute();
       } catch (SQLException e) {
            //处理异常信息
       } finally {
            //清理资源
            try {
                if (stmt != null) {
                    stmt.close();
               }
                if (connection != null) {
                    connection.close();
               }
           } catch (SQLException e) {
                //
           }
       }
   }
    
    /**
     * 查询⼀本书
     */
    public void queryBook() {
        Connection connection = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Book book = null;
        try {
            //获取数据库连接
            connection = dataSource.getConnection();
            //创建语句
            stmt = connection.prepareStatement("select book_name, book_author, book_isbn from
soft_bookrack where book_isbn =?"
           );
            //参数绑定
            stmt.setString(1, "9787115417305");
            //执⾏语句
            rs = stmt.executeQuery();
            if (rs.next()) {
                book = new Book();
                book.setName(rs.getString("book_name"));
                book.setAuthor(rs.getString("book_author"));
                book.setIsbn(rs.getString("book_isbn"));
           }
            System.out.println(book);
       } catch (SQLException e) {
            //处理异常信息
       } finally {
            //清理资源
            try {
                if (rs != null) {
                    rs.close();
               }
                if (stmt != null) {
                    stmt.close();
               }
                if (connection != null) {
                    connection.close();
               }
           } catch (SQLException e) {
                //
           }
       }
   }
    
    public static class Book {
        private String name;
        private String author;
        private String isbn;
        //省略 setter getter ⽅法
   }
}

从上述代码和操作流程可以看出,对于 JDBC 来说,整个操作⾮常的繁琐,我们不但要拼接每⼀个参数,⽽且还要按照模板代码的⽅式,⼀步步的操作数据库,并且在每次操作完,还要⼿动关闭连接等,⽽所有的这些操作步骤都需要在每个⽅法中重复书写。于是我们就想,那有没有⼀种⽅法,可以更简单、更⽅便的操作数据库呢?

答案是肯定的,这就是我们要学习 MyBatis 的真正原因,它可以帮助我们更⽅便、更快速的操作数据库。

3.怎么学MyBatis?

MyBatis 学习只分为两部分:配置 MyBatis 开发环境;使⽤ MyBatis 模式和语法操作数据库。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

命令执行利用

数据来源 01 命令执行漏洞 命令执行漏洞- 例子1(无防御) 示例:(我这里使用dvwa靶场做演示) 解决靶场响应结果的中文乱码 charsetutf-8,修改为charsetgb2312 把安全等级调到:low&#xff0…

concat函数在mySQL和Oracle中的不同

在mysql中的使用1>.在该函数中传入两个值:22和33,得到结果为两个值的拼接效果如图所示2>.在该函数中传入两个及以上的值:22和33和44,得到结果为多个值的拼接效果如图所示3>.在该函数中传入两个及以上的值:null和22和33,得…

GitHub 上有哪些优秀的项目?

前言 各个领域模块的都整理了一下,包含游戏、一些沙雕的工具、实用正经的工具以及一些相关的电商项目,希望他们可以给你学习的路上增加几分的乐趣,我们直接进入正题~ 游戏 1.吃豆人 一款经典的游戏开发案例,包括地图绘制、玩家控…

车载网络 - BootLoader - CAN/CANFD刷写过程

话接上回,我们继续分享刷写流程。 刷写Boot到RAM(如果ECU中有独立的boot代码,无需执行此段) 9、获取单次刷写的最大长度(参考https://mp.csdn.net/mp_blog/creation/editor/127720716) Request:34 00 44 + 地址 + 长度 Response:74 00 44 + Maxlength 10、进行刷写传…

Netty之DefaultAttributeMap与AttributeKey的机制和原理

为什么要分析DefaultAttributeMap和AttributeKey呢?我自己对Netty也是一个不断的学习过程,从前面几篇Netty分析的博客中,可以看出,Netty是比较博大精深的,很像java.util.concurrent.*包中的源码,如果只是看…

【微电网】微电网的分布式电源优化配置研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

企业工程管理系统源码-专注项目数字化管理

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保项…

关于卷积过程中通道数如何变化问题

以RGB图像为例。 一个12*12的像素图,对其进行5*5的卷积,最后得到一个8*8【计算过程:(12-5)/118】的像素图。 RGB图像有3个通道(12*12*3),所以卷积核也要有3个通道(5*5*3)&am…

第一章 隐私计算科普与解读

前言 提醒:全文10千字,预计阅读时长15分钟;读者:对隐私计算感兴趣的小伙伴;目的:读者利用15~30 分钟对本文沉浸式阅读理解,能够掌握隐私计算 80% 的概念;关键词 :隐私计算…

好用的搜索工具listary

发现一个好工具记录一下。以后好好用起来。 这个工具我安装后,跟着引导教程,学做了一些操作立马就爱上了。 Listary:大幅度提高本地文件浏览与搜索速度效率的「超级神器」 百度安全验证https://baijiahao.baidu.com/s?id17127561426219890…

【Python】基于you-get下载网页视频

文章目录1 前言2 you-get2.1 安装2.2 简单使用2.3 扩展3 下载网页视频3.1 概述3.2 下载网页4 代码1 前言 过年了,想给家里长辈下几首戏曲,于是找到一个发布戏曲的网站,虽然可以通过IDM插件的资源嗅探来一一下载,但是内容太多&…

【JavaScript】数据劫持详解

💻 【JavaScript】数据劫持 🏠专栏:JavaScript 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向:目前主攻前端&#…

这就是传说中超难的N皇后?——详细图解!

✔️本文主题:回溯算法之N皇后 算法 ✔️题目链接:N皇后 详解N皇后一、前言二、题目信息三、解题思路四、参考代码五、结语一、前言 大家好久不见,今天我们一起来学习一道很经典、也很有难度的一道题目——N皇后 二、题目信息 按照国际象棋…

Spring-基础知识二

Spring9.Spring JdbcTemplate的使用9.1 JdbcTemplate入门9.1.1 需要的包9.1.2 代码测试9.2 将数据源和jdbcTemplate交给Spring来管理9.2.1 druid连接池9.2.2 使用外部文件配置数据连接信息9.3 基于JdbcTemplate实现DAO9.Spring的事务管理机制9.1 PlatformTransactionManager 事…

第十章 面向对象编程(高级)

一、类变量和类方法(P374) 1. 类变量 定义语法: 访问修饰符 static 数据类型 变量名; 类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时&…

微服务 热点流控 规则-授权 系统规则 自定义返回

微服务 热点流控 规则-授权 系统规则 自定义返回Sentinel-热点流控操作示例Sentinel规则-授权操作示例Sentinel规则-系统规则Sentinel自定义异常返回Sentinel-热点流控 拿商品举例,当一个商品的查询请求量异常火爆的时候,应该对该商品的查询请求进行限流…

FineReport使用

目录报表命名规范数据集命名规则参数命名规则条件属性命名规则超链接命名规范决策报表组件命名规则普通报表悬浮元素命名规则用户权限模版版本管理FineDB内置数据库外置数据库配置外接数据库新建数据库外接数据库配置入口配置外接数据库数据表权限控制:用户-部门职位…

【JavaEE】锁策略 + synchronized原理 + CAS + JUC下常用类和接口 + 死锁

目录 锁策略 乐观锁VS悲观锁 轻量级锁VS重量级锁 自旋锁VS挂起等待锁 互斥锁VS读写锁 公平锁VS非公平锁 可重入锁VS不可重入锁 synchronized原理 synchronized特性 synchronized优化机制 加锁过程优化 锁消除 锁粗化 CAS CAS概念 CAS原理 CAS应用 自旋锁的实…

Vite+Vue3+TypeScript 搭建开发脚手架

Vite前端开发与构建工具 开发环境中,vite无需打包,可快速的冷启动 真正的按需编译,不需要等待整个应用编译完成 一个开发服务器,它基于原生ES模块 提供了丰富的内建功能,速度快模块热更新(HMR&#xff0…

2022年10个最流行Blender插件

如果你从事平面设计、动画或 3D 建模,您可能听说过Blender,这是一款开源的一体化 3D 图形软件。Blender 配备了适用于各种领域的工具和功能,包括 3D 动画、计算机辅助设计、纹理编辑、特殊效果等。 Blender 的最新版本3.0于 2021 年 12 月上…