java-spring-mybatis -学习第一天-基础知识讲解

news/2024/5/18 17:32:46

目录

前置条件(创建一个项目)

Mybatis

定义

可能出现的问题

这边如果连接不上数据库

​编辑

Dao接口设计

Mybatis流程

创建实体类 User  和其属性

创建@Mapper的接口类

测试类测试

实例数据库数据的更新

实例数据库数值的删除


最重要的是有一个原始的数据库 -我这边使用的是mariadb数据库

前置条件(创建一个项目)

这边使用Spring boot 快速创建框架

新建一个项目-Spring Initializr-更改Server URL(这边看情况 看你的jkd版本号)-jdk-java-next

 搜索依赖 my -勾选 myBatis Framework 和 MySQL Driver(idea运行数据库需要数据库运行依赖)-create

 

Mybatis

定义

Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互;

使用此框架程序员只需要通过注解或者修改xml配置文件的方式配置好需要执行的SQL语句,MyBatis框架会根据SQL语句生成对应的JDBC代码并对数据库中数据进行增删改查操作。

 配置外部属性文件

其配置需要包含url,username,password
这边是一个实例
spring.datasource.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root

其中的

url  可以复制  需要更改的是端口 mysql默认的是3306

还有的是数据库默认的是mysql(这个一定要改)

password 是数据库登录密码 username 是数据库的用户名 

可能出现的问题

这边如果连接不上数据库

可能原因是数据库没启动 

window+R -> 命令输入services.msc ->server

我出现这个问题,我这边稍微说一下,我用的mariadb数据库 将手动变成自动就可以了

Dao接口设计

基于MyBatis规范设计用户数据访问接口,在工程目录下创建包mapper,并创建UserMapper接口

  • @Mapper注解

    是由MyBatis框架提供,用于描述数据层接口,告诉系统底层为此接口创建其实现类,在实现类中定义数据访问逻辑,执行与数据库的会话(交互)

  • @Insert注解

    使 MyBatis 框架根据接口方法的参数类型自动生成插入数据的代码。

  • 占位符 #{}

    #{} 是 MyBatis 框架中用来表示占位符的语法。

    在 @Insert注解中,#{}所代表的是一个占位符,它可以接受 Java 对象作为输入参数,并将其转换为预编译的 SQL 语句中的参数。使用 #{}可以帮助我们避免 SQL 注入等问题,同时也让 SQL 写起来更加简单。

Mybatis流程

数据库和java中的对应关系

java和数据库中的对应关系
数据库java
字段名属性
创建实体类 User  和其属性

package org.example.demo_formybatis.pojo.entity;import java.util.Date;public class User {private  Long id;private String username;private  String password;private String nickname;private Date created;public Date getCreated() {return created;}public void setCreated(Date created) {this.created = created;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", nickname='" + nickname + '\'' +", created='" + created + '\'' +'}';}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}}
创建@Mapper的接口类

这边需要提醒的是定接口的方法最好定义要返回值

这边 插入更新 删除的返回值 是 int(可以返回影响的数据的条数)

而查询则需要根据具体情况判断

数据库的数据的插入 

package org.example.demo_formybatis.mappers;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.example.demo_formybatis.pojo.entity.User;@Mapper
public interface UserMapper {@Insert("INSERT INTO  user (username ,password ,nickname,created) VALUES (#{username},#{password},#{nickname},#{created})")int insertUser(User user);
}
测试类测试

在说导入外部属性文件的时候 我们自己建立一个测试类 @Test测试

这边现在只需要 在 Test包下找到配置的包 这边是DemoFormybatisApplicationTests

 这边测试一下 

package org.example.demo_formybatis;import org.example.demo_formybatis.mappers.UserMapper;
import org.example.demo_formybatis.pojo.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Date;@SpringBootTest
class DemoFormybatisApplicationTests {@Testvoid contextLoads() {}@Autowiredprivate UserMapper userMapper;@Testvoid  insertUserTest(){User user = new User();user.setUsername("张三");user.setPassword("123");user.setNickname("老三");user.setCreated(new Date());System.out.println(userMapper.insertUser(user));}}

 点击测试按钮(这边事先运行了一次)

运行成功图

查看数据库中的数据

实例数据库数据的更新

接下来 数据库的更新数据

需要注意的是 必须更新数据必须写WHERE,

使用的是mybatis框架它没有提示

我们只需要更新张三的名字为李四

这边需要注意的是我们@Mapper注解的接口的方法传递的参数需要仍然是一个实体类对象 而不是一个id值

package org.example.demo_formybatis.mappers;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
import org.example.demo_formybatis.pojo.entity.User;@Mapper
public interface UserMapper {@Insert("INSERT INTO  user (username ,password ,nickname,created) VALUES (#{username},#{password},#{nickname},#{created})")int insertUser(User user);@Update("UPDATE user SET username= #{username} WHERE id =#{id}")int updateUser(User user);
}

测试

package org.example.demo_formybatis;import org.example.demo_formybatis.mappers.UserMapper;
import org.example.demo_formybatis.pojo.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Date;@SpringBootTest
class DemoFormybatisApplicationTests {@Testvoid contextLoads() {}@Autowiredprivate UserMapper userMapper;@Testvoid  insertUserTest(){User user = new User();user.setUsername("张三");user.setPassword("123");user.setNickname("老三");user.setCreated(new Date());System.out.println(userMapper.insertUser(user));}@Testvoid updateUserTest(){User user = new User();user.setId(103L);user.setUsername("李四");System.out.println(userMapper.updateUser(user));}}

运行结果图

数据库的情况

实例数据库数值的删除

删除李四的数据

这边不重复写前面的了东西了 ,这边只写相关代码

@Delete("DELETE FROM user WHERE username = #{name}")int deleteUser(String name);

这边我是依据用户名删除 的#{变量} 这里的变量是形参的具体的值 所以名字必须保持一致

测试

 @Testvoid deleteUserTest(){System.out.println(userMapper.deleteUser("李四"));}

 运行结果

数据库的情况

实例数据库的查询

查询比较特殊点在于:数据库的对字段查询会返回一个结果集 

这边引入新的概念: VO

VO(Value Object,值对象)是一种设计模式,用于封装从数据库查询结果中获取的数据。VO主要作为数据传输的载体,它与数据库表结构相对应,但不包含任何业务逻辑,仅用于存储和传递数据。

总结来说,MyBatis中的VO是用于封装数据库查询结果的一种对象,它提供了面向对象的数据封装方式,有助于提高代码的可读性和可维护性。在实际项目中,根据查询需求和业务场景,可以设计相应的VO类,配合MyBatis的映射机制,实现数据的高效访问和传输。

简单而言 如果需要从数据库返回特定字段名的数值,就可以使用VO,

此时我们需要封装一个VO的实体类

假设我们需要返回字段名   username,password,nickname 的数值,

当然全字段返回的可以使用实体类

package org.example.demo_formybatis.pojo.vo;public class UserVO1 {private  Long id;private String username;private  String password;private String nickname;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", nickname='" + nickname + '\'' +'}';}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}}

查询 用户名为张三的数据

@Select("SELECT username,password,nickname FROM user WHERE username = #{name}")List<UserVO1> selectUserByUsername(String name);

测试 

 @Testvoid selectUserByUsernameTest(){System.out.println(userMapper.selectUserByUsername("张三"));}

测试结果等一下补


http://www.mrgr.cn/p/15553360

相关文章

C语言实现双人贪吃蛇项目(基于控制台界面)

一.贪吃蛇 贪吃蛇是一款简单而富有乐趣的游戏&#xff0c;它的规则易于理解&#xff0c;但挑战性也很高。它已经成为经典的游戏之一&#xff0c;并且在不同的平台上一直受到人们的喜爱和回忆。 二.贪吃蛇的功能 游戏控制&#xff1a;玩家可以使用键盘输入设备来控制蛇的移动方…

Pycharm远程连接服务器调试过程(个人记录)

Pycharm远程调试服务器,这里主要讲的是ssh方法(避免自己主机显存、内存不足的情况,ssh服务如何开启请自行查找)。 主要分为几个步骤: 1、服务器开启ssh服务,开放ssh端口号(一般为22) 2、打开pycharm,设置ssh远程python为解释器(如下,打开设置后点设置添加解释器,随…

ChatGPT在线网页版(与GPT Plus会员完全一致)

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

vis.js工具提示3d图形

代码案例<!DOCTYPE html> <html><head><title>Graph 3D demo</title><style>body {font: 10pt arial;}div#info {width: 600px;text-align: center;margin-top: 2em;font-size: 1.2em;}</style><scripttype="text/javascrip…

Linux下SPI设备驱动实验:测试读取ICM20608设备中数据是否正常

一. 简介 前面文章实现了 SPI设备的读写功能&#xff0c;也对ICM20608设备中&#xff08;即SPI设备&#xff09;寄存器里的数据进行了读取。文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;读取ICM20608设备的数据-CSDN博客 本文对驱动功能进行测试&#xff0c;即…

static+单例模式+类的复合继承

汇编语言 汇编语言是最靠谱的验证“编程语言相关知识点”正确性的方式 汇编语言与机器语言一一对应&#xff0c;每一条机器语言都有与之对应的汇编指令 机器语言是计算机使用的语言&#xff0c;它是一串二进制数字 汇编语言可以通过汇编得到机器语言机器语言可以通过反汇编得到…

鸿蒙开发实战:【文件管理】

介绍 本示例主要展示了文件管理相关的功能,使用[@ohos.multimedia.medialibrary]、[@ohos.filemanagement.userFileManager] 、[@ohos.fileio] 、[@ohos.file.fs]、[@ohos.app.ability.contextConstant] 等接口,实现了增添文件、删除文件、查找指定类型文件文件、复制并移动文…

机器学习(四)之无监督学习

前言&#xff1a; 前面写了监督学习的几种算法&#xff0c;下面就开始无监督啦&#xff01; 如果文章有错误之处&#xff0c;小伙伴尽情在评论区指出来&#xff08;嘿嘿&#xff09;&#xff0c;看到就会回复的。 1.聚类&#xff08;Clustering&#xff09; 1.1 概述&#xff…

上位机图像处理和嵌入式模块部署(树莓派4b与视觉slam十四讲)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 实际使用中&#xff0c;树莓派4b是非常好的一个基础平台。本身板子价格也不是很贵&#xff0c;建议大家多多使用。之前关于vslam&#xff0c;也就是…

WAF攻防-漏洞发现协议代理池GobyAwvsXray

知识点 1、Http/s&Sock5协议 2、Awvs&Xray&Goby代理 3、Proxifier进程代理使用 4、Safedog&BT&Aliyun防护在漏洞发现中&#xff0c;WAF会对三个方向进行过滤拦截&#xff1a; 1、速度频率问题&#xff08;代理池解决&#xff09; 2、工具的指纹被识别&am…

XMU《计算机网络与通信》第三次实验报告

一、个人信息 学号:************** 姓名:### 二、实验目的理解TCP和UDP协议主要特点掌握socket的基本概念和工作原理,编程实现socket通信三、实验任务与结果 任务 1 前置任务开启两个终端窗口,分别编译、运行 server_example.c 和 client_example.c,观察它们实现的功能。可…

vis.js样式3d图形

代码案例<!DOCTYPE html> <html><head><title>Graph 3D demo</title><style>body {font: 10pt arial;}</style><scripttype="text/javascript"src="https://unpkg.com/vis-graph3d@latest/dist/vis-graph3d.min.j…

Redis系列之Cluster集群搭建

在上一篇博客&#xff0c;我们学习Redis哨兵Sentinel集群的搭建&#xff0c;redis的哨兵模式提供了比如监控、自动故障转移等高可用方案&#xff0c;但是这种方案&#xff0c;容量相对固定&#xff0c;要进行持续扩容或者数据分片就不适合&#xff0c;所以有另外一种更复杂的集…

使用 ECharts 绘制咖啡店各年订单的可视化分析

使用 ECharts 绘制咖啡店各年订单的可视化分析 在这篇博客中&#xff0c;我将分享一段使用 ECharts 库创建可视化图表的代码。通过这段代码&#xff0c;我们可以直观地分析咖啡店各年订单的情况。 饼图 这段代码包含了两个 ECharts 图表&#xff0c;一个是饼图&#xff0c;用…

vis.js线条3d图形

代码案例<!DOCTYPE html> <html><head><title>Graph 3D demo</title><style>body {font: 10pt arial;}</style><scripttype="text/javascript"src="https://unpkg.com/vis-graph3d@latest/dist/vis-graph3d.min.j…

华为数通HCIA ——企业网络架构以及产品线

一.学习目标&#xff1a;精讲网络技术&#xff0c;可以独立搭建和维护中小企业网络&#xff01; 模拟器&#xff08;华为方向请安装ENSP&#xff0c;Ensp-Lite已有安装包&#xff0c;号称功能更加完善-这意味着要耗费更多的系统资源但是仅对华为内部伙伴申请后方可使用&#x…

Linux RTC驱动深入解析

目录标题 实时时钟&#xff08;RTC&#xff09;基础Linux内核中的RTC框架RTC设备类设备树&#xff08;Device Tree&#xff09; 编写Linux RTC驱动1. 初始化和注册2. RTC设备操作函数3. 清理函数 测试RTC驱动驱动开发的挑战总结 在许多嵌入式系统和服务器上&#xff0c;实时时钟…

一三云:教你小型企业如何选择云服务器

在数字化时代,云服务器已成为小型企业实现数字化转型的关键工具。对于小型企业而言,选择合适的云服务器不仅能够降低IT成本,提高运营效率,还能够确保数据的安全性和业务的连续性。然而,面对市面上众多云服务器提供商和复杂的产品选择,小型企业往往感到困惑和不知所措。本…

深入理解高级加密标准(Advanced Encryption Standard)

title: 深入理解高级加密标准&#xff08;Advanced Encryption Standard&#xff09; date: 2024/4/23 20:04:36 updated: 2024/4/23 20:04:36 tags: AES概述加密原理优势特点算法详解安全性应用实践案例分析 第一章&#xff1a;AES概述 AES的历史和背景 历史&#xff1a; 高…

YOLOV8训练问题

代码如上,效果如下:无限循环打印权重文件修改为如下即可,通过if __name__ == __main__使得代码不会被其余文件循环调用(具体为何被调用不知):