JavaWeb学习路线(5)——MyBatis

news2024/11/23 20:56:22

准备工作:JDBC

  • 概念: JDBC(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API。
  • JDBC使用数据库的五大步骤
//步骤一:注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");

//步骤二:获取连接对象
String url = "jdbc:mysql://localhost:3306/mybatis";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url,username,password);

//步骤三:获取执行对象,执行sql并返回结果
String sql = "select * from user";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);

//步骤四:封装结果数据
List<User> userList = new ArrayList<>();
while(resultSet.next()){
	....
}

//步骤五:释放资源
statement.close();
connection.close();

一、Mybatis概述

(一)概念: MyBatis是一款优秀的 持久层 框架,用于优化JDBC的开发。
(二)官网: https://mybatis.org/mybatis-3/zh/index.html


二、MyBatis基本使用

(一)准备工作: (例如创建Maven工程,数据库表,实体类等)

1、创建Maven工程

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zengoo</groupId>
    <artifactId>springboot-mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-mybatis</name>
    <description>springboot-mybatis</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

<!--        上一个mysql版本号-->
<!--        <dependency>-->
<!--            <groupId>mysql</groupId>-->
<!--            <artifactId>mysql-connector-java</artifactId>-->
<!--            <scope>runtime</scope>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、数据库表

start transaction ;

create table user
(
    id int unsigned unique auto_increment primary key,
    name varchar(100),
    age tinyint unsigned,
    gender tinyint unsigned,
    phone varchar(11)
);

insert into user(name, age, gender, phone)
VALUES('xu',18,0,15385896741)
     ,('hu',19,1,18579563487)
     ,('yu',23,1,17858426389)
     ,('chi',21,0,13947456825)
     ,('qian',20,1,17855963541);

commit ;
rollback ;

3、实体类


public class User {

    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;

    public User() {
    }

    public User(Integer id, String name, Short age, Short gender, String phone) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", phone='" + phone + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Short getAge() {
        return age;
    }

    public void setAge(Short age) {
        this.age = age;
    }

    public Short getGender() {
        return gender;
    }

    public void setGender(Short gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

(二)添加依赖并配置数据库信息: MyBatis Framework 以及 MySQL Driver

添加依赖

在这里插入图片描述
在resource/application.properties配置文件中,填写数据库配置信息

#数据库连接四要素
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_mybatis
spring.datasource.username=root
spring.datasource.password=123456

(三)编写SQL语句(注解/XML)

方式一:注解形式


@Mapper //通知IOC容器进行管理,自动生成代理对象
public interface UserMapper {
    //查询全部信息
    @Select("select * from user")
    List<User> list();
}

(四)数据库连接池

1、概念: 数据库连接池是一个容器,负责分配、管理数据库连接(Connection)。

2、作用: 为应用程序提供现有的数据库连接,释放空闲时间超过最大预设时间的连接,最大程度减少系统资源开销。

3、优势:

  • 资源可重用
  • 提升响应速度
  • 避免数据库连接遗漏

4、常用数据库连接池

  • 标准接口:DataSource
  • 功能:获取连接 Connection getConnection() throws SQLException;
  • 常见连接池:C3P0 (不常用)、DBCP (不常用)、Druid (常用连接池)、Hikari (springboot 默认)

5、Druid连接池

  • 概念:Druid连接池是阿里巴巴开源的数据库连接池项目,其功能强大,性能优秀。
  • 使用连接池:引入Druid连接池依赖即可。

(五)Lombok工具包

  • **概念:**是一个使用的Java类库,能通过注解的形式自动生成构造器,getter/setter,equals,hashcode,toString等方法,并可以自动化生成日志变量,简化Java开发,提高开发效率。
  • 注解表
注解说明
@Getter/@Setter为所有属性提供get/set方法
@ToString给类自动生成易读的toString方法
@EqualsAndHashcode根据类所拥有的非静态字段自动重写equals方法和hashCode方法
@Data提供以上三种方法
@NoArgsConstructor生成无参构造器
@AllArgsConstructor生成非静态变量有参构造器
  • 使用lombok工具类: 添加lombok依赖,添加注解即可。
@Data
@NoArgsConstructor
@AllArgsConstructor
class 实体类{
	成员变量....
	成员方法....
}

三、MyBatis动态SQL

(一)XML映射文件

1、规范

  • XML映射文件名必须与Mapper接口名一致,并且将XML映射文件和Mapper放置在同包下(同包同名)
  • XML映射文件的namespace属性与Mapper接口的绝对路径一致。
  • XML映射文件的sql语句的id与mapper接口下的方法名一致,并保持返回类型一致。

2、使用

Mapper接口

public interface EmpMapper{
	List<Emp> list(String name,Short gender, LocalDate begin, LocalDate end);
}

映射XML

<mapper namespace="xxx.xxx.xxx.EmpMapper">
	<select id="list" resultType="xxx.xxx.xxx.Emp">
		select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc
	</select>
</mapper>

3、快速定位XML映射文件

IDEA编辑器中安装MyBatisX插件

(二)动态SQL

1、概念: 随着用户的输入或外部条件的变化而变化的SQL语句,我们称为 动态SQL

2、动态SQL标签

  • <if test=“xxxxx”> : 用于判断条件是否成立。test属性用于填写判断条件,若为true,则拼接SQL语句
  • <where>: 只会在子元素含有内容时才会显示在自动忽略省略多余的拼接词 and / or
  • <set>: 只会在子元素含有内容时才会显示在自动忽略省略多余的逗号
  • <foreach collection=“xxx” item=“item” separator=“,” open=“(” close=“)”>: 用于循环SQL参数,collection 表示遍历集合,item 表示遍历的元素,separator 表示遍历分隔符,open 表示遍历开始前拼接的字符,close 表示遍历结束后拼接的字。
  • <sql id=“xxxx”>: 声明存储复用sql片段。
  • ** <include refid=“xxxx”>:** 用于引用sql片段

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

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

相关文章

手机App弹窗的常用测试点

手机App弹窗是目前流行的一种内容展示形式&#xff0c;根据内容性质可以划分为消息、通知、广告、营销等等&#xff0c;展现形式也比较多变&#xff0c;刚上手测试特容易手忙脚乱&#xff0c;为了帮助新人能够快速入门&#xff0c;笔者在此将弹窗常见的测试点一一进行罗列&…

「网络编程」第二讲:网络编程socket套接字(三)_ 简单TCP网络通信程序的实现

「前言」文章是关于网络编程的socket套接字方面的&#xff0c;上一篇是网络编程socket套接字&#xff08;二&#xff09;&#xff0c;下面开始讲解&#xff01; 「归属专栏」网络编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」「每篇一句」 I do…

maven-mvnd搞起来

maven-mvnd是Apache Maven团队借鉴了Gradle和Takari的优点&#xff0c;衍生出来的更快的构建工具&#xff0c;maven的强化版&#xff01; maven-mvnd 在设计上&#xff0c;使用一个或多个守护进程来构建服务&#xff0c;以此来达到并行的目的&#xff01;同时&#xff0c;mave…

FreeRTOS 创建任务

例子&#xff1a;创建一个任务&#xff0c;并在任务里面翻转LED 灯 1. 函数原型 BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,const char * const pcName,const uint16_t usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreat…

STM32的定时器详解(嵌入式学习)

STM32的定时器详解 0. 前言1. Systick定时器概念工作原理时钟基准Systick练习 2. HAL_Delay函数分析3. 定时器基本概念定时器分类定时器组成计数器自动重装寄存器预分频器 定时器计数原理定时器练习 4. 软件定时器概念设计思想代码 0. 前言 想要了解STM32的时钟系统 点击这里跳…

【数据分享】1929-2022年全球站点的逐日平均风速数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

考上了!成为图技术大师的第一步!

好消息&#xff01;&#xff01; 自创邻科技GBCA课程开设以来 截至6月20日 已有近20名学员通过考试 获得GBCA认证证书&#xff01; 距离成为图技术认证专家 跨出关键一步&#xff01; 前不久&#xff0c;创邻科技为了让更多图技术爱好者能够快速了解、上手图数据库&#xff0c…

【一些随笔】艰难存折,恨不睡觉:大话年轻人的钱包囧境与梦想退休

一些随笔 1️⃣ 存钱难吗&#xff1f;难&#xff01;它难在哪&#xff1f;2️⃣ 关于年轻人如何攒钱理财的一点建议3️⃣ 关于裸辞的一些经验及看法4️⃣ 谁又不想攒够钱了提前退休呢&#xff1f;但要存够多少呢&#xff1f; 1️⃣ 存钱难吗&#xff1f;难&#xff01;它难在哪…

【HISI IC萌新虚拟项目】ppu模块基于spyglass的lint清理环境搭建与lint清理

关于整个虚拟项目,请参考: 【HISI IC萌新虚拟项目】Package Process Unit项目全流程目录_尼德兰的喵的博客-CSDN博客 前言 RTL代码在交付给验证同时进行功能验证时,可以同步进行lint的清理工作。一般而言影响编译和仿真的问题会在vcs的error和warning中被修正,因此清理lin…

[RocketMQ] Broker启动流程源码解析 (二)

文章目录 1.Brocker介绍2.BrokerStartup启动入口3.createBrokerController创建BrokerController3.1 创建各种配置类3.2 创建broker控制器3.3 初始化broker控制器3.3.1 加载配置文件3.3.2 创建消息存储对象MessageStore3.3.3 Load加载恢复消息文件3.3.4 初始化Broker通信层3.3.5…

知道了,去卷后端 →「Nest.js 入门及实践」:)

为什么学习 Nest &#xff1f; 前端已 &#x1f648;&#xff0c;去卷后端 &#x1f412; → 广度和深度的问题&#xff0c;不可代替性仅前端开发的应用没有记忆&#xff0c;不能互联 &#x1f914; → 学习后端&#xff0c;为应用赋能同为 JS 语言&#xff0c;学习成本较小&a…

EALLOW和EDIS指令的使用

1.EALLOW与EDIS 汇编指令 #define EALLOW __asm("EALLOW") #define EDIS __asm("EDIS") #define ESTOP0 __asm("ESTOP0")EALLOW(Edit allow)&#xff1a;防止cpu错误地写保护&#xff0c;ST1状态寄存器的EALLOW位显示是否允许写&#xff0c;0…

手机蓝牙功能测试点大全,都帮你总结好了

蓝牙是现在智能设备上一个必不可少的模块&#xff0c;支持大容量的近距离无线通信&#xff0c;典型的传输距离是10米左右&#xff0c;通过增加发射功率可达到100米&#xff0c;支持多链接&#xff0c;安全性高。 蓝牙工作在2.4GHZ的 ISM频段上&#xff0c;采用跳频扩谱技术避免…

微信小程序开发公司,小程序接单

小程序开发接单&#xff0c;公司开发&#xff0c;售后有保障&#xff0c;专属售后群对接&#xff0c;1对1 服务&#xff0c;下面是一些常见的小程序&#xff0c;全行业小程序都可开发 1.商城小程序 商城小程序是一种集购物、支付、订单管理等多种功能于一体的应用程序。为了使…

【使用OpenFeign在微服务中进行服务间通信】—— 每天一点小知识

&#x1f4a7; 使用 O p e n F e i g n 在微服务中进行服务间通信 \color{#FF1493}{使用OpenFeign在微服务中进行服务间通信} 使用OpenFeign在微服务中进行服务间通信&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微…

Python | cx_Oracle | DPI-1047报错处理(Win\Mac\Linux)

文章目录 Python | cx_Oracle | DPI-1047报错处理&#xff08;Win\Mac\Linux)测试代码报错信息解决步骤 Python | cx_Oracle | DPI-1047报错处理&#xff08;Win\Mac\Linux) 测试代码 import cx_Oracle# 建立与 Oracle 数据库的连接 connection cx_Oracle.connect("{lo…

【Redux】redux的使用详解

Redux的使用详解 Redux的核心思想 理解纯函数 1. 为什么要使用redux JavaScript开发的应用程序&#xff0c;已经变得越来越复杂了&#xff1a; JavaScript需要 管理的状态越来越多&#xff0c;越来越复杂&#xff1b;这些状态包括&#xff1a;服务器返回的数据、缓存数据、用户…

精细运营、数据赋能、生态联动…银行大零售数字化转型攻略

当前我国银行业的内外部环境正在发生深刻的变化&#xff0c;数字化转型已经成为行业的普遍共识。尤其在银行大零售数字化转型的过程中&#xff0c;各家银行差异性较大&#xff0c;虽然都开始突破传统零售模式&#xff0c;但仍面临一些共性的挑战&#xff0c;比如缺乏科学的顶层…

Java设计模式——装饰者模式

装饰者模式 一、概述 装饰者模式&#xff08;装饰器模式&#xff09;是一种结构型模式 定义&#xff1a; 在不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些额外职责&#xff08;功能&#xff09;的模式。 装饰者&#xff08;Decorator&#xff09;模式中的…

8年测试老鸟整理,接口自动化测试mock总结,这些你会多少?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Mock原理/实现机制…