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

news2024/11/15 11:16:17

目录

一、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. 执行SQL
        ResultSet 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 {
    @Autowired
    private UserMapper userMapper;

    @Test
    public 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;
}

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

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

相关文章

Java_9最大连续1的个数

最大连续1的个数 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大连续 1 的个数是 3. 示例 2: 输入…

SIP-7043 SV-7043网络吸顶喇叭商场会议室播放器10W网络有源吸顶喇叭

SIP-7043 SV-7043网络吸顶喇叭商场会议室播放器 10W网络有源吸顶喇叭 一、描述 SIP-7043是我司的一款SIP网络有源吸顶喇叭&#xff0c;具有10/100M以太网接口&#xff0c;内置有一个高品质扬声器&#xff0c;将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率1…

Ubuntu23.10安装FFmpeg及编译FFmpeg源码

安装FFmpeg: 打开终端: 输入 sudo apt install ffmpeg 安装成功: 验证FFmpeg 默认安装位置与库与头文件位置 使用FFmpeg源码编译: 1.安装YASM sudo apt-get install yasm

STM32 晶振(用示波器测RCC频率是否一致)

如果测出的频率不准确&#xff0c;可以修改一下看看是否有改善&#xff1a;

1. 用两种方式在springboot项目中实现适配器模式

文章目录 用两种方式在springboot项目中实现适配器模式1. 场景2. 方式1&#xff0c;通过实现类定义类型字段实现2.1 创建接口2.2 创建mysql实现类2.3 创建oracle实现类2.4 创建接口,在接口中注入service集合&#xff0c;根据每个实现类中定义的dbType进行匹配后进行调用2.5 测试…

个人博客系列-后端项目-用户注册功能(7)

介绍 用户注册API的主要流程&#xff1a;1.前端用户提交用户名&#xff0c;密码 2. 序列化器校验用户名&#xff0c;密码是否合法。3.存入数据库。4.签发token 创建序列化器 from rest_framework import serializers from rest_framework_simplejwt.serializers import Toke…

harmonyOS简介及背景

harmonyOS的场景模式18n: 1&#xff08;入口手机&#xff09;8&#xff08;电脑、VR、手环、iPad、智慧屏、&#xff09;–wifi—n(车载、智能家居等所有)harmonyOS不需要考虑软硬件的差异&#xff0c;是一个兼容N种的超级终端harmonyOS干了两件事&#xff1a; &#xff08;1&a…

前端项目,个人笔记(一)【定制化主题 + 路由设计】

目录 1、项目准备 1.1、项目初始化 1.2、elementPlus按需引入 注&#xff1a;使用cnpm安装elementplus及两个插件&#xff0c;会报错&#xff1a;vueelement-plus报错TypeError: Cannot read properties of null (reading isCE ) &#xff0c;修改&#xff1a; 测试&#…

[Redis]——Redis持久化的两种方式RDB、AOF

目录 RDB快照模式 概念&#xff1a; 触发时机&#xff1a; 异步做快照 AOF追加模式 概念&#xff1a; 触发时机&#xff1a; bgrewriteaof命令&#xff1a; 比较两种模式&#xff1a; RDB快照模式 概念&#xff1a; RDB模式就是保存当前Redis的状态到本地磁盘文件&am…

阿里云服务器ECS--安全,稳定,购买灵活,低成本

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如ECS经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云服务器网al…

【Redis】Redis常用命令一

1.keys&#xff1a;返回所有满足条件的key&#xff0c;比如&#xff1a; KEYS pattern时间复杂度&#xff1a;O(N)&#xff0c;返回值&#xff1a;匹配pattern的所有key。 • h?llo 匹配 hello , hallo 和 hxllo • h*llo 匹配 hllo 和 heeeello • h[ae]llo 匹配 hello 和 …

Java基于微信小程序的校园生活互助小助手

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

算法时空复杂度分析:大O表示法

文章目录 前言大O表示法3个时间复杂度分析原则常见的时间复杂度量级空间复杂度参考资料 前言 算法题写完以后&#xff0c;面试官经常会追问一下你这个算法的时空复杂度是多少&#xff1f;&#xff08;好像作为一名算法工程师&#xff0c;我日常码代码的过程中&#xff0c;并没…

Codeforces Round 931 (Div. 2)题解

A. Too Min Too Max&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;给定一个数组a[],从中找到4个下标i,j,k,l,求|ai-aj||aj-ak||ak-al||al-ai|的最大值。 思路&#xff1a;显然随便找四个下标与顺序无关&#xff0c;那么我们可以先将a[]排序。那么实…

CSS:实现择色器透明度条的两种方法(附赠一个在线图片转base64网站)

一、效果展示 二、实现方式 1.锥形渐变 .main{width: 600px;height: 20px;background: repeating-conic-gradient(rgba(1, 1, 1, 0.1) 0 25%,transparent 0 50%);background-size: 20px 20px;} 2.背景图 将一个四方格图片转为base64然后直接在css中使用 .main1 {width: 600p…

Sectigo通配符

Sectigo通配符SSL证书是一种特别设计的数字证书解决方案&#xff0c;尤其适合拥有大量子域名的企业或组织。通过使用通配符“*”字符&#xff0c;这种证书可以一次性加密并验证一个主域名以及该主域名下的任意数量的子域名。比如&#xff0c;如果你拥有example.com作为主域名&a…

如何通过libusb直接向zebra打印机发送zpl,跨平台win/linux

环境&#xff1a;windows & linux & Zebra打印机gt820 windows: 之前安装了Zebra打印机官方驱动&#xff0c;所以先卸载掉驱动。再安装Zadig&#xff0c;用Zadig工具来安装WinUSB驱动。 zadig下载&#xff1a;Zadig - USB driver installation made easy 记住这两个数…

一站式数据采集物联网平台:智能化解决方案,让数据管理更高效、更安全

JVS物联网平台的定位 JVS是企业信息化的“一站式解决方案”&#xff0c;其中包括了基础的数字化底座、各种企业级能力、企业内常见的应用&#xff0c;如下图所示&#xff1a; 整体平台能力层有三大基础能力&#xff1a; 低代码用于业务的定义;数据分析套件用于数据的自助式分…

蓝桥杯专题 bfs习题详解

1.离开中山路 #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<string> using namespace std; int x1,x2,y1,y2; int n,n1,m1; const int N1010;typedef pair<int,int> PII; queue<PII> q;int …

一站式解决方案:uni-app条件编译及多环境配置,appid动态修改攻略!

前言 这篇文章主要介绍uniapp在Hbuilderx 中&#xff0c;通过工程化&#xff0c;区分不同环境、动态修改小程序appid以及自定义条件编译&#xff0c;解决代码发布和运行时手动切换到问题。 背景 在企业级的应用中&#xff0c;通常会分为&#xff0c;开发、联调、生产等多个环…