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

news2025/1/13 17:29:08

目录

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

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;
    }

    @Override
    public 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 {

    @Test
    void contextLoads() {
    }
    @Autowired
    private UserMapper userMapper;
    @Test
    void  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 {

    @Test
    void contextLoads() {
    }
    @Autowired
    private UserMapper userMapper;
    @Test
    void  insertUserTest(){
        User user = new User();
        user.setUsername("张三");
        user.setPassword("123");
        user.setNickname("老三");
        user.setCreated(new Date());
        System.out.println(userMapper.insertUser(user));


    }
    @Test
    void 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);

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

测试

 @Test
    void 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;


   
    @Override
    public 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);

测试 

 @Test
    void selectUserByUsernameTest(){

        System.out.println(userMapper.selectUserByUsername("张三"));
    }

测试结果等一下补

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

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

相关文章

传统行业还在使用FTP传输?试试这套FTP替代传输解决方案!

在数字化转型的浪潮中&#xff0c;传统企业对文件传输的需求日益增长。然而&#xff0c;许多企业仍在使用传统的文件传输协议&#xff08;FTP&#xff09;来处理文件传输任务。尽管FTP在早期被广泛采用&#xff0c;但其固有的弊端逐渐成为企业发展的桎梏&#xff0c;所以找一个…

SQL中的锁

一、概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资(CPU、RAM、I/0)的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0c;锁冲…

大模型 AI 框架昇思 MindSpore 2.3.RC1 发布,训练、推理性能大幅提升,JIT 编译强化

经过社区开发者们几个月的开发与贡献&#xff0c;现正式发布昇思 MindSpore2.3.RC1 版本&#xff0c;通过多维混合并行以及确定性 CKPT 来实现超大集群的高性能训练&#xff0c;支持大模型训推一体架构&#xff0c;大模型开发训练推理更简、更稳、更高效&#xff0c;并在训推一…

【CMU15-445 Part-19】Multi-Version Concurrency Control

Part19-Multi-Version Concurrency Control 其实说到底 MVCC不仅是一种并发控制协议&#xff0c;更是一个系统构建&#xff08;数据组织的方法&#xff09;。 简介 writer 不会 block readers&#xff0c;reader 也不会 block writers。只读事务可以读到一个consistent的sna…

nlp 自然语言处理的dataset数据库积累

下面的这个和 entity recognition有关的。 Weights & Biases

光伏无人机巡检主要有些什么功能和特点?

随着科技的飞速发展&#xff0c;无人机技术已经渗透到多个行业领域&#xff0c;光伏产业便是其中之一。光伏无人机巡检&#xff0c;作为一种新兴的巡检方式&#xff0c;正在逐渐取代传统的人工巡检&#xff0c;为光伏电站的安全、高效运行提供了有力保障。那么&#xff0c;光伏…

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

“我也想和月牙一样,把不满写在脸上”

贪吃蛇的初级实现 1. Win32 API介绍1.1 Win32 API1.2 控制台程序1.3 控制台屏幕上的坐标COORD1.4 GetStdHandle1.5 GetConsoleCursorInfo1.5.1 CONSOLE_CURSOR_INFO 1.6 SetConsoleCursorInfo1.7 SetConsoleCursorPosition1.8 GetAsyncKeyState 2. 贪吃蛇游戏设计与分析2.1 地图…

使用Shell终端访问Linux

一、实验目的 1、熟悉Linux文件系统访问命令&#xff1b; 2、熟悉常用 Linux Shell的命令&#xff1b; 3、熟悉在Linux文件系统中vi编辑器的使用&#xff1b; 4、进一步熟悉虚拟机网络连接模式与参数配置&#xff01; 二、实验内容 1、使用root帐号登陆到Linux的X-windows…

2024年了,还有必要搭建企业网站吗?

现在企业的营销手段五花八门。当下火爆的短视频直播平台展现出的裂变效应也取得不错的成绩&#xff0c;这不禁让很多企业舍弃做网站的念头&#xff0c;投入自媒体账号。那么&#xff0c;2024年了&#xff0c;还有必要搭建企业网站吗&#xff1f; 我们分两种企业来看&#xff1…

【11-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

3d软件哪个适合新手学?3D动画渲染怎么好

在不同的行业领域&#xff0c;3D建模和动画的需求各异&#xff0c;因此所需的3D软件工具也会有所不同。对于刚开始接触3D设计的新手来说&#xff0c;软件的易操作性、丰富的学习资源以及与自己专业领域相关的功能是选择时的重要考虑因素。以下是几款适合初学者入门的3D软件推荐…

【第3节】“茴香豆“:搭建你的 RAG 智能助理

目录 1 基础知识1.1.RAG技术的概述1.2 RAG的基本结构有哪些呢&#xff1f;1.3 RAG 工作原理&#xff1a;1.4 向量数据库(Vector-DB )&#xff1a;1.5 RAG常见优化方法1.6RAG技术vs微调技术 2、茴香豆介绍2.1应用场景2.2 场景难点2.3 茴香豆的构建&#xff1a; 3 论文快读4 实践…

OpenHarmony网络协议通信—libevent [GN编译] - 事件通知库

libevent主要是用C语言实现了事件通知的功能 下载安装 直接在OpenHarmony-SIG仓中搜索libevent并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/libevent 修改添加依赖的编译脚本 在/developtools/bytrace_standard/…

java反序列化之URLDNS链学习

一、前言 近来学习java反序列化&#xff0c;听p神所说这个URLDNS利用链比较好理解&#xff0c;故决定由此进入学习的第一篇。 URLDNS是Java反序列化中比较简单的一个链&#xff0c;由于URLDNS不需要依赖第三方的包&#xff0c;同时不限制jdk的版本&#xff0c;所以通常用于检…

【SpringBoot整合系列】SpringBoot整合Mybatis

目录 前期回顾MyBatis简介特点 持久化&#xff08;Persistence&#xff09;什么是持久化 ORM&#xff08;Object Relational Mapping&#xff09;ORM解决方案包含下面四个部分ORM解决方案经典面试题&#xff1a;MyBatis与Hibernate区别 Springboot整合MyBatis1.新建工程&#x…

记录一下线上卡夫卡rebalanced的原因

记录一下线上卡夫卡rebalanced的原因&#xff0c;以及排查过程&#xff0c;我们线上使用的版本是0.10.1.1&#xff0c;rebalanced就是重平衡&#xff0c;触发重平衡的原因如下&#xff1a; 消费者组内成员发生变更&#xff0c;这个变更包括了增加和减少消费者。注意这里的减少有…

UI自动化测试框架:PO 模式+数据驱动(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

调试 WebSocket API 技巧分享

WebSocket 是一种在单个 TCP 连接上实现全双工通信的先进 API 技术。与传统的 HTTP 请求相比&#xff0c;WebSocket 提供了更低的延迟和更高的通信效率&#xff0c;使其成为在线游戏、实时聊天等应用的理想选择。 开始使用 Apifox 的 WebSocket 功能 首先&#xff0c;在项目界…