SpringBoot项目整合Mybatis-MySql数据库编程

1.Mybatis-MySql

话不多说-直接上代码!
1. 数据库编程的依赖

<!-- Mybatis整合Spring Boot的依赖项 -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version>
</dependency>
<!-- MySQL的依赖项 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

application.properties添加配置如

# 连接数据库的配置参数
spring.datasource.url=jdbc:mysql://localhost:3306/mall_pms?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

检查配置是否正确在test文件测试 没报错即通过

@Autowired
DataSource dataSource;@Test
void getConnection() throws Throwable {dataSource.getConnection();
}

2. Mybatis实现数据库编程

在项目的根包下创建config.MybatisConfiguration配置类(添加了@Configuration注解的类),在此类上配置@MapperScan注解 指定接口文件所在的根包

package cn.tedu.csmall.product.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;@MapperScan("cn.tedu.csmall.product.mapper")
@Configuration
public class MybatisConfiguration {
}

application.properties中添加配置:

# Mybatis相关配置
mybatis.mapper-locations=classpath:mapper/*.xml
# 支持驼峰命名法-ymlconfiguration:mapUnderscoreToCamelCase: true

并且,在src/main/resources下创建名为mapper的文件夹。

编写POJO类,先在项目中添加依赖:

<!-- Lombok的依赖项,主要用于简化POJO类的编写 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope>
</dependency>

在项目的根包下创建`pojo.entity.xxxxx中声明与数据表对应的各属性

package cn.tedu.csmall.product.pojo.entity;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/*** @author java@tedu.cn* @version 0.0.1*/
@Data
public class Album implements Serializable {/*** 记录id*/private Long id;/*** 相册名称*/private String name;}

在项目的根包下创建mapper.AlbumMapper接口,并在接口中添加“插入1条数据”的抽象方法

在各Mapper接口上添加@Repository注解(防止自动装配报错)

  • 与添加@Mapper注解的本质不同,添加@Mapper注解是为了标识此接口是Mybatis框架应该处理的接口,添加@Repository注解是为了引导IntelliJ IDEA作出正确的判断
package cn.tedu.csmall.product.mapper;
import cn.tedu.csmall.product.pojo.entity.Album;
/*** 处理相册数据的Mapper接口** @author java@tedu.cn* @version 0.0.1*/
@Repository
public interface AlbumMapper {/*** 插入相册数据** @param album 相册数据* @return 受影响的行数*/int insert(Album album);}

src/main/resource/mapper下,并在此文件中配置以上接口

抽象方法的对应代码:

<?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="cn.tedu.csmall.product.mapper.AlbumMapper">←这里需要对应mapper中的文件<!-- int insert(Album album); --><insert id="insert">INSERT INTO pms_album (name, description, sort) VALUES (#{name}, #{description}, #{sort})</insert>
</mapper>

mapper数据库语句编写规范

插入数据时获取自动编号的id

<insert>标签上,可以配置useGeneratedKeys="true"keyProperty="属性名",将可以获取自动编号的id值,并由Mybatis自动赋值到参数对象的属性(keyProperty配置的值)上

<!-- int insert(Album album); -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO pms_album (name, description, sort) VALUES (#{name}, #{description}, #{sort})
</insert>

提示:如果表的id不是自动编号的,则插入数据时必须由方法的调用者给出id值,所以,对于方法的调用者而言,id值是已知的,则不需要配置这2个属性。

mapper中增删改查语句示例

批量插入数据

int insertBatch(List<Album> albums);
<!-- int insertBatch(List<Album> albums); -->
<insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">INSERT INTO pms_album (name, description, sort) VALUES<foreach collection="list" item="album" separator=",">(#{album.name}, #{album.description}, #{album.sort})</foreach>
</insert>

根据id删除数据

int deleteById(Long id);
<!-- int deleteById(Long id); -->
<delete id="deleteById">DELETE FROM pms_album WHERE id=#{id}
</delete>

根据若干个id批量删除数据

int deleteByIds(Long[] ids);
<!-- int deleteByIds(Long ids); -->
<delete id="deleteByIds">DELETE FROM pms_album WHERE id IN (<foreach collection="array" item="id" separator=",">#{id}</foreach>)
</delete>

修改数据

int update(Album album);
<!-- int update(Album album); -->
<update id="update">UPDATE pms_album<set><if test="name != null">name=#{name},</if><if test="description != null">description=#{description},</if><if test="sort != null">sort=#{sort},</if></set>WHERE id=#{id}
</update>

统计数据的数量

int count();

在设计“查询”的抽象方法时,关于返回值类型,只需要保证所设计的返回值类型足够“装得下”所需的查询结果即可。

<!-- int count(); -->
<select id="count" resultType="int">SELECT count(*) FROM pms_album
</select>

注意:每个<select>标签必须配置resultTyperesultMap这2个属性中的其中1个

根据id查询数据的详情

创建pojo.vo.AlbumStandardVO类型,在此类型中设计与查询的字段列表匹配的属性

AlbumStandardVO getStandardById(Long id);
<!-- AlbumStandardVO getStandardById(Long id); -->
<select id="getStandardById" resultType="cn.tedu.csmall.product.pojo.vo.AlbumStandardVO">SELECT id, name, description, sort FROM pms_album WHERE id=#{id}
</select>

注意:每个<select>标签必须配置resultTyperesultMap这2个属性中的其中1个。

查询数据列表

创建pojo.vo.AlbumListItemVO类型,在此类型中设计与查询的字段列表匹配的属性

List<AlbumListItemVO> list();
<!-- List<AlbumListItemVO> list(); -->
<select id="list" resultType="cn.tedu.csmall.product.pojo.vo.AlbumListItemVO">SELECT id, name, description, sort FROM pms_album ORDER BY sort DESC, id DESC
</select>

注意:每个<select>标签必须配置resultTyperesultMap这2个属性中的其中1个。

<resultMap><sql>标签

<!-- CategoryStandardVO getStandardById(Long id); -->
<select id="getStandardById" resultMap="StandardResultMap">SELECT<include refid="StandardQueryFields"/>FROMpms_categoryWHEREid=#{id}
</select><sql id="StandardQueryFields"><if test="true">id, name, parent_id, depth, keywords, sort, icon, enable, is_parent, is_display</if>
</sql><resultMap id="StandardResultMap" type="cn.tedu.csmall.product.pojo.vo.CategoryStandardVO"><id column="id" property="id"/><result column="name" property="name"/><result column="parent_id" property="parentId"/><result column="depth" property="depth"/><result column="keywords" property="keywords"/><result column="sort" property="sort"/><result column="icon" property="icon"/><result column="enable" property="enable"/><result column="is_parent" property="isParent"/><result column="is_display" property="isDisplay"/>
</resultMap>

MySQL数据类型与Java类中的数据类型的对应关系

MySQL数据类型Java类中的数据类型
tinyint / smallint / intInteger
bigintLong
char / varchar / text系列String
datetimeLocalDateTime

Mybatis的占位符中使用的名称

在使用Mybatis框架时,配置的SQL语句中的参数可以使用占位符来表示,例如:

<!-- int deleteById(Long id); -->
<delete id="deleteById">DELETE FROM ams_admin WHERE id=#{id}
</delete>

以上SQL语句中#{id}是占位符。

事实上,当抽象方法的参数只有1个时,在占位符中的名称是完全自由编写的,因为Mybatis框架会自动的查找那唯一参数值代入到SQL执行过程中!当抽象方法的参数超过1个时,在占位符中名称不可以是随意的名称,如果使用的名称错误,则可能出现类似以下错误:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'passwordxxx' not found. Available parameters are [password, id, param1, param2]

在错误提示信息中,已经明确指出:Available parameters are [password, id, param1, param2],即“可用的参数名称是[password, id, param1, param2]”,则配置的SQL语句可以是:

<update id="updatePasswordById">update ams_admin set password=#{password} where id=#{id}
</update>

或者:

<update id="updatePasswordById">update ams_admin set password=#{param2} where id=#{param1}
</update>

在较低版本的框架中,为了保证能够使用#{id}#{password}这种名称的占位符,需要在抽象方法的各参数前添加@Param注解,以配置参数的名称,例如:

int updatePasswordById(@Param("id") Long id, @Param("password") String password);

Mybatis的占位符的格式

在Mybatis中,配置SQL语句时,参数可以使用#{}格式的占位符表示,也可以使用${}格式的占位符来表示!

对于以下查询:

<select id="getStandardById" resultMap="StandardResultMap">SELECT<include refid="StandardQueryFields" />FROMams_adminWHEREid=#{id}
</select>

无论是使用#{}还是使用${}格式的占位符,执行效果是相同的!

对于以下查询:

<select id="getLoginInfoByUsername" resultMap="LoginResultMap">SELECT<include refid="LoginQueryFields" />FROMams_adminWHEREusername=#{username}
</select>

使用#{}格式的占位符时,是可以正常使用的,使用${}格式的占位符,会出现如下错误:

Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'root' in 'where clause'

有问题和补充欢迎各位评论区提问!!

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

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

相关文章

报表工具怎么选?山海鲸VS帆软,哪个更适合你?

概述 在国产报表软件市场中&#xff0c;山海鲸报表和帆软这两款工具都占有一席之地&#xff0c;许多企业在选择报表工具时常常在它们之间徘徊。然而&#xff0c;随着企业对数据分析需求的不断增长和复杂化&#xff0c;如何选取一款高效、易用且性价比高的报表工具&#xff0c;…

HTML、CSS 和 JavaScript 的介绍

HTML、CSS 和 JavaScript 是网页设计的核心技术组合,以下是关于它们在网页设计中的介绍: 一、HTML(超文本标记语言) 结构基础 HTML 负责构建网页的结构和内容。它使用各种标签来定义网页的不同部分,如 <html>、<head>、<body> 等。例如,<h1> 到…

“摄像机”跟随及攻击抖动实现

学习Unity的摄像机功能&#xff0c;可以帮助我们实现摄像机对人物的跟随移动&#xff0c;还可以使用这个工具自带的插件&#xff0c;摄像机震动&#xff0c;颤动&#xff0c;增强打击感&#xff1b; 首先来安装一下这个插件&#xff0c;window菜单--packageManage--左上角Unit…

vcpkg 从清单文件安装依赖项

vcpkg 有两种运行模式&#xff1a;经典模式和清单模式。清单文件有自己的 vcpkg_installed 目录&#xff0c;可在其中安装依赖项&#xff0c;与所有包都安装在通用 %VCPKG_ROOT%/installed 目录中的经典模式不同。 因此&#xff0c;每个项目都可以有自己的清单和自己的一组依赖…

R语言机器学习算法实战系列(十)自适应提升分类算法 (Adaptive Boosting)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模型总…

生发产品哪个效果最好?油秃头秋冬季养发搭子

如果你是大额头 或者 M型发际线&#xff0c;无论是天生的 亦或者是后天造成的&#xff0c;养发防脱一定要重视起来&#xff0c;因为防脱育发是需要循序渐进坚持的&#xff0c;今天就给大家分享一下几个特别有效的育发液&#xff0c;选对产品养发那真是稳了~ 1、露卡菲娅防脱育发…

2024前端html5,css3面试题总汇

1.XML&#xff0c;HTML&#xff0c;XHTML区别⭐ XML&#xff1a;XML是一个可扩展标记语言&#xff0c;主要是用来存储&#xff0c;传输数据的&#xff0c;并非显示数据&#xff0c;可以用来标记数据&#xff0c;定义数据类型&#xff0c;允许用户对自己的标记语言进行定义&…

RabbitMQ 消息处理问题全解

在使用 RabbitMQ 进行消息队列通信时&#xff0c;可能会遇到消息丢失、乱序、重复消费等问题。这些问题如果不加以妥善处理&#xff0c;可能会导致系统出现数据不一致、业务逻辑错误等严重后果。本文将详细探讨 RabbitMQ 中这些问题的产生原因以及解决方案&#xff0c;并提供丰…

深度学习:Sigmoid函数详解

Sigmoid函数详解 Sigmoid函数是一个广泛应用于神经网络中的激活函数&#xff0c;尤其是在早期的神经网络模型中。其数学表达式如下&#xff1a; [ σ ( x ) 1 1 e − x \sigma(x) \frac{1}{1 e^{-x}} σ(x)1e−x1​ ] 主要特点 输出范围&#xff1a; Sigmoid函数的输出…

Unity之XR Interaction Toolkit 射线拖拽3DUI

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、想实现的功能二、实现原理1.UI挂在XRGrabInteractable、刚体、BoxCollder2.修改刚体属性3.加BoxCollder 总结 前言 VR项目里正常情况有放置两种3DUI的方式…

如何在 HarmonyOS NEXT 中使用 @Builder 装饰器优化 UI 组件的复用?

摘要 在鸿蒙 NEXT 开发中&#xff0c;Builder 装饰器是一种轻量级的 UI 元素复用机制&#xff0c;它允许开发者将重复使用的 UI 元素抽象成一个方法&#xff0c;并在 build() 方法中多次调用&#xff0c;以实现 UI 结构的复用。以下是如何使用 Builder 装饰器来优化 UI 组件复…

Ovis: 多模态大语言模型的结构化嵌入对齐

论文题目&#xff1a;Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址&#xff1a;https://arxiv.org/pdf/2405.20797 github地址&#xff1a;https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天&#xff0c;我将分享一项重要的研…

关于使用 C# 处理水位数据多种格式的统一转换

关于使用 C# 处理水位数据多种格式的统一转换 1、前言2、水位数据的多种格式3、水位数据多种格式的统一转换程序展示4、水位数据多种格式的统一转换 C# 代码4.1、声明引用命名空间4.2、多种格式的统一转换 C# 代码4.3、多种格式的统一转换 C# 代码&#xff0c;文件输出保存 1、…

Django进一步掌握(10月22日)

一、请求响应对象 请求对象request 响应对象HttpResponse 二、HttpResponse常用属性 status设置HTTP响应状态码 status_code查询HTTP响应状态码 content_type设置响应的类型 write()写入响应内容 三、重定向 1、实现URl访问的重定向 &#xff08;1&#xff09;使用Ht…

【尊享面试100题】数组/字符串

多看优秀的代码 1.数组列表中的最大距离2.字符串的左右移3.相隔为1的编辑距离4.形成字符串的最短路径5.连接二进制表示可形成的最大数值 1.数组列表中的最大距离 给定 m 个数组&#xff0c;每个数组都已经按照升序排好序了。 现在你需要从两个不同的数组中选择两个整数&#…

微知-Lecroy力科的PCIe协议分析仪型号命名规则(PCIe代,金手指lanes数量)

文章目录 要点主要型号命名规则各代主要产品图片Summit M616 协议分析仪/训练器Summit T516 分析仪Summit T416 分析仪Summit T3-16分析仪Summit T28 分析仪 综述 要点 LeCroy(力科)成立于1964年&#xff0c;是一家专业生产示波器厂家。在美国纽约。一直把重点放在研制改善生产…

Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)

HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文&#xff1a;https://arxiv.org/abs/2410.07718 代码&#xff1a;https://github.com/fudan-generative-vision/hallo2 模型&#xff1a;https://huggingface.co/fudan-generative-ai/h…

TikTok营销实用技巧与数据分析工具:视频洞察

TikTok凭借其独特的机制和庞大的流量&#xff0c;成为了众多品牌和卖家对产品进行宣传推广的必要平台之一。要在TikTok上优化营销效果、提升推广效率&#xff0c;可以使用平台提供的重要工具——视频洞察&#xff08;Video Insights&#xff09;。 一、视频洞察功能与技巧 视频…

React Native 项目使用Expo模拟器运行iOS和Android

iOS没有连接设备&#xff1a; 确保你已经用 USB 线将你的 iOS 设备连接到了你的 Mac。 设备未信任&#xff1a; 如果你的设备是第一次连接到 Mac&#xff0c;可能需要在设备上信任这台计算机。通常&#xff0c;当你连接设备时&#xff0c;设备上会弹出一个对话框&#xff0c;…

线性回归(一)

线性回归 1.基本术语 ①特征&#xff1a;预测所依据的自变量称为特征或协变量 ②标签&#xff1a;试图预测的目标称为标签或目标 2.举个栗子 线性假设是指目标&#xff08;房屋价格&#xff09;可以表示为特征&#xff08;面积和房龄&#xff09;的加权和&#xff0c;如下面…