8月5日SpringBoot学习笔记
今日内容:搭建mybatis ORM 配置数据源 $#的区别 增删改查
搭建mybatis
在原有maven项目基础配置上进行:
pom文件添加依赖
<!-- Mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency>
在resources文件夹创建Application.yml文件下配置数据源
# spring boot的主配置文件
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
#spring.mvc.view.prefix: /html/
#spring.mvc.view.suffix: .html
#配置mybatis的数据源 DataSource
spring: datasource: url: jdbc:mysql://localhost:3306/easydatausername: rootpassword: tcwjy2021driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:mapper-locations: classpath*:/mapper/*.xml
#配置后,MyBatis在初始化时会自动扫描并加载这些XML文件,使你可以利用其中定义的SQL映射语句和操作。
#debug日志打印在控制台
logging:level:com.easy.dao: debug
ORM对象关系映射
ORM 的工作原理:
- 映射配置:通过注解或XML配置文件,定义类与数据库表之间的映射关系。
- 会话管理:创建与数据库的会话,管理事务和缓存。
- 数据访问:通过ORM框架提供的方法或查询构建器来查询和操作数据。
- 数据持久化:将对象状态同步到数据库,包括创建、更新和删除操作。
<?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.easy.dao.IStaffDao"><!-- 这里写sql语句 和接口对应 id对应方法名 --><select id="getNow" resultType="string">select now()</select><!-- '${}'把值放入 #{}把值和类型放入(先确定类型,然后放入值) 并且可以防止sql注入 )--><!-- 预编译,将sql语句确定,之后无论传递任何参数都不会改变sql语句语义,可以有效防止sql注入 --><!-- 也可以加快批处理的效率,编译好一次一直执行就行 --><!-- sql语句执行分为两个过程 编译和执行指令 --><insert id="addStaff">insert into staff(code,name,salary,username,password) value(#{code},#{name},#{salary},#{username},#{password})</insert><delete id="delStaff">delete from staff where id=#{id}</delete><update id="editStaff">update staff set name=#{name}, salary=#{salary},username=#{username},userpass=#{userpass}where id=#{id};</update></mapper>
$#的区别
1.在Spring框架中,${} 还用于属性文件的占位符替换,而 #{} 用于表达式语言(SpEL)。在MyBatis中,${} 和 #{} 的作用与Spring不同,专门用于SQL语句的构建和参数处理。
2.sql语句执行分为两个过程:编译和执行指令, '${}'直接把值放入然后编译,存在sql注入风险;#{}将#{}中的参数与SQL语句一起发送到数据库,数据库会根据参数的实际类型来处理它们,可以防止sql注入 。
预编译好处
利用预编译,将sql语句确定,之后无论传递任何参数都不会改变sql语句语义,可以有效防止sql注入;也可以加快批处理的效率,编译好一次一直执行就行 。
简单的增删改查实现
bean包下实体类
package com.easy.bean;public class Department {private int id;private String code;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
mapper包下定义SQL映射
<?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.easy.dao.IDepartmentDao"><insert id="addDepartment">insert into department(code,name) value(#{code},#{name})</insert><delete id="delDepartment">delete from department where id=#{id}</delete><update id="editDepartment">update department set name=#{name}where id=#{id};</update><select id="selectDepartment" resultType="com.easy.bean.Department">select * from department where id=#{id} </select>
</mapper>
dao(Data Access Object"(数据访问对象))包下定义数据访问接口
package com.easy.dao;import org.apache.ibatis.annotations.Mapper;import com.easy.bean.Department;@Mapper
public interface IDepartmentDao {int addDepartment(Department dep);int delDepartment(int id);int editDepartment(Department dep);Department selectDepartment(int id);
}
controller包下定义控制类
controller层接收前台参数时:
1. 使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。
2.使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
3.当参数个数大于 5 个时,建议使用 JavaBean 方式。
package com.easy.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.easy.bean.Department;
import com.easy.dao.IDepartmentDao;@RestController
@RequestMapping("department")
public class DepartmentController {@AutowiredIDepartmentDao dao;@PostMappingpublic String addDepartment(@RequestBody Department dep) {dao.addDepartment(dep);return "Add sucess";}@DeleteMapping("{id}")public String delDepartment(@PathVariable int id) {dao.delDepartment(id);return "DEL sucess";}@PutMappingpublic String editDepartment(@RequestBody Department dep) {dao.editDepartment(dep);return "EDIT sucess";}@GetMapping("{id}")public Department selectDepartment(@PathVariable int id) {return dao.selectDepartment(id);}
}
相关文章:
8月5日SpringBoot学习笔记
今日内容:搭建mybatis ORM 配置数据源 $#的区别 增删改查 搭建mybatis 在原有maven项目基础配置上进行: pom文件添加依赖 <!-- Mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-…...
Java学习笔记(二十):反射、动态代理、日志、类加载器、xml、单元测试Junit、注解
目录 一、反射 1.1 反射的概述: 1.2 学习反射到底学什么? 1.3 获取字节码文件对象的三种方式 1.4 字节码文件和字节码文件对象 1.5 获取构造方法 1.6 获取构造方法并创建对象 1.7 获取成员变量 1.8 获取成员变量并获取值和修改值 1.9 获取成员…...
如何快速从文本中找到需要的信息,字典和正则灵活运用
import re #打开文本文件 f open("stock_data.txt",encoding"utf-8") #单独读取第一行数据处理进行分割,末尾换行符去掉 headers f.readline().strip().split(,) print(headers) #定义一个字典,以股标代码做为KEY,每个行做为值 st…...
springboot3整合redis
来源于https://www.bilibili.com/video/BV1UC41187PR/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source865f32e12aef524afb83863069b036aa 一、整合redis 1.创建项目文件 2.添加依赖 <dependencies><dependency><groupId>…...
VUE基础快速入门
VUE 和 VUE-Cli VUE 是一种流行的渐进式JavaScript框架,用于构建Web用户界面它具有易学、轻量级、灵活性强、高效率等特点,并且可以与其他库和项目集成是目前最流行的前端框架之一VUE-Cli 称为“VUE脚手架”,它是由VUE官方提供的客户端,专门为…...
用Python实现特征工程之特征提取——数值特征提取、类别特征提取、文本特征提取、时间特征提取
特征提取是特征工程中的关键步骤,它从原始数据中提取有意义的特征,以便机器学习模型能够更好地理解和学习数据。根据数据类型,特征提取可以分为数值特征提取、类别特征提取、文本特征提取和时间特征提取。下面详细讲解每种特征提取方法&#…...
按图搜索新体验:阿里巴巴拍立淘API返回值详解
阿里巴巴拍立淘API是一项基于图片搜索的商品搜索服务,它允许用户通过上传商品图片,系统自动识别图片中的商品信息,并返回与之相关的搜索结果。以下是对阿里巴巴拍立淘API返回值的详细解析: 一、主要返回值内容 商品信息 商品列表…...
vue跨域问题
本地调试 可以通过在vue.config.js中配置devServer来实现跨域请求。 module.exports {publicPath: ./,productionSourceMap: false, // 生产环境是否生成 sourceMap 文件devServer: {proxy: {/bi: {target: http://1.11.113.20:1234/bi, // 后台接口域名ws: false, //…...
【NLP】文本处理的基本方法【jieba分词、命名实体、词性标注】
文章目录 1、本章目标2、什么是分词3、jieba的使用3.1、精确模式分词3.2、全模式分词3.3、搜索引擎模式分词3.4、中文繁体分词3.5、使用用户自定义词典 4、什么是命名实体识别5、什么是词性标注6、小结7、jieba词性对照表⭐ 🍃作者介绍:双非本科大三网络…...
unity 本地使用Json(全套)
提示:文章有错误的地方,还望诸位大神不吝指教! 文章目录 前言一、Json是什么?二、创建Json文件1.在线编辑并转实体类(C#)2.Json文件 三、解析Json并使用四、报错:JsonError:JsonExce…...
java消息队列ActiveMQ
安装 前置条件 activemq的运行依赖于jdk,需要提前安装jdk如果已经安装了jdk,需要根据jdk的版本来选择对应的版本进行安装activemq版本对应在官网上,使用java -version 看jdk的版本注意:jdk和mq的版本不一致会报错,电脑…...
Android SurfaceFlinger——信号同步原理(五十一)
经过前面系列文章的学习,我们的已经理解了 SurfaceFlinger 运行机制以及同步机制,但是SurfaceFlinger 又是以什么方法是把需要刷新的信号发送给 App 进程的。 一、VSync简介 垂直同步(Vertical Synchronization,简称 VSync)是一种用于同步视频信号和显示设备刷新率的技术…...
html+css网页制作 博云丝网5个页面 无js ui还原度100%
htmlcss网页制作 博云丝网5个页面 无js ui还原度100% 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取…...
Docker Hub 镜像代理加速
因为未知原因,docker hub 已经不能正常拉取镜像,可以使用以下代理服务来进行: "https://docker.m.daocloud.io", "https://noohub.ru", "https://huecker.io", "https://dockerhub.timeweb.cloud"…...
矩阵:消除冗余
矩阵 基本概念 矩阵(Matrix)是一个按照行和列排列的元素的二维数组。具体来说,一个 ( m \times n ) 的矩阵有 ( m ) 行和 ( n ) 列,表示为: A ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯…...
【AWS账号解绑关联】Linker账号解绑重新关联注意事项
文章目录 一、来自客户疑问二、提交工单获取帮助三、最佳操作说明四、最佳操作步骤五、参考资料活动上新 一、来自客户疑问 将Linker账号,从一个组织中退出,重新关联到新的组织中,这解绑到重新完成新的关联绑定期间会在Linker账号中的账单中…...
入门学习使用overleaf和latex
文章目录 1.下载对应的latex论文模板2.overleaf平台的使用2.1overleaf平台的介绍2.2overleaf平台模板文件的上传2.3latex语法的学习2.3.2 分段(如下图显示)2.3.3 其他2.3.4简单latex实操2.3.5 换行符和换页符2.3.6左右居中对齐2.3.7 字体设置2.3.8插入固定位置图片2.3.9文字包围…...
后端调优——分布式锁选型——入门
文章目录 引言正文分布式锁的定义分布式锁的具体应用场景如何实现分布式锁主动轮询型分布式锁实现思路一、MySQL分布式锁二、Redis分布式锁 监听回调型分布式锁Etcd分布式锁Zookeeper分布式锁 锁的对比 总结 引言 最近面试,一直被问到分布式锁,然后仅仅…...
k8s集群管理 Pod管理命令
k8s集群管理命令 信息查询命令 子命令说明help用于查看命令及子命令的帮助信息cluster-info显示集群的相关配置信息api-resources查看当前服务器上所有的资源对象api-versions查看当前服务器上所有资源对象的版本config管理当前节点上的认证信息 资源对象概述 Pod概述 Pod 管…...
Java 并发(二)—— AQS原理
AQS,全名AbstractQueuedSynchronizer。 抽象队列同步器定义多线程访问共享资源的同步模板,解决了实现自定义同步器时涉及的大量细节问题,简化开发两种同步状态:独占、共享核心组件:State变量、CLH变体队列、获取 / 释…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
