使用MyBatis(2)
目录
一、定义接口、实体类、创建XML文件实现接口)
二、MyBatis的增删改查
🍅1、MyBatis传递参数查询
🎈写法一
🎈写法二
🎈两种方式的区别
🍅2、删除操作
🍅3、根据id修改用户名
🍅4、添加用户操作
🎈返回受影响的行数
🎈返回自增id
🍅5、like查询
🍅6、多表查询
三、注意
🍅1、mybatisx插件报错
🍅2、数据回滚
🍅 3、查询某字段结果为null时
一、定义接口、实体类、创建XML文件实现接口)
注意包名:
实体类
package com.example.demo.model;import lombok.Data;import java.time.LocalDateTime;@Data
public class UserInfo {private int id;private String username;private String password;private String photo;private LocalDateTime updatatime;private LocalDateTime createtime;private int state;}
接口
package com.example.demo.dao;import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper //数据持久层的标志
public interface UserMapper {List<UserInfo> getAll();
}
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.dao.UserMapper">
<!-- id是UserMapper的方法名--><select id="getAll" resultType="com.example.demo.model.UserInfo">
-- 不写分号select * from userinfo</select>
</mapper>
二、MyBatis的增删改查
🍅1、MyBatis传递参数查询
🎈写法一
@Param("id")与${id}相互匹配 (及时执行)
使用id去查询某条数据(传参数)
UserInfo getUserById(@Param("id") Integer uid);
-- 这里应该写${id},而不是uid
<select id="getUserById" resultType="com.example.demo.model.UserInfo">select * from userinfo where id=${id}</select>
测试类:
@Testvoid getUserById() {UserInfo userInfo = userMapper.getUserById(1);System.out.println(userInfo.toString());}
🎈写法二
@Param("id")与#{id}相互匹配 (预执行)
<select id="getUserById" resultType="com.example.demo.model.UserInfo">select * from userinfo where id=#{id}</select>
🎈两种方式的区别
1.${}是直接替换;而#{}是预执行
2.使用${}是不安全的,存在SQL注入;而#{}是安全的,不存在SQL注入
3.${}使用场景:当业务需要传递SQL语句时,只能使用${},不能使用#{}。
SQL注入:将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的sql服务器加以解析和执行。
🍅2、删除操作
UserInfo getUserById(@Param("id") Integer uid);
<!-- delete操作不需要设置返回类型--><delete id="delById">delete from userinfo where id=#{id}</delete>
测试类
@Transactional //数据回滚:使用该注解,会执行下面操作,但是不会真的操作数据库中的内容@Testvoid testGetUserById() {int id = 1;UserInfo result = userMapper.getUserById(id);System.out.println("受影响的行数:"+result);}
🍅3、根据id修改用户名
// 根据id修改用户名
// 返回受影响行数int update(UserInfo userInfo);
<!-- 默认返回受影响的行数,不需要设置resultType--><update id="update" >update userinfo set username=#{username} where id=#{id}</update>
@Transactional@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setUsername("管理员");int result = userMapper.update(userInfo);System.out.println("受影响行数"+ result);}
运行结果:

🍅4、添加用户操作
🎈返回受影响的行数
//返回受影响字段
int add(UserInfo userInfo);
<insert id="add">insert into userinfo(username,password,photo)
values (#{username},#{password},#{photo})</insert>
//测试类
@Testvoid add() {UserInfo userInfo = new UserInfo();userInfo.setUsername("张三");userInfo.setPassword("11111");userInfo.setPhoto("/image/default.png");int result = userMapper.add(userInfo);System.out.println("受影响的行数:"+ result);}
运行结果:
🎈返回自增id
int insert(UserInfo userInfo);
<insert id="insert" useGeneratedKeys="true" keyColumn="id" keyProperty="id">insert into userinfo(username,password,photo) values (#{username},#{password},#{photo})</insert>
//测试类
@Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("李四");userInfo.setPassword("111111");userInfo.setPhoto("");int result = userMapper.insert(userInfo);System.out.println("受影响的行数:" + result +"| id:"+ userInfo.getId());}
运行结果:
对应关系:
🍅5、like查询
List<UserInfo> getListByLike(@Param("username")String username);
<select id="getListByLike" resultType="com.example.demo.model.UserInfo">select * from userinfo where username like concat('%',#{username},'%')</select>
@Testvoid getListByLike() {String username = "三";List<UserInfo> list = userMapper.getListByLike(username);System.out.println(list);}
运行结果:

🍅6、多表查询
使用注解将sql语句和接口连接起来。
之前是,写一个接口就要写一个对应的xml文件编写sql语句。现在可以不使用这种方法
可以直接在接口中通过注解编写查询语句:
@Mapper
public interface ArticleMapper{@Select("select a.*,u.username from articleinfo a" +"left join userinfo u on a.uid=u.id")List<Articleinfo> getAll();
}
测试类:
class ArticleMapperTest {@Autowiredprivate ArticleMapper articleMapper;@Testvoid getAll() {List<Articleinfo> list = articleMapper.getAll();System.out.println(list);}
}
三、注意
🍅1、mybatisx插件报错

以上并非系统报错,而是插件在报错,告诉我们没有设置返回的技术类型,高版本的idea遇到这种情况运行是不会报错的。
🍅2、数据回滚
@Transactional //数据回滚:使用该注解,会执行下面操作,但是不会真的操作数据库中的内容
🍅 3、查询某字段结果为null时
原因是:实体类中的属性和数据库表中的字段名不一致。
解决方案:
1.将实体类中的属性和表中的字段名保持一致(最简单的解决方案)
2.使用sql语句中的as进行列名(字段名)重命名,让列名(字段名)等于属性名
<!-- 加入要查询的字段名应该是name,对name进行重命名 --> <selet id="getUserById" resultType="com.example.demo.model.UserInfo">select username as name from userinfo where id=#{id}c</select>3.定义一个resultMap,将属性名和字段名进行手动映射
resultMap放入mapper.xml的<mapper></mapper>中
<resultMap id="UserMapper" type="com.example.demo.model.UserInfo"><id column="id" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result></resultMap> <select id="getUserById" resultMap="BaseMap">select * from userinfo where id=#{id}</select>以下是对应关系:尽量把全部属性映射上,否则多表查询时可能会报错。
上图有个错误!!! colum是表里面的字段名,property是实体类里的属性,写反了。
相关文章:
使用MyBatis(2)
目录 一、定义接口、实体类、创建XML文件实现接口) 二、MyBatis的增删改查 🍅1、MyBatis传递参数查询 🎈写法一 🎈写法二 🎈两种方式的区别 🍅2、删除操作 🍅3、根据id修改用户名 &#x…...
【FPGA/D6】
2023年7月25日 VGA控制器 视频23notecodetb 条件编译error时序图保存与读取??RGBTFT显示屏 视频24PPI未分配的引脚或电平的解决方法 VGA控制器 视频23 note MCU单片机 VGA显示实时采集图像 行消隐/行同步/场同步/场消隐 CRT:阴极射线管 640…...
【WebGIS实例】(10)Cesium开场效果(场景、相机旋转,自定义图片底图)
效果 漫游效果视频: 【WebGIS实例】(10)Cesium开场效果(场景、相机 点击鼠标后将停止旋转并正常加载影像底图: 代码 可以直接看代码,注释写得应该比较清楚了: /** Date: 2023-07-28 16:21…...
【Spring】IOC的原理
一、 IOC 的概念 Spring 的 IOC ,即控制反转,所谓控制反转 —— 本来管理业务对象(bean)的操作是由我们程序员去做的,但是有了 Spring 核心容器后,这些 Bean 对象的创建和管理交给我们Spring容器去做了&am…...
AI加速游戏开发 亚马逊云科技适配3大场景,打造下一代游戏体验
随着疫情的消散,中国游戏产业正在快速前进。在伴随着游戏产业升级的同时,整个行业都在面临着新的挑战与新的诉求。亚马逊云科技游戏研发解决方案和服务,覆盖端到端3大场景,为游戏公司与游戏开发人员赋能。 场景1:AI辅助…...
C++ | 继承(基类,父类,超类),(派生类,子类)
文章参考:https://blog.csdn.net/war1111886/article/details/8609957 一 .继承中的访问权限关系 1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类. 2…...
Commands Of Hadoop
序言 持续整理下常用的命令cuiyaonan2000163.com Command 文件拷贝 当从多个源拷贝时,如果两个源冲突,distcp会停止拷贝并提示出错信息,. 如果在目的位置发生冲突,会根据选项设置解决。 默认情况会跳过已经存在的目标文件&am…...
SQL-每日一题【620.有趣的电影】
题目 某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。 作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片…...
linux 精华总结
...
Eureka 学习笔记2:客户端 DiscoveryClient
版本 awsVersion ‘1.11.277’ DiscoveryClient # cacheRefreshTask // 配置shouldFetchRegistry if (clientConfig.shouldFetchRegistry()) {// 配置client.refresh.intervalint registryFetchIntervalSeconds clientConfig.getRegistryFetchIntervalSeconds();// 配置expB…...
okhttp原理分析
工程目录图 请点击下面工程名称,跳转到代码的仓库页面,将工程 下载下来 Demo Code 里有详细的注释 01okhttp module里 包含的设计模式:建造者设计模式、责任链设计模式 CustomInject 演示自定义注解 代码:okhttp原理分析、Andro…...
freeswitch的mod_xml_curl模块
概述 freeswitch是一款简单好用的VOIP开源软交换平台。 随着fs服务的增多,每一台fs都需要在后台单独配置,耗时耗力,心力憔悴。 如果有一个集中管理配置的配置中心,统一管理所有fs的配置,并可以实现动态的修改配置就…...
高速数据采集专家-FMC140【产品手册】
FMC140是一款具有缓冲模拟输入的低功耗、12位、双通道(5.2GSPS/通道)、单通道10.4GSPS、射频采样ADC模块,该板卡为FMC标准,符合VITA57.1规范,该模块可以作为一个理想的IO单元耦合至FPGA前端,8通道的JESD204…...
【SSM】知识集锦
项目一:狂神JAVA 功能1:实现全部书籍查询 1.思路:首页index.jsp ——>Controller——>hello.jsp 2.步骤: step1:index.jsp <% page language"java" contentType"text/html; charsetUTF-8" page…...
Flowable-中间事件-信号中间抛出事件
定义 当流程执行到达信号抛出事件时,流程引擎会直接抛出信号,其他引用了与其相同的信号捕获 事件会被触发,信号发出后事件结束,流程沿后继路线继续执行。其抛出的信号可以被信号开始事 件(Signal Start Event…...
【算法基础:动态规划】5.3 计数类DP(整数拆分、分拆数)
文章目录 例题:900. 整数划分解法1——完全背包解法2——分拆数⭐⭐⭐ 例题:900. 整数划分 https://www.acwing.com/problem/content/902/ 解法1——完全背包 容量是 n,物品的大小和价值是 1 ~ n 中的所有数字。 import java.util.*;pub…...
封装(Encapsulation)
目录 概念 好处 数据隐藏 模块化设计 代码复用 简化接口 示例 意义 概念 封装(Encapsulation)是面向对象编程的一个核心概念,它指的是将数据和相关操作封装在一个对象中,隐藏了实现的细节。(就是实现数据封装和…...
php 原型模式
一,原型模式,就是先创建好一个原型对象,然后通过拷贝原型对象来生成新的对象。适用于大对象的创建,因为每次new一个大对象会有很大的开销,原型模式仅需内存拷贝即可。 原型模式中的主要角色: 1,…...
LiveGBS流媒体平台GB/T28181功能-支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放
LiveGBS支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放 1、背景2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、背景 视频监控项目使用过程中,有时需要大屏值守,值守的时候多分…...
6、Nginx实现反向代理
Nginx 反向代理是一种常见的应用场景,它允许 Nginx 作为中间服务器接收客户端的请求,并代理转发这些请求到后端的真实服务器。这种配置使得客户端只需要与 Nginx 交互,而后端服务器对客户端是透明的。 ngx_http_proxy_module: 将客…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...

