springboot整合mybatis(详解)

news2024/11/24 9:27:02
springboot整合mybatis
1. 整体架构展示:

在这里插入图片描述

2. pom.xml-需要的依赖:
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.xmlunit</groupId>
            <artifactId>xmlunit-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
    </dependencies>
3. 新建application.yml文件

在resources目录下新建application.yml文件,用于存放数据库连接、服务端口配置等,也可以直接使用application.properties文件。

4. 新建数据库,名为learn(名字可以随意),application.yml文件中的数据库名与数据库中的一样就行

application.yml文件:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/learn?serverTimezone=GMT%2B8&useSSL=true
    username: root
    password: "123456"

创建数据库表:

create table userLogin(
username varchar(50) primary key,
password varchar(50)
);

在这里插入图片描述

5. 在pojo下的新建类UserLogin
package com.example.learn.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author zhaoxiang
 * @date   2023/9/19
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor

public class UserLogin {
    private String username;
    private String password;
}

6. mapper层(与数据库表字段进行映射)

创建UserLoginMapper接口

package com.example.learn.mapper;

import com.example.learn.pojo.UserLogin;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author zhaoxiang
 * @date   2023/9/19
 **/
@Mapper
@Repository
public interface UserLoginMapper {
    //查询数据
    @Select("select * from userLogin")
    public List<UserLogin> queryAll();
    //添加数据
    @Insert("insert into userLogin values (#{username},#{password})")
    public int add(UserLogin userLogin);
    //根据用户名查询数据
    @Select("select * from userLogin where username = #{username}")
    public UserLogin queryByName(String username);
}

7. services层

在services包下创建建接口UserLoginServicesI和类UserLoginServicesImpl

  1. UserLoginServicesI接口:
package com.example.learn.services;

import com.example.learn.pojo.UserLogin;

import java.util.List;

/**
 * @author zhaoxiang
 * @date   2023/9/19
 **/
public interface UserLoginServicesI {
    //查询
    public List<UserLogin> queryAll();
    //添加数据
    public int add(UserLogin userLogin);
    //根据用户名查询数据
    public UserLogin queryByName(String username);
}
  1. UserLoginServicesImpl类:
package com.example.learn.services;

import com.example.learn.mapper.UserLoginMapper;
import com.example.learn.pojo.UserLogin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author zhaoxiang
 * @date   2023/9/19
 **/
@Service
public class UserLoginServicesImpl implements UserLoginServicesI {

    @Autowired
    UserLoginMapper userLoginMapper;
    @Override
    public List<UserLogin> queryAll() {
        return userLoginMapper.queryAll();
    }

    @Override
    public int add(UserLogin userLogin) {
        return userLoginMapper.add(userLogin);
    }

    @Override
    public UserLogin queryByName(String username) {
        return userLoginMapper.queryByName(username);
    }
}

8. conteoller层

创建UserLoginController类:

package com.example.learn.controller;

import com.example.learn.pojo.UserLogin;
import com.example.learn.services.UserLoginServicesImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author zhaoxiang
 * @date   2023/9/19
 **/
@Controller
public class UserLoginController {
    @Autowired
    UserLoginServicesImpl userLoginServicesImpl;

    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }

    @RequestMapping("/LoginSuccess")
    public String LoginSuccess(Model model, UserLogin userLogin){

        // 通过username查询username和password
        UserLogin userLogin1 = userLoginServicesImpl.queryByName(userLogin.getUsername());
        //先查询看该用户名是否存在
        if (userLogin1!=null){// 如果查询的用户不为空
            if(userLogin1.getPassword().equals(userLogin.getPassword())){ //判断密码是否正确
                System.out.println(userLogin1.toString());
                return "success";
            }
            else{
                //返回到登录页面
                model.addAttribute("data","用户名或密码错误");
                return "login";
            }
        }
        else{
            //返回到登录页面
            model.addAttribute("data","该用户不存在,请先注册");
            return "login";
        }
    }
    //登录界面
    @RequestMapping("/toRegister")
    public String toRegister(){
        return "register";
    }
    @RequestMapping("/RegisterSuccess")
    public String toRegisterSuccess(Model model,UserLogin userLogin){
        //将账号密码加入到数据库中
        int add = userLoginServicesImpl.add(userLogin);
        System.out.println("数据插入成功!");
        model.addAttribute("data","注册成功,请登录!");
        return "login";
    }
}

9. 创建前端页面(将这些页面放在template目录下)
  1. login.html:用户登录页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用户登录页面</title>
</head>
<body style="background: #ffffff">
<div align="center">
    <br><br><h2>登录界面</h2><br><br>
    <span th:text="${data}" style="text-color:red;font-size: 10px"></span>
    <form method="get" action="/LoginSuccess">
        用户名:<input type="text" name="username" placeholder="请输入用户名" required/><br><br>
        密码:<input type="text" name="password" placeholder="请输入密码" required/><br><br>
        <input type="submit" value="登录">
    </form>
    <br>
    <form method="get" action="/toRegister">
        <input type="submit" value="注册">
    </form>
</div>
</body>
</html>
  1. register.html:用户注册页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用户注册页面</title>
</head>
<body style="background: #ffffff">
<div align="center">
    <br><br>注册界面<br><br>
    <form method="get" action="/RegisterSuccess">
        用户名:<input type="text" name="username" placeholder="请输入用户名" required/><br><br>
        密码:<input type="text" name="password" placeholder="请输入密码" required/><br><br>
        确认密码:<input type="text" name="password2" placeholder="请输入密码" required/><br><br>
        <input type="submit" value="注册">
    </form>
</div>
</body>
</html>
  1. success.html:登录成功界面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户信息页面</title>
</head>
<body>
    <h1>success</h1>
</body>
</html>
10.效果展示

在搜索栏中输入 http://localhost:8080/toLogin
在这里插入图片描述
输入用户名和密码,点击登录,如果账号不存在,则显示用户名不存在,请先注册。如果数据库中存在该账号,则跳转到success页面。
在这里插入图片描述

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

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

相关文章

ICS TRIPLEX T8461 PLC系统备件模块

ICS TRIPLEX T8461 是一款用于 PLC&#xff08;可编程逻辑控制器&#xff09;系统备件的模块&#xff0c;通常用于工业自动化和控制系统中。这种类型的备件模块在多个应用领域都有广泛的用途&#xff0c;包括但不限于以下几个领域&#xff1a; 制造业&#xff1a; T8461 模块可…

FastAdmin开发七牛云上传插件

一看官网一个上传插件60大洋&#xff0c;对我这个穷鬼来说还是太贵了&#xff0c;于是乎自己写一个&#xff0c;后面随时用 直接开干 创建插件 php think addon -a aliupload -c create创建配置 <?phpreturn [[name > region,title > 获取存储区域,type > sel…

Linux内核中断(内核中断实现过程、注册三个按键中断实例、中断底半部实例、工作队列)

一、linux内核中断 1.目的&#xff1a; 用于对设备不用进行轮询访问&#xff0c;而是当设备事件发生后主动通知内核&#xff0c;内核再去访问设备。 2.linux内核中断实现过程框图 3.中断子系统API 1.解析中断相关的设备树节点 struct device_node *of_find_compatible_node…

【笔试强训选择题】Day44.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

CSS 滚动驱动动画 scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis )

scroll-timelinescroll-timeline-name❤️scroll-timeline-axis 解决问题语法 animation-timeline-nameanimation-timeline-axis scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis ) 在 scroll() 的最后我们遇到了因为定位问题导致滚动效果失效的情况, 当…

选择渲染农场的几个标准

随着电影、电视剧等影视作品的制作越来越依赖于计算机特效&#xff0c;渲染农场的使用也变得越来越普遍。渲染农场是一种利用大量计算机图形处理器&#xff08;GPU&#xff09;来加速渲染过程的服务。在选择渲染农场时&#xff0c;有几个标准可以帮助您确定哪个农场是适合您的项…

图神经网络系列之消息传递

文章目录 1.前言2.消息传递机制1.RecGNN2.ConvGNNs3.GAT 1.前言 相比较于神经网络最基本的网络结构全连接层&#xff08;MLP&#xff09;&#xff0c;特征矩阵乘以权重矩阵&#xff0c;图神经网络多了一个邻接矩阵。计算形式很简单&#xff0c;三个矩阵相乘再加上一个非线性变…

rv1126-rv1109-编译的剖析

./build.sh uboot:cmds./build.sh ubootcd u-boot make rv1126_defconfig make menuconfig ### 保存配置到对应的⽂件rv1126_defconfig make savedefconfig cp defconfig configs/rv1126_defconfig //剖析 ./build.sh uboot //调用 ./mk-loader.sh build.sh -> mk-all.sh …

软件安全测试为什么重要?安全测试应该怎么进行?

在当前数字化时代&#xff0c;软件已经成为我们生活中不可或缺的一部分&#xff0c;无论是在工作中还是生活中&#xff0c;我们都离不开各种各样的软件。然而&#xff0c;随着软件的普及和应用范围的扩大&#xff0c;软件安全问题也逐渐凸显出来&#xff0c;给企业和个人带来了…

无涯教程-JavaScript - SECH函数

描述 SECH函数返回某个Angular的双曲正割。双曲正割是双曲余弦的倒数。因此,双曲正割的值由等式给出- $$\sinh\left(x\right)\frac {1} {\cosh\left(x\right)} \frac {2} {e ^ x e ^ {-x}} $$ 语法 SECH (number)争论 Argument描述Required/OptionalNumberNumber is the …

Backup: MML shutdown 忽略

RMAN Backup Job is Completed But RMAN Sessions are Not Released in Database When Using Netbackup (Doc ID 2903139.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 19.8.0.0.0 and …

Outlook打开超链接用默认浏览器Microsoft outlook open hyperlink using default browser

这两天outlook打开超链接一直用edge&#xff0c;但我的默认浏览器是chrome。 解决方法 在outlook的选项中的高级设置里面&#xff0c;将超链接打开选为默认浏览器。

「UG/NX」Block UI 指定位置SpecifyLocation

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

Navicat中查询指定字段名所在的表名

Navicat中查询指定字段名所在的表名 代码如下&#xff1a; SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME替换成你要查找的字段;显示结果如下&#xff1a; 或者这段代码&#xff1a; SELECT table_name, column_name FROM information_schema.columns WHERE c…

二刷力扣--二叉树(1)基础、遍历

二叉树基础 常见的二叉树。 两类特殊的二叉树&#xff0c;满二叉树和完全二叉树。 满二叉树即一棵节点满了的二叉树&#xff0c;想要再添加一个节点只能添加一层了。 完全二叉树:照着满二叉树从上到下&#xff0c;从左到右的顺序添加节点&#xff0c;中间的过程都是完全二叉…

安装VS2015时提示安装包丢失或损坏

今天安装VS2015社区版本时&#xff0c;提示缺失以下两个内容&#xff1a; Microsoft VisualStudio JavaScript Project System : 找不到元素。 Microsoft VisualStudio JavaScript Language Service : 系统找不到指定的文件。 虽然似乎不影响C代码的运行&#xff0c;但是我怕有…

数据结构_复杂度讲解(附带例题详解)

文章目录 前言什么是数据结构&#xff1f;什么是算法&#xff1f;一. 算法的时间复杂度和空间复杂度1.1 算法效率1.2 如何衡量一个算法好坏 二. 时间复杂度2.1 时间复杂度概念例题一例题一分析 实例一实例一分析 三. 空间复杂度实例实例问题解析 四. 常见复杂度对比五. 常见时间…

Linux查找文件内容的命令

在Linux中&#xff0c;您可以使用以下命令来查找文件内容&#xff1a; grep命令&#xff1a; grep命令用于在文件中搜索指定的文本模式&#xff0c;并将包含匹配的行打印出来。语法如下&#xff1a; grep "要查找的文本" 文件名例如&#xff0c;要在名为example.txt的…

激光雷达录制pcap类型的包

查看IP 上图中的eno1就是网卡名&#xff0c;就可以使用如下命令录制 sudo tcpdump -i eno1 host 192.168.1.200 -w lidar.pcap-i 后面是网卡名&#xff0c;host 后面是ip&#xff0c;-w后是pcap包名称。

在Spring Boot API Gateway中实现Sticky Session

文章目录 小结问题在API Gateway中实现Sticky Session在同一个API Gateway中同时支持Sticky Session和RoundRobinLoadBalancer参考 小结 在Kubernetes微服务的云环境中&#xff0c;如何在Spring Boot API Gateway中实现Sticky Session&#xff0c;当服务请求被某一个服务器处理…