当前位置: 首页 > news >正文

MyBatis入门(JDBC规范,MyBatis,连接池,Lombok)【详解】

目录

一、JDBC规范【了解】

1. JDBC介绍

2. JDBC示例

3. JDBC的问题

二、MyBatis入门【重点】

1. Mybatis是什么

2. Mybatis使用步骤

3. Mybatis入门案例

1.创建SpringBoot工程

2.创建Mapper

3.功能测试

三、连接池【了解】

1. 什么是连接池

2. 有哪些数据库连接池

3. 如何在项目里使用Druid连接池

四、Lombok【重点】

1. Lombok介绍

2. Lombok用法

3. 使用示例


一、JDBC规范【了解】

1. JDBC介绍

Java DataBase Connectivity,是Java连接数据库,是Sun公司提供的的API规范,用于执行SQL语句。是一切Java操作数据库的基础技术。

Java里的“规范”,通常指的是接口

JDBC的作用:实现Java程序对不同数据库的统一访问

数据库驱动:由数据库厂商提供的,实现了JDBC接口规范的一些API实现类,这些类打成jar包,我们称为驱动包

  • 操作什么数据库,就要有什么驱动包

  • 如果要操作MySQL,就必须有MySQL驱动包:我们有maven坐标

<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version>
</dependency>

2. JDBC示例

准备数据库表

create database if not exists db3;
use db3;    
create table user(id int unsigned primary key auto_increment comment 'ID',name varchar(100) comment '姓名',age tinyint unsigned comment '年龄',gender tinyint unsigned comment '性别, 1:男, 2:女',phone varchar(11) comment '手机号'
) comment '用户表';insert into user(id, name, age, gender, phone) VALUES (null,'白眉鹰王',55,'1','18800000000');
insert into user(id, name, age, gender, phone) VALUES (null,'金毛狮王',45,'1','18800000001');
insert into user(id, name, age, gender, phone) VALUES (null,'青翼蝠王',38,'1','18800000002');
insert into user(id, name, age, gender, phone) VALUES (null,'紫衫龙王',42,'2','18800000003');
insert into user(id, name, age, gender, phone) VALUES (null,'光明左使',37,'1','18800000004');
insert into user(id, name, age, gender, phone) VALUES (null,'光明右使',48,'1','18800000005');

准备实体类

public class User {private Integer id;private String name;private Integer age;private Integer gender;private String phone;//get 和 set方法,略//toString方法,略
}

JDBC示例

package com.itheima;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;public class DemoJdbc {public static void main(String[] args) throws Exception {//1. 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2. 获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");//3. 创建SQL执行平台PreparedStatement pstmt = conn.prepareStatement("select * from user");//4. 执行SQLResultSet resultSet = pstmt.executeQuery();//5. 处理结果List<User> userList = new ArrayList<>();while (resultSet.next()) {User user = new User();int id = resultSet.getInt("id");user.setId(id);String name = resultSet.getString("name");user.setName(name);int age = resultSet.getInt("age");user.setAge(age);int gender = resultSet.getInt("gender");user.setGender(gender);String phone = resultSet.getString("phone");user.setPhone(phone);userList.add(user);}//6. 释放资源resultSet.close();pstmt.close();conn.close();userList.forEach(System.out::println);}
}

3. JDBC的问题

  • 硬编码问题:数据库连接信息等等参数,都在Java源码里写死了。如果将来部署到生产环境后,需要调整配置,就不得不修改源码

    Mybatis整合SpringBoot,把所有参数写到了配置文件,可以很方便的修改,而不用修改源码

  • 操作太繁琐:执行一条SQL语句,要写十几行甚至几十行代码

    Mybatis对JDBC做了再封装,执行一条SQL只需要很少的代码就能实现

  • 性能不够强:每次操作数据库,Java程序都会与数据库建立连接、创建Connection对象;操作完成要释放关闭掉。在数据库操作高峰期,会有频繁的对象创建与销毁,非常消耗性能

    Mybatis使用了连接池技术解决这个问题

二、MyBatis入门【重点】

1. Mybatis是什么

MySQL是持久层Dao层的框架,它用于简化JDBC的操作。

拓展:目前持久层的框架,常见的有:

  • Mybatis:目前国内最流行的Dao层框架

  • Hibernate:国内使用的少了,国外使用的很多。国内的一些老项目,可能使用的是Hibernate

  • SpringData JPA:对持久层的技术再封装,比如对Hibernate再封装,提供了更简便的操作

2. Mybatis使用步骤

  1. 准备数据库和表:前边JDBC里已经准备过了,略

  2. 准备一个maven工程:

    创建一个SpringBoot工程,添加依赖、配置文件、引导类

  3. 使用Mybatis操作数据库

    准备实体类:一张表通常要准备一个类。类的属性和表的字段要对应

    修改配置文件:准备数据库的连接信息,包括驱动类名、地址、帐号、密码

    编写一个接口,接口里写一个方法,方法上配置SQL语句

    调用这个接口的方法,就可以了

3. Mybatis入门案例

1.创建SpringBoot工程

如果要创建空的maven工程,改造成SpringBoot工程,只需要三件事:

  • 依赖:SpringBoot父工程坐标和起步依赖

<!-- SpringBoot父工程坐标 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version></parent><dependencies><!--mybatis的起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!-- mysql驱动包, 刚刚发布的最新版本的驱动包--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><!--springboot单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
  • 配置:创建一个名称为application.properties的文件,放到src\main\resources目录里

  • 引导类:创建一个引导类,固定写法

@SpringbootApplication
public class 引导类名{public static void main(String[] args){SpringApplication.run(引导类.class, args);}
}

准备配置文件

修改application.properties文件,添加如下配置:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db3
spring.datasource.username=root
spring.datasource.password=root

准备实体类

前边JDBC部分已经创建了User类,直接复制过来使用即可

2.创建Mapper

package com.itheima.mapper;import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 1. Mapper接口,名称通常是XxxMapper,比如UserMapper、DeptMapper* 2. Mapper接口,上边加@Mapper注解,目的是让SpringBoot扫描这个注解,生成它的对象放到IoC容器里。类似于@Controller、@Service*/
@Mapper
public interface UserMapper {/*** 查询所有用户,得到List<user>*/@Select("select * from user")List<User> queryAll();
}

3.功能测试

注意:

  • 单元测试类上需要加@SpringBootTest,然后才可以在测试类里使用@Autowired注入

package com.itheima;import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
public class MybatisTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testQueryAll(){List<User> userList = userMapper.queryAll();userList.forEach(System.out::println);}
}

三、连接池【了解】

1. 什么是连接池

池化思想,用于提供有限数量的资源对象,重复利用,可以减少频繁创建对象与销毁对象的开销。

  • 创建池子:在池子里初始化一堆对象,备用

  • 使用的时候:如果需要使用,就从池子里取出一个进行使用;使用完成,再把对象交还到池子里

  • 例如:线程池,数据库连接池

数据库连接池:

  • 只需要池子里准备少量的Connection连接对象,就可以支持海量的数据库操作。因为这些对象是可以循环使用的

  • 避免频繁创建Connection与数据库建立连接所造成的资源开销,从而大大提升性能

2. 有哪些数据库连接池

  • DBCP:比较早的连接池,早期Tomcat内置的有这种连接池

  • C3P0:使用相对广泛的连接池

  • Druid:德鲁伊,Alibaba提供的连接池技术,它以丰富的功能著称,除了连接池的基本功能,还具备数据库的监控能力

  • HikariCP:以性能著称的连接池,SpringBoot官方内置了HikariCP连接池,默认使用的

所有连接都有相同的使用规范:

  • 所有连接池类都必须实现javax.sql.DataSource接口

  • 从任意连接池里获取连接的方法,都是getConnection()

3. 如何在项目里使用Druid连接池

1.添加druid的起步依赖

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version>
</dependency>

2.配置一下,指定使用Druid连接池:只要修改application.properties文件

#没有指定使用哪种连接池,默认使用的是HikariCP
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_homework
#spring.datasource.username=root
#spring.datasource.password=root
#如果想指定使用Druid连接池
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/mybatis_homework
spring.datasource.druid.username=root
spring.datasource.druid.password=root

四、Lombok【重点】

1. Lombok介绍

Lombok是一个插件,目前已经被idea内置进去了。

用于在代码编译过程中,帮我们生成一些代码。从而让我们的代码更简洁

2. Lombok用法

  1. 添加lombok的依赖坐标

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

2.使用Lombok简化代码:通过注解实现的

  • @Data:加在实体类上,Lombok会帮我们给实体类生成无参构造、所有成员变量的get和set方法、toString、equals、hashCode等等方法

  • @NoArgsConstructor:加在实体类上,Lombok会帮我们生成无参构造

  • @AllArgsConstructor:加在实体类上,Lombok会帮我们生成全参构造

  • @Getter:生成get方法的。可以加在类上,也可以加在某个成员变量上

  • @Setter:生成set方法的。可以加在类上,也可以加在某个成员变量上

3. 使用示例

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id;private String username;private String password;private String name;private Integer gender;private String image;private Integer job;
}

相关文章:

MyBatis入门(JDBC规范,MyBatis,连接池,Lombok)【详解】

目录 一、JDBC规范【了解】 1. JDBC介绍 2. JDBC示例 3. JDBC的问题 二、MyBatis入门【重点】 1. Mybatis是什么 2. Mybatis使用步骤 3. Mybatis入门案例 1.创建SpringBoot工程 2.创建Mapper 3.功能测试 三、连接池【了解】 1. 什么是连接池 2. 有哪些数据库连接池…...

Vue3--数据和方法

data 组件的 data 选项是一个函数。Vue 在创建新组件实例的过程中会自动调用此函数。   data选项通常返回一个对象&#xff0c;然后 Vue 会通过响应性系统将其包裹起来&#xff0c;并以 $data 的形式存储在组件实例中。 <!DOCTYPE html> <html lang"en"&g…...

网络编程面试题

一、什么是IP地址 1.IP地址是主机在网路中的唯一标识&#xff0c;&#xff0c;当主机从一个网络切换到另一个网络时&#xff0c;会更改IP地址&#xff0c;同样的IP地址也是路由器进行路由选择的标识 2.IP地址的分类 IPV4&#xff1a;采用4字节无符号整数存储 IPV6&#xff…...

移动端区分点击和长按

为了适配移动端&#xff0c;图片加入touchstart&#xff0c;touchend&#xff0c;并加了 e.preventDefault() 屏蔽默认菜单。 然而突然发现移动端图片的链接无响应了&#xff0c;PC端没问题。 而且功能需要区分点击和长按。 原生js如何判断移动端的tap,dbltap&#xff0c;lo…...

虚拟环境的激活

(此博客仅用于我记录虚拟环境的激活方法) 虚拟环境的激活命令: venv/Scripts/activate 在F:\git repo\Database-Course-Design 这个文件夹中启动命令行 这个文件夹中含有虚拟环境venv 输入命令venv/Scripts/activate&#xff0c;就得到下面的结果: 此时就激活了虚拟环境&…...

宏集案例 | 风电滑动轴承齿轮箱内多点温度采集与处理

前言 风力发电机组中的滑动轴承齿轮箱作为关键的传动装置&#xff0c;承担着将风能转化为电能的重要角色。齿轮箱内多点温度的实时监测可以有效地预防设备故障和性能下降。实时监测齿轮箱内多点温度可以有效地预防设备故障和性能下降。 为了确保风力发电机组的安全稳定运行&a…...

linux 16进制写入

1.简单用法[推荐] echo 001122334455 | xxd -r -ps > test // 6 个字节xxd // xxd 命令用于用二进制或十六进制显示文件的内容 -r // 把xxd的十六进制输出内容转换回原文件的二进制内容 -ps // 以 postscript的连续十六进制转储输出&#xff0c;这也叫做纯十六进…...

代码随想录算法训练营第60天| Leetcode 84.柱状图中最大的矩形

文章目录 Leetcode 84.柱状图中最大的矩形 Leetcode 84.柱状图中最大的矩形 题目链接&#xff1a;Leetcode 84.柱状图中最大的矩形 题目描述&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状…...

编写一个简单的cmakelist.txt

文章目录 代码main.cpp头文件和子模块CMakeLists.txtsubModule/CMakeLists.txt顶层CMakeLists.txtCMakeList中的内容说明生成跨平台到Visual studio下上一篇提到了cmake的设计目的与作用,这一篇就来手动编写一个基本的cmakelist.txt,并演示一下如何生成不同平台的构建文件。 …...

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的零售柜商品检测软件(Python+PySide6界面+训练代码)

摘要&#xff1a;开发高效的零售柜商品识别系统对于智能零售领域的进步至关重要。本文深入介绍了如何运用深度学习技术开发此类系统&#xff0c;并分享了全套实现代码。系统采用了领先的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5进行了性能比较&#xff0c;呈现了诸如…...

数据库的学习

数据库软件&#xff1a; 关系型数据库&#xff1a;Mysql Oracle SqlServer Sqlite 非关系型数据库&#xff1a;Redis NoSQL 1.数组&#xff0c;链表&#xff0c;文件&#xff0c;数据库 数组&#xff0c;链表&#xff1a;内存存放数据的方式&…...

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…...

C++超详细知识点(五):类的友元函数和友元类

目录 标题&#xff1a; 友元函数和友元类1. 友元函数2. 友元类 标题&#xff1a; 友元函数和友元类 友元函数和友元类是C中的概念&#xff0c;它们允许某些函数或类访问另一个类的私有成员。这样的访问权限超过了通常的私有和保护访问级别。请注意&#xff0c;友元类的使用应该…...

SOC设计:关于reset的细节

有如下几个信号 1、时钟&#xff1a;clk_top 2、总的reset信号&#xff1a;rstn_top 3、scan的reset信号&#xff1a;scan_rstn 4、软件复位信号&#xff1a;rstn_soft_sub 5、scan模式信号&#xff1a;scan_mode 6、reset bypass 信号&#xff1a;scan_rstn_sel 功能&a…...

支小蜜AI校园防欺凌系统可以使用在宿舍吗?

随着人工智能技术的快速发展&#xff0c;AI校园防欺凌系统已成为维护校园安全的重要手段。然而&#xff0c;关于这一系统是否适用于宿舍环境&#xff0c;仍存在一些争议和讨论。本文将探讨AI校园防欺凌系统在宿舍中的适用性&#xff0c;分析其潜在的优势与挑战&#xff0c;并提…...

外卖平台订餐流程架构的实践

当我们想要在外卖平台上订餐时&#xff0c;背后其实涉及到复杂的技术架构和流程设计。本文将就外卖平台订餐流程的架构进行介绍&#xff0c;并探讨其中涉及的关键技术和流程。 ## 第一步&#xff1a;用户端体验 用户通过手机应用或网页访问外卖平台&#xff0c;浏览菜单、选择…...

[AIGC] Spring Boot中的切面编程和实例演示

切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;是Spring框架的关键功能之一。通过AOP&#xff0c;我们可以将代码下沉到多个模块中&#xff0c;有助于解决业务逻辑和非业务逻辑耦合的问题。本文将详细介绍Spring Boot中的切面编程&#xff0c;并…...

各个类型和Json类型的相互转换

ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是Jackson的主要类&#xff0c;它可以帮助我们快速的进行各个类型和Json类型的相互转换。 对应maven&#xff1a; <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId&…...

C语言:操作符详解(下)

目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性&#xff1a;优先级…...

电商场景下 ES 搜索引擎的稳定性治理实践

继上文在完成了第一阶段 ES 搜索引擎的搭建后&#xff0c;已经能够实现对千万级别的商品索引的读写请求的支持。目前&#xff0c;单机房读流量在 500&#xff5e;1000 QPS 之间&#xff0c;写流量在 500 QPS 左右。 但随着业务的发展&#xff0c;问题也逐渐开始暴露&#xff0…...

Triton模型服务实战:生产级部署、监控与故障排查

1. 项目概述&#xff1a;当模型走出Jupyter&#xff0c;真正开始呼吸真实世界的空气“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号&#xff0c;专为那些在Jupyter里调通了模型、画出了漂亮ROC曲线、却在部署时被现实迎…...

皮线、裸纤总是分不清?试试这个算法一键校准技巧

不知道你有没有经历过这种工地上的"崩溃瞬间"&#xff1a;大热天蹲在居民楼昏暗的楼道里&#xff0c;蚊子在耳边嗡嗡叫&#xff0c;你手里正拉着一根刚从住户门缝里拽出来的皮线光缆&#xff0c;准备跟分纤箱引出来的单模裸纤做熔接。结果放进机器&#xff0c;合上盖…...

使用C#代码在 PowerPoint 中组合或取消组合形状

在 PowerPoint 中&#xff0c;对形状进行组合和取消组合是两个非常实用的功能。通过组合&#xff0c;您可以将多个形状整合为一个整体&#xff0c;从而像操作单个对象一样同时移动、设置格式、调整大小或旋转这些形状。而取消组合则可以解除这些形状之间的关联&#xff0c;使您…...

NV040D语音芯片在儿童坐姿纠正器中的低成本高效应用

1. 项目概述&#xff1a;从痛点出发的智能硬件设计作为一名在消费电子和智能硬件领域摸爬滚打了十几年的工程师&#xff0c;我见过太多“为设计而设计”的产品&#xff0c;它们功能花哨&#xff0c;却往往忽略了最核心的用户需求。今天想和大家深入聊聊的&#xff0c;是一个看似…...

过渡金属配合物构建工具:从配位模板到多齿配体的智能设计平台

1. 项目概述&#xff1a;为什么我们需要一个“构建工具”&#xff1f;在合成化学、材料科学乃至药物研发领域&#xff0c;过渡金属配合物扮演着核心角色。它们不仅是催化反应的“发动机”&#xff0c;也是功能材料&#xff08;如发光材料、磁性材料&#xff09;的“结构单元”&…...

手把手用Python实现μ律/A律压缩算法(附完整代码与波形对比)

手把手用Python实现μ律/A律压缩算法&#xff08;附完整代码与波形对比&#xff09; 在数字音频处理领域&#xff0c;动态范围压缩是一个永恒的话题。想象一下&#xff0c;当你录制一段包含轻柔耳语和强烈鼓声的音频时&#xff0c;直接使用线性PCM编码会导致要么小声部分被量化…...

测试工程师如何与开发人员高效沟通?这5个技巧让你不再背锅

在互联网软件研发流程中&#xff0c;测试工程师和开发工程师是天生的“搭档”也是最容易产生矛盾的组合&#xff1a;测试测出bug&#xff0c;开发说“这不是我的问题”“环境不对”“你操作错了”&#xff0c;最后问题定位下来测试背锅&#xff1b;测试提前同步风险&#xff0c…...

掌握Manim数学动画引擎:从零到一的完整攻略

掌握Manim数学动画引擎&#xff1a;从零到一的完整攻略 【免费下载链接】manim Animation engine for explanatory math videos 项目地址: https://gitcode.com/GitHub_Trending/ma/manim Manim是一款专为数学可视化设计的强大动画引擎&#xff0c;能够通过编程方式创建…...

Keil µVision TAB显示异常问题分析与解决方案

1. 问题现象与背景分析在Keil Vision集成开发环境中&#xff0c;部分用户遇到了编辑器界面显示异常的问题。具体表现为&#xff1a;当代码中包含TAB字符&#xff08;制表符&#xff09;时&#xff0c;屏幕上会出现奇怪的显示错乱&#xff0c;原本应该显示为空白缩进的区域&…...

量子态相似性度量:迹距离与保真度的工程应用

1. 量子态相似性度量的工程意义 在量子计算的实际应用中&#xff0c;我们经常需要比较两个量子态的相似程度。比如在量子电路验证时&#xff0c;需要确认实际输出的量子态是否与理论预期相符&#xff1b;在量子纠错中&#xff0c;要评估噪声对量子态的影响程度&#xff1b;在量…...