MyBatis数据库查询

文章目录

    • 什么是MyBatis
    • MyBatis程序的创建
    • MyBatis实现数据库查询
      • 传参查询
      • 插入实现
      • 添加操作获取自增ID
      • 删除实现
      • 修改实现
      • #{}和${}
        • SQL注入
      • like查询
    • resultMap和resultType
    • 多表查询

对于普遍的后端开发而言,其程序主要包含了后端主程序和数据库两个部分,用户访问前端页面,前端发送数据给后端程序,后端从数据库中查询用户需要的信息返回给前端,如此即完成了一次完整的数据查询。MyBatis就是一种作为后端程序与数据库连接和交互的工具。

什么是MyBatis

MyBatis是一款支持自定义SQL、存储过程及高级映射的持久层框架。它不同于JDBC操作的繁琐,是通过简单的xml和注解来进行接口或对象的配置和映射,是一种更加简单地用来完成程序和数据库交互的工具。

MyBatis程序的创建

  • 与SpringMVC项目的创建类似,首先需要额外添加MyBatis的框架依赖:在这里插入图片描述
  • 再设置数据库的连接配置:

在application.properties文件中进行数据库的连接信息的配置:
在这里插入图片描述

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

此时,这个MyBatis 程序就可以成功运行了。

  • 再对MyBatis xml文件的存放位置和命名规则进行配置,同样是在application.properties文件中进行 配置:

在这里插入图片描述

MyBatis实现数据库查询

MyBatis作为程序服务层和数据库连接的工具,简单来说由用来给当前类作方法声明的接口和对应的xml文件组成;

  1. 添加实体类

实体类中属性的名称与数据库中的字段名称必须保持一致:

在这里插入图片描述

package com.example.demo.model;import lombok.Data;import java.util.Date;@Data
public class UserInfo {private int id;private String username;private String password;private String photo;private Date createtime;private Date updatetime;private int state;
}
  1. 添加mapper接口
package com.example.demo.mapper;import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface UserMapper {public List<UserInfo> getAll(); 
}

@Mapper注解由MyBatis提供,标明当前类是一个mapper接口,不可以省略;

  1. 添加对应的xml文件

创建一个xml文件,首先写入MyBatis固定的xml格式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"></mapper>

具体mapper的命名空间(包名+接口类)需要根据实际代码进行修改;

  1. 在xml文件中实现SQL
    在这里插入图片描述
    在这里插入图片描述
  2. 使用单元测试进行验证

数据库查询结果:
在这里插入图片描述

单元测试:

package com.example.demo.mapper;import com.example.demo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest  //标识当前测试的上下文环境为springbootclass UserMapperTest {@Autowired    //注入需要测试的类private UserMapper userMapper;@Testvoid getAll() {//实现测试代码List<UserInfo> list=userMapper.getAll();for (UserInfo user:list){System.out.println(user.toString());}}
}

mybatis查询数据库结果:
在这里插入图片描述

传参查询

在这里插入图片描述

添加@Param注解,可以增强代码的跨平台性;
在这里插入图片描述
xml文件中的SQL语句实现,参数的格式需要特别注意;

使用单元测试进行验证:

在这里插入图片描述

当@Param注解中的参数与实体类的属性名称不同时,xml文件中SQL语句的参数与@Param注解中的保持一致;

插入实现

在这里插入图片描述
在这里插入图片描述

除查询外,增删改默认返回的是受影响的行数;

在这里插入图片描述
通过数据库查询验证:

在这里插入图片描述

添加操作获取自增ID

在这里插入图片描述

在这里插入图片描述

useGeneratedKeys得到数据库内部生成的
主键;
keyColumn设置生成的键在数据表中的列名;
keyProperty指定唯一识别对象的属性

单元测试:

在这里插入图片描述

删除实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以进一步在数据库中验证:
在这里插入图片描述

#{}和${}

在xml文件中实现SQL语句时,可以使用#{}和${}两种参数占位符;

#{}代表预编译处理,即MyBatis在处理占位符处的参数时,是将#{}替换为?符号,后使用 PreparedStatement的set方法来赋值;
$ {}代表字符的直接替换,即直接将${}替换成变量的值;

在这里插入图片描述
在这里插入图片描述

两种占位符各有优缺;
#{}预编译处理的方式在遇到像上面这种直接替换的字符串时,会给传递的值添加单引号,无法完成查询;
$ {}直接替换的方式则是有可能会带来越权查询和操作数据的问题,带来一些安全问题;

SQL注入

SQL注入是一种常见的网络攻击方式,它是利用数据库查询的bug,通过SQL语句来实现对数据的无差别查询;

在这里插入图片描述
在这里插入图片描述

用于查询的字段,更推荐使用#{}预编译的处理方式;

like查询

在这里插入图片描述

如果使用上面两种占位符的方式进行模糊查询:

在这里插入图片描述

预编译的方式程序会出现报错,直接替换的方式可以查询成功,但不安全。因此可以考虑使用mysql的内置函数concat来查询;

在这里插入图片描述

resultMap和resultType

resultType是对查询的对象的返回类型进行设置,大多数场景使用resultType就可以;resultMap则是当数据库的字段名与程序的属性名不一致时,使用该标签就可以进行配置;

在这里插入图片描述
在这里插入图片描述

多表查询

在这里插入图片描述
首先需要在主表添加需要查询的连接表的属性:

在这里插入图片描述
定义查询方法和查询语句:
在这里插入图片描述
得到查询结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch查询报错 Result window is too large

一现象&#xff1a; es数据分页查询前端提示系统异常&#xff0c;后端报错日志 二根本原因&#xff1a; 默认情况下&#xff0c;Elasticsearch 限制了 from size 参数的组合不能超过 10,000 条记录&#xff0c;用于防止查询大数据集时对系统资源的过度消耗 三解决办法&#…

鸿蒙开发 之 工具安装和环境搭建

DevEco Studio 面向HarmonyOS应用及元服务开发者提供的集成开发环境(IDE)&#xff0c; 助力高效开发。 ArkTS 语言 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&…

并发List、Set、ConcurrentHashMap底层原理

并发List、Set、ConcurrentHashMap底层原理 ArrayList: List特点&#xff1a;元素有放入顺序&#xff0c;元素可重复 存储结构&#xff1a;底层采用数组来实现 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Clon…

AUTOSAR CP--chapter7从CAN网络学习Autosar通信

从CAN网络学习Autosar通信 前言缩写词CAN通信在AUTOSAR架构中的传输上位机配置 第六章总结&#xff1a;学习了如何使用工具的自动配置功能&#xff0c;位我们生成系统描述中部分ecu的BSW模块配置&#xff0c;但是自动配置的功能虽然为我们提供了极大的便利&#xff0c;我们仍然…

树与二叉树

树与二叉树 文章目录 树与二叉树一、树的概念及结构1.、树的概念2、树的相关概念1.3 树的表示 二、二叉树1.概念2、特殊的二叉树3、二叉树的性质4、二叉树的存储结构 三、二叉树的顺序结构及实现1、二叉树的顺序结构2、堆的概念及结构3、堆的实现 四、二叉树链式结构的实现1、遍…

JAVA--异常处理

目录 1. 异常概述 1.1 什么是生活的异常 1.2 什么是程序的异常 1.3 异常的抛出机制 1.4 如何对待异常 2. Java异常体系 2.1 Throwable 2.2 Error 和 Exception 2.3 编译时异常和运行时异常 3. 常见的错误和异常 3.1 Error 3.2 运行时异常 3.3 编译时异常 4. 异常…

【LeetCode每日一题】单调栈 581. 最短无序连续子数组

581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入&am…

php实现讯飞星火大模型3.5

前期准备 vscode下载安装好 composer下载安装好 php环境安装好 &#xff08;以上可以自行网上查阅资料&#xff09; 开始实现 1.注册讯飞星火用户&#xff0c;获取token使用 讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞 2.修改对应php文件中的key等 可以参考…

FL Studio21中文版本混音功能介绍

FL Studio 21的混音功能是其音乐制作能力中不可或缺的一部分&#xff0c;它为用户提供了强大的工具&#xff0c;以便他们可以对音轨进行细致的调整&#xff0c;确保音乐作品的最终呈现效果达到最佳。 FL Studio 21 Win-安装包下载如下: https://wm.makeding.com/iclk/?zonei…

修复 Android 手机陷入恢复模式的 5 种方法

您的手机卡在 Android Recovery 模式且无法退出此模式&#xff1f;无论您按什么按钮组合&#xff0c;甚至在取出并重新插入电池后重新启动手机&#xff0c;手机都会启动回到恢复模式吗&#xff1f; Android卡在recovery模式的情况并不罕见&#xff0c;各种品牌的Android手机都…

Stable Diffusion 绘画入门教程(webui)-lora

通过前边的文章&#xff0c;相信大家已经能够自己产出好看的小姐姐或者小哥哥了&#x1f923; 不知道有没有发现每次生成的脸、身材、衣服、环境、风格等等可能都会有所差异&#xff0c;那么如果这个问题不解决&#xff0c;实用性将大大降低&#xff0c;因此lora诞生了。 文章…

unity学习(28)——登录功能

有之前注册的知识&#xff0c;登录就很容易处理了。 登陆成功返回id&#xff1a; 登录失败返回null&#xff1a; 测试同一账号不能重复登陆&#xff01;登录成功后最好可以跳到新的场景中 结果是好的&#xff0c;去服务器看一下对应部分的代码&#xff0c;可见&#xff0c;登…