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.mzph.cn/news/691941.shtml

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

相关文章

C/C++ BM11 链表相加(二)

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 总结 前言 这道题使用链表来实现加法运算&#xff0c;主要是涉及到数据对位以及加法进位的处理。 题目 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0…

使用C# Net6连接国产达梦数据库记录

达梦官网&#xff1a;http://www.dameng.com/ 1 下载达梦并进行安装 下载地址&#xff1a;官网首页——服务与合作——下载中心&#xff08;https://www.dameng.com/list_103.html&#xff09; 根据需要自行下载需要的版本&#xff0c;测试版本为&#xff1a;x86 win64 DM8版…

微信商户平台:如何查看超级管理员

如果有普通员工身份&#xff0c;可以登录 https://pay.weixin.qq.com/index.php/core/account/info 扫码进入后&#xff0c;进入菜单&#xff1a;账户中心》商户信息&#xff0c; 即可看到超级管理员的信息。

Windows 重启 explorer 的正确做法

目录 一、关于 Restart Manager 二、重启管理器实例 三、完整实现代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details/136179191。 我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者…

VsCode指定插件安装目录

VsCode指定插件安装目录 VsCode安装的默认目录是在用户目录(%HomePath%)下的.vscode文件夹下的extensions目录下&#xff0c;随着安装插件越来越多会占用大量C盘空间。 指定VsCode的插件目录 Vscode安装目录&#xff1a; D:\Microsoft VS Code\Code.exeVscode插件安装目录&a…

算法沉淀——递归(leetcode真题剖析)

算法沉淀——递归 01.汉诺塔问题02.合并两个有序链表03.反转链表04.两两交换链表中的节点05.Pow(x, n) 递归是一种通过调用自身的方式来解决问题的算法。在递归算法中&#xff0c;问题被分解为更小的相似子问题&#xff0c;然后通过对这些子问题的解进行组合来解决原始问题。递…

实现VLAN间通信以太网链路聚合与交换机堆叠、集群华为ICT网络赛道

10.实现VLAN间通信 10.1.使用路由器实现VLAN间通信 使用路由器物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。 路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access. 路由器的一个物理接口作为一…

跨境电商无货源如何实现自动化对接1688货源商品上架?1688商品采集API来帮你

阿里巴巴集团旗下的B2B电子商务网站&#xff0c;提供海量优质商品&#xff0c;为采购商和供应商提供交流、合作、采购等服务&#xff0c;是很多没有货源优势的电商卖家首选的货源途径&#xff0c;也是国内最大、货源种类最齐全的货源网站。 不少做跨境电商无货源的朋友都想要直…

优思学院|精益思想如何识别价值流?【案例分析】

精益思想是一种为了提高效率、减少浪费的管理哲学&#xff0c;精益思想强调在整个生产过程中识别并消除一切不创造价值的步骤。 价值流分析是精益思想中的一个核心概念&#xff0c;通过深入分析特定产品从原材料到最终交付给顾客的全过程&#xff0c;来识别并削减浪费&#xf…

Win11专业版安装集成了谷歌框架的安卓子系统,包含谷歌商店

1.摘要 上一篇博客讲述了使用微软商店安装安卓子系统的教程 https://blog.csdn.net/RudeTomatoes/article/details/135958882 上述方法的优点是安装过程简单&#xff0c;但是&#xff0c;由于Windows安卓子系统是微软与亚马逊联合开发&#xff0c;默认没有安装谷歌框架。我尝试…

Pytorch框架-----torch.tensor(创建张量)

文章目录 前言一、torch.Tensor二、构建tensor1.从Python的list或序列构建2.空张量3.索引和切片来获取和修改一个张量tensor中的内容 前言 torch.Tensor 是包的核心类。如果将其属性 .requires_grad 设置为 True&#xff0c;则会开始跟踪针对 tensor的所有操作。完成计算后&am…

学习总结19

# 奶牛的耳语 ## 题目描述 在你的养牛场&#xff0c;所有的奶牛都养在一排呈直线的牛栏中。一共有 n 头奶牛&#xff0c;其中第 i 头牛在直线上所处的位置可以用一个整数坐标 pi(0< pi < 10^8) 来表示。在无聊的日子里&#xff0c;奶牛们常常在自己的牛栏里与其它奶牛交…

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用&#xff1a;避免写一大堆的import&#xff0c;比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

Python学习-用Python设计第一个游戏

三、用Python设计第一个游戏 1、新建文件 使用IDLE的编辑器模式&#xff0c;新建一个文件&#xff0c;点击File—>New File 2、将下面的游戏代码敲入进去 """用Python设计第一个游戏"""temp input("不妨猜一下小甲鱼现在心里想的是…

微软和OpenAI将检查AI聊天记录,以寻找恶意账户

据国外媒体报道&#xff0c;大型科技公司及其附属的网络安全、人工智能产品很可能会推出类似的安全研究&#xff0c;尽管这会引起用户极度地隐私担忧。大型语言模型被要求提供情报机构信息&#xff0c;并用于帮助修复脚本错误和开发代码以侵入系统&#xff0c;这将很可能会成为…

Vue的个人笔记

Vue学习小tips ctrl s ----> 运行 alt b <scrip> 链接 <script src"https://cdn.jsdelivr.net/npm/vue2.7.16/dist/vue.js"></script> 插值表达式 指令

提升生产3D渲染效率与品质:挖掘渲染农场的潜力

在当今数字化时代&#xff0c;3D渲染已成为跨越多个领域不可缺少的技术&#xff0c;无论是在建筑视觉化、电影制作、互动媒体还是虚拟现实领域。随着对动态、逼真视觉效果的需求不断增长&#xff0c;3D渲染农场因其出色的运算能力和经济性成为行业中的关键解决方案。本篇文章旨…

《Solidity 简易速速上手小册》第3章:Solidity 语法基础(2024 最新版)

文章目录 3.1 变量和类型3.1.1 基础知识解析详细解析变量类型深入数据类型理解变量可见性 3.1.2 重点案例&#xff1a;创建一个简单的存储合约案例 Demo&#xff1a;编写一个简单的数字存储合约案例代码&#xff1a;SimpleStorage.sol在 Remix 中进行交互&#xff1a;拓展操作&…

数据分析案例-2023年TOP100国外电影数据可视化

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

MATLAB环境下使用二维高分辨时频分析方法提取波状分量

MATLAB环境下使用二维高分辨时频分析方法提取波状分量&#xff08;分离混合地震数据&#xff09;。 为了得到更高的时频分辨率&#xff0c;近年来涌现出了大量的新的时频分析方法。有些以线性和非线性时频分析为基础&#xff0c;有些则另辟蹊径&#xff0c;比如Hilbert-Huang变…