详解MyBatis(一)

目录

1.JDBC操作示例回顾

2.什么是MyBatis

3.MyBatis入门

3.1准备工作

3.2配置数据库连接字符串

3.3写持久层代码

 3.4单元测试

​4.MyBatis的基本操作

4.1打印日志

 4.2参数传递


1.JDBC操作示例回顾

我们学习MySQL数据库时 ,已经学习了JDBC来操作数据库, 但是JDBC操作太复杂了.

回顾一下JDBC的操作流程:

1.  创建数据库连接池 DataSource

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

3.  编写要执⾏带? 占位符的 SQL 语句

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

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

6.  使⽤ Statement 执⾏ SQL 语句

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

8.  处理结果集

9.  释放资源

public class JDBCDemo1 {
    public static void main(String[] args) throws SQLException {
        // 假定数据库中有一个 student 表 (id, name), 往里面插入一个数据.
        // 让用户通过控制台来输入学号和姓名.
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学号: ");
        int id = scanner.nextInt();
        System.out.println("请输入姓名: ");
        String name = scanner.next();

        // 1. 创建 "数据源"
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        // 2. 和数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        // 3. 构造 SQL 语句
        String sql = "insert into jdbctest values(?, ?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, id);
        statement.setString(2, name);

        // 4. 执行 SQL 语句. 返回值就是 "这次操作影响到几行"
        int n = statement.executeUpdate();
        System.out.println("n = " + n);

        // 5. 释放必要的资源. 关闭连接.
        statement.close();
        connection.close();
    }
}

查询语句:

// 查询
public class JDBCDemo3 {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要查询的学号: ");
        int studentId = scanner.nextInt();

        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        Connection connection = dataSource.getConnection();

        // 这里同样可以包含一些占位符.
        String sql = "select * from jdbctest where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, studentId);

        // 执行查询操作, 要使用 executeQuery. 返回值是一个 ResultSet 类型的对象. 表示了一个 "表格"
        ResultSet resultSet = statement.executeQuery();

        // 遍历结果集合
        while (resultSet.next()) {
            // 获取到这一行的 学号 列
            int id = resultSet.getInt("id");
            // 获取到这一行的 姓名 列
            String name = resultSet.getString("name");
            System.out.println("id: " + id + ", name: " + name);
        }

        // 释放资源.
        resultSet.close();
        statement.close();
        connection.close();
    }
}

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

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

2.什么是MyBatis

MyBatis 是一个优秀的基于 Java 的持久层框架。 它主要用于将数据库操作与业务逻辑进行解耦,通过将 SQL 语句配置在 XML 文件或注解中,实现对数据库的灵活访问。MyBatis 提供了方便的映射机制,使得开发者可以方便地将数据库中的表与 Java 对象进行关联和操作。它具有简单易用、灵活可配置、性能较高等特点,在 Java 企业级应用开发中被广泛使用。

持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是用来操作数据库的.

3.MyBatis入门

Mybatis操作数据库的步骤:

1.  准备⼯作(创建springboot⼯程、数据库表准备、实体类)

2.  引⼊Mybatis的相关依赖 ,配置Mybatis(数据库连接信息)

3.  编写SQL语句(注解/XML)

4.  测试

3.1准备工作

创建springboot工程 ,并导⼊ mybatis的起步依赖、 mysql的驱动包

Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 以需要添加 MySQL驱动

项⽬工程创建完成后  ⾃动在pom.xml⽂件中 ,导⼊Mybatis赖和MySQL驱动依赖

版本会随着SpringBoot 版本发⽣变化, 无需关注 

        <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>

 数据库表准备:

-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE mybatis_test;
-- 创建表[用户表]
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (
                            `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
                            `username` VARCHAR ( 127 ) NOT NULL,
                            `password` VARCHAR ( 127 ) NOT NULL,
                            `age` TINYINT ( 4 ) NOT NULL,
                            `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
                            `phone` VARCHAR ( 15 ) DEFAULT NULL,
                            `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
                            `create_time` DATETIME DEFAULT now(),
                            `update_time` DATETIME DEFAULT now(),
                            PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
-- 添加用户信息
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

创建对应的实体类UserInfo

import lombok.Data;
import java.util.Date;
@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer delete_flag;
    private Date create_time;
    private Date update_time;
}

3.2配置数据库连接字符串

Mybatis中连接数据库,需要数据库参数配置:MySQL驱动类、登录名、密码、数据库连接字符串

如果是application.yml文件, 配置内容如下:

# 数据库连接配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

注意事项:

如果使用 MySQL 5.x 之前的使⽤的是"com.mysql.jdbc.Driver" ,如果是大于 5.x使用的是“ com.mysql.cj.jdbc.Driver.

 如果是application.properties文件, 配置内容如下:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
#连接数据库的⽤户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456

3.3写持久层代码

在项目中, 创建持久层接口UserInfoMapper

Mapper代码:

@Mapper
public interface UserInfoMapper {
    //查询所有用户
    @Select("select username,'password',age,gender,phone from userinfo")
    public List<UserInfo> queryUser();
}

Mybatis的持久层接⼝规范⼀般都叫XxxMapper   

@Mapper注解:表⽰是MyBatis中的Mapper接口,当在接口上添加@Mapper注解后,MyBatis 会自动为该接口创建一个动态代理实现类,交给Spring的IOC容器管理,将接口中的方法与相应的 SQL 操作进行关联,从而实现数据库访问操作。它主要用于标识这是一个与数据库操作相关的映射接口,简化了 MyBatis 配置文件的编写,使代码结构更加清晰简洁。

 @Select注解:代表的就是select查询 ,也就是注解对应⽅法的具体实现内.

 3.4单元测试

使用Idea 自动生成测试类

在需要测试的Mapper接口中, 右键 -> Generate -> Test

选择要测试的方法,点击OK

src下的test目录下,已经⾃动帮我们创建好了测试类,我们可以直接使⽤这个测试类来进⾏测试

@SpringBootTest
class UserInfoMapperTest {

    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void queryUser() {
        List<UserInfo> list = userInfoMapper.queryUser();
        System.out.println(list);
    }
}

一定要加上@SpringBootTest 注解,加载Spring运行环境

运行结果: 

4.MyBatis的基本操作

4.1打印日志

Mybatis当中我们可以借助日志, 查看到sql语句的执行、执行传递的参数以及执行结果

在application.yml中配置内容如下:

mybatis:
  configuration: # 配置打印 MyBatis⽇志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

application.properties中配置内容如下:

#指定mybatis输出⽇志的位置, 输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

重新运行程序, 可以看到SQL执行内容, 以及传递参数和执行结果:

 4.2参数传递

需求:根据id查找用户,对应的SQL就是:select * from userinfo where id = 

但是SQL语句中的id值不能写成固定数值 需要变为动态的数值 

解决方案:在queryById方法中添加一个参数(id),将方法中的参数传给SQL语句

使用#{}的方式获取方法中的参数

    @Select("select * from userinfo where id=#{id}")
    List<UserInfo> queryById(Integer id);

如果mapper接口方法形参只有⼀个普通类型的参数 #{…} 里面的属性名可以随便写 ,如 #{id}# {value}建议和参数名保持⼀致

 添加测试用例

    @Test
    void queryById() {
        List<UserInfo> list2=userInfoMapper.queryById(4);
        System.out.println(list2);
    }

运行结果:

也可以通过@Param设置参数的别名,但是#{...}里面的属性名必须和@Param设置的一样 

    @Select("select username, `password`, age, gender, phone from userinfo where id=#{userid}")
    UserInfo queryById(@Param("userid") Integer id);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业微信hook接口协议,ipad协议http,一个用户多个标签

一个用户多个标签 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid": "168885xxx599424","userid":0,//用户id"labelid_list":[ //标签id数组0] } 返回示例 {"data…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:公路智能巡检解决方案

项目背景 中国公路网络庞大&#xff0c;总里程超过535万公里&#xff0c;高速公路里程位居世界前列。面对基础设施存量的不断增长&#xff0c;公路养护管理已迈入“建管养并重”的新时代。随着养护支出的逐年攀升&#xff0c;如何提升养护效率、降低管理成本&#xff0c;成为亟…

流媒体服务器SMS-语音对讲(二)

1.简介 上篇文件介绍了流媒体与设备之间可能的交互场景&#xff0c;本文将介绍客户端或者web端与摄像头对讲的总体流程。 老规矩&#xff0c;介绍一下本人的开源流媒体&#xff0c;点个star&#xff0c;有兴趣一起开发的朋友也可以联系本人&#xff1a;https://gitee.com/inyem…

为什么我们需要用到空号检测

为什么需要空号检测 在我们进行群发短信营销和电话营销时&#xff0c;如果不提前对号码库进行空号筛选&#xff0c;那么会影响效率、浪费成本。 SUBMAIL 的空号检测&#xff0c;直接调用运营商的 API 接口进行数据对照&#xff0c;从而让手机号码的检测结果更加可靠。 空号检测…

Vercel deploy- Nextjs project error-URL link-env variable

Vercel deploy- Nextjs project error-URL link-env variable Error Check Database URL Check next-auth URL NEXTAUTH_URLhttps://yourappname.vercel.app/ 依次排查可能性 Application error: a server-side exception has occurred (see the server logs for more in…

sonobe:针对IVC的fold arithmetic电路实例

1. 引言 近日&#xff0c;arnaucube发推宣称 在EVM链&#xff08;Optimistic&#xff09;上验证了首个NovaCycleFold proof&#xff0c;对应开源代码实现见&#xff1a; https://github.com/privacy-scaling-explorations/sonobe&#xff08;Rust Solidity&#xff09; son…

Git基本使用教程(学习记录)

参考文章链接&#xff1a; Git教程&#xff08;超详细&#xff0c;一文秒懂&#xff09; RUNOOB Git教程 Git学习记录 1Git概述 1.1版本控制软件功能 版本管理&#xff1a;更新或回退到历史上任何版本&#xff0c;数据备份共享代码&#xff1a;团队间共享代码&#xff0c;…

大数据的数据采集

大数据采集是指从各种来源收集大量数据的过程&#xff0c;这些数据通常是结构化或非结构化的&#xff0c;并且可能来自不同的平台、设备或应用程序。大数据采集是大数据分析和处理的第一步&#xff0c;对于企业决策、市场分析、产品改进等方面具有重要意义。以下是大数据采集的…

2024 年适用于 Mac 的 5 大免费录屏软件

要成为Mac的优秀屏幕录像机&#xff0c;捕获视频的高清质量和易于操作的界面是两个主要重要因素。此外&#xff0c;Mac上的付费屏幕录像机不仅可以输出高质量的屏幕捕获视频。您也可以在免费的视频捕获软件中获得类似的桌面录制服务。因此&#xff0c;如果您不需要以专业的方式…

Java 异常处理详解(如果想知道Java中有关异常处理的知识点,那么只看这一篇就足够了!)

前言&#xff1a;异常处理是 Java 编程中非常重要的一部分&#xff0c;它能够有效地捕获和处理程序运行中的错误&#xff0c;提高代码的健壮性和可靠性。本文将深入探讨 Java 中异常的概念、体系结构、抛出、解决方式以及如何自定义异常&#xff0c;并结合代码案例进行详细解释…

什么文档加密软件好用?迅软DSE加密软件你不会还不知道吧?

一、什么文档加密软件好用&#xff1f; 其中有迅软DSE文档加密软件等。 迅软DSE加密软件&#xff1a;让企业的创意成果、招投标文件、生产工艺、流程配方、研发成果、公司计划、员工信息等核心数据更安全。 多方面加密模式&#xff0c;有效防止数据泄密 透明无感知加密&…

数据结构C语言版 严蔚敏

下列关于数据的逻辑结构的叙述中&#xff0c;哪一个是不正确的&#xff08;C&#xff09;。 A、数据的逻辑结构是数据间关系的描述B、数据的逻辑结构抽象反映数据元素间的逻辑关系C、数据的逻辑结构具体反映数据在计算机中的存储方式 数据的逻辑结构是从逻辑关系上描述数据&am…

华为云Pass平台微服务治理

华为云Pass平台微服务治理 1. 快速体验 1.1 微服务结构 2. 搭建项目 远程调用 主启动类 RequestSchema指定controller注解并标注控制类名称 3. PASS平台 CSE ServiceComb接入华为云CSE 注意&#xff1a; 当你的接口出现变更&#xff0c;把微服务引擎服务目录重新删除&…

深入理解mysql中的各种超时属性

1. 前言 connectTimeout: 连接超时 loginTimeout: 登录超时 socketTimeout: Socket网络超时&#xff0c;即读超时 queryTimeout: sql执行超时 transactionTimeout:spring事务超时 innodb_lock_wait_timeout:innodb锁等待超时 netTimeoutForStreamingResults:mysql server网络回…

U盘感染病毒,不必急于扔掉!教你如何有效清除U盘中的病毒

U盘被感染了只能扔掉吗&#xff1f;随着信息时代的飞速发展&#xff0c;U盘已成为我们日常生活中不可或缺的存储设备。然而&#xff0c;在使用U盘的过程中&#xff0c;我们有时会遇到U盘被病毒感染的情况。面对这一问题&#xff0c;许多人可能会感到恐慌&#xff0c;甚至想要直…

Ubuntu22.04之解决:terminal使用alt+1/alt+2/alt+3失效问题(二百三十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

UML实现图-组件图

概述 组件图(ComponentDiagram)描述了软件的各种组件和它们之间的依赖关系。组件图中通常包含4种元素:组件、程序、包、任务&#xff0c;各个组件之间还可以相互依赖。 一、组件的表示法 组件是定义了良好接口的物理实现单元&#xff0c;是系统中可替换的物理部件。在一般情…

动物群体甲基化如何讲故事?

DNA甲基化是DNA化学修饰的一种形式&#xff0c;能够在不改变DNA序列的前提下&#xff0c;改变基因表达&#xff0c;从而使表型发生变化。DNA甲基化是一种非常保守的表观遗传修饰&#xff0c;其广泛存在于生物体内&#xff0c;在不同的物种间、相同物种不同环境&#xff0c;同一…

学完PMP,怎么应用到实际工作中?

学习理论知识只是第一步&#xff0c;其目的是为了在实际工作中能够提供帮助。我相信题主的问题也是许多人共同面临的。PMP的知识体系是专业项目管理所必须掌握的知识体系。俗话说&#xff0c;有备无患&#xff0c;具备专业的理论知识就是最好的准备。废话不多说&#xff0c;举几…

使用 zxing 生成二维码以及条形码

需求背景 前期在做项目的时候&#xff0c;有一个需求是说要生成一张条形码&#xff0c;并且呢将条形码插入到 excel 中去&#xff0c;但是之前一直没有搞过找个条形码或者是二维码&#xff0c;最后是做出来了&#xff0c;这里呢就先看看怎么生成&#xff0c;后面再抽时间来写写…