MyBatis数据库查询

news2025/1/16 18:42:00

文章目录

    • 什么是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  //标识当前测试的上下文环境为springboot

class UserMapperTest {

    @Autowired    //注入需要测试的类
    private UserMapper userMapper;

    @Test
    void 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.coloradmin.cn/o/1458792.html

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

相关文章

【Java】eclipse安装JDBC连接MySQL数据库教程

1.下载JDBC 首先在官网中下载JDBC&#xff0c;下载地址&#xff1a;MySQL :: MySQL Connectors 如果无法进入官网可以点击这里下载&#xff1a;https://download.csdn.net/download/weixin_47040861/88855729 进入官网后找到Develop by MySQL一栏&#xff0c;在该栏下找到JDB…

代码随想录算法训练营DAY20 | 二叉树 (8)

一、LeetCode 701 二叉搜索树中的插入操作 题目链接&#xff1a; 701.二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 思路&#xff1a;见缝插针罢辽。 class Solution {public TreeNode insertIntoBST(TreeNode root, i…

数组的左旋和右旋算法

public class Test09 {public static void main(String[] args) {//右旋 数组逆序遍历&#xff0c;将尾部元素&#xff0c;不断交换至头部int[] arr {1,2,3,4,5,6,7,8};for(int i arr.length-1;i>0;i--) { //遍历一次arr[i] arr[i] ^ arr[i-1];arr[i-1] arr[i] ^ arr[i…

【EI会议征稿通知】第九届电子技术和信息科学国际学术会议(ICETIS 2024)

第九届电子技术和信息科学国际学术会议&#xff08;ICETIS 2024&#xff09; The 9th International Conference on Electronic Technology and Information Science&#xff08;ICETIS 2024&#xff09; ICETIS会议始于2016年&#xff0c;先后吸引众多来自国内外高等院校、科…

如何看待Java是一门半编译半解释型的语言(企业真题)

如何看待Java是一门半编译半解释型的语言 解答&#xff1a;可能是解释执行&#xff0c;可能是编译执行

用户空间与内核通信(二)

文章&#xff1a;用户空间与内核通信&#xff08;一&#xff09;介绍了系统调用&#xff08;System Call&#xff09;&#xff0c;内核模块参数和sysfs&#xff0c;sysctl函数方式进行用户空间和内核空间的访问。本章节我将介绍使用netlink套接字和proc文件系统实现用户空间对内…

《白话C++》第10章 STL和boost,Page101 10.4.6 std::weak_ptr

2.基本功能 “柔弱的”weak_ptr专门用来解决上述设计中必须面对的循环指向问题。 weak_ptr并不是真正的智能指针&#xff0c;它必须依附于shared_ptr存在。对应前面的C1、C2&#xff0c;我们写一个弱引用版本的C3和C4的例子&#xff1a; struct C4; struct C3 {~C3(){cout…

社区店运营方案全攻略,助你实现商业梦想

在如今竞争激烈的商业环境中&#xff0c;成功运营一家社区店需要全面的规划和策略。 作为一名在社区开鲜奶吧5年的创业者&#xff0c;我将为你提供一份全面的社区店运营方案攻略&#xff0c;帮助你实现商业梦想。 1、市场调研&#xff1a; 在选择社区店的位置之前&#xff0c…

Java使用Redis实现消息队列

近期刷Java面试题刷到了“如何使用Redis实现消息队列”&#xff0c;解答如下&#xff1a; 一般使用 list 结构作为队列&#xff0c; rpush 生产消息&#xff0c; lpop 消费消息。当 lpop 没有消息的时候&#xff0c;要适当sleep 一会再重试。若不使用sleep&#xff0c;则可以用…

【C++】STL- > string类(超详解!!!)

文章目录 前言1、string类的出现1.1 C语言中的字符串1.2 平时使用 2. 标准库中的string类2.1 string类的常用文档&#xff08;重要&#xff09;&#xff01;&#xff01;&#xff01;&#xff01;2.2 string类的常用接口说明(接口原型我这里就不展示了&#xff0c;文档中都有可…

springcloud-远程调用

微服务的远程调用 RestTemplate 在项目中&#xff0c;当我们需要远程调用一个 HTTP 接口时&#xff0c;我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类。 实例化RestTemplate 创建配置类&#xff0c;实例化RestTemplate Configuration public clas…

ubuntu解决“E: Unable to locate package lrzsz“

今天在ubuntu上安装rzsz包时报错&#xff0c;提示无法定位包&#xff0c;提示如下 出现这个问题是因为apt的源没有更新&#xff0c;我们直接说解决办法 把下面的命令执行一遍即可 sudo add-apt-repository main sudo add-apt-repository universe sudo add-apt-repository re…

【漏洞复现】H3C 路由器多系列信息泄露漏洞

Nx01 产品简介 H3C路由器是一款高性能的路由器产品&#xff0c;具有稳定的性能和丰富的功能。它采用了先进的路由技术和安全机制&#xff0c;可以满足不同用户的需求&#xff0c;广泛应用于企业、运营商和数据中心等领域。 Nx02 漏洞描述 H3C路由器多系列存在信息泄露漏洞&…

“薪”的一年程序员裁员潮技术变革情况下 程序员就业机会在哪里?

引言&#xff1a;一对来自中国的工程师夫妻在美国的不幸身亡&#xff0c;疑似与谷歌的裁员有关&#xff0c;这一事件再次引发了人们对技术变革下裁员对程序员影响的关注。 一、针对裁员潮的一些看法 在我看来&#xff0c;技术变革对程序员的影响是双面的。一方面&#xff0c;…

抛弃chatgpt,使用微软的Cursor提升coding效率

Whats Cursor? Cursor编辑器是一个基于GPT-4的代码编辑器&#xff0c;它可以根据用户的自然语言指令或者正在编辑的代码上下文为用户提供代码建议&#xff0c;支持多种编程语言&#xff0c;如Python、Java、C/C#、go等。Cursor编辑器还可以帮助用户重构、理解和优化代码&…

管式土壤墒情监测仪

TH-GTS04随着农业技术的不断进步&#xff0c;土壤墒情监测在农业生产中的作用越来越突出。管式土壤墒情监测仪作为一种先进的土壤水分测量工具&#xff0c;为农业生产提供了准确、实时的土壤水分数据&#xff0c;为科学决策提供了有力支持。 一、管式土壤墒情监测仪的工作原理…

【力扣 - 二叉树的最大深度】

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 提示&#xff1a; 树中节点的数量在 [0, 10^4] 区间内。 -100 < Node.val < 100方法一&#xff1a;深度优先搜索 思路与算法 如…

Redis第一关之常规用法

简介 Redis不用多说&#xff0c;已经火了很多年了&#xff0c;也用了很多年了。现在做一些归纳总结。 这篇文章主要介绍Redis的常规知识及用法&#xff0c;包括数据结构、使用场景、特性、过期机制、持久化机制。 Redis与Mysql Mysql是一款基于磁盘的关系型SQL数据库。 Redi…

软件实际应用实例分享,门诊电子处方模板制作教程,中西医诊所病历开单系统教程

软件实际应用实例分享&#xff0c;门诊电子处方模板制作教程&#xff0c;中西医诊所病历开单系统教程 一、前言 以下软件教程以 佳易王诊所电子处方软件V17.3为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、在开电子处方的时候&#xff0c…

RocketMQ(五):功能特性——消费管理

1 消费者负载均衡 消费者从Apache RocketMQ获取消息消费时&#xff0c;通过消费者负载均衡策略&#xff0c;可以将主题内的消息分配给指定消费者分组中的多个消费者共同分担&#xff0c;提高消费并发能力和消费者的水平扩展能力。 1.1 背景信息 了解消费者负载均衡策略&#x…