复习一下~~

该文章展示了一个使用SpringBoot、MyBatis和MySQL构建的简单用户登录系统。项目中包含了配置pom.xml文件,设置数据源,定义UserMapper接口,创建HTML登录页面以及使用Ajax进行后台验证的逻辑。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1</name>
    <description>demo1</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <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.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!--  增加依赖下载速度  -->
    <repositories>
        <repository>
            <id>nexus-aliyun</id>
            <name>nexus-aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

</project>

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/boom?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=password123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.mapper-locations=classpath:mapper/*.xml

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<div style="width: 350px; margin: 100px auto 0 auto; height: 400px; border: 1px solid #ccc;
        border-radius: 5px; box-shadow:#ccc 0 0 10px; ">
    <div style="margin-top: 30px; text-align: center; ">
        <div style="text-align: center; margin-top: 80px; font-size: 30px; color: dodgerblue">欢迎登录</div>
        <div style="margin-top: 30px">
            <input type="text" id="username" style="width: 60%; border: 1px solid #ccc; padding: 10px"
                   placeholder="请输入账号">
        </div>
        <div style="margin-top:10px">
            <input type="password" id="password" style="width: 60%; border: 1px solid #ccc; padding: 10px"
                   placeholder="请输入密码">
        </div>
        <div style="margin-top: 30px">
            <button style="width: 60%; border: none; background-color: dodgerblue; color: white; font-size: 16px;
                 box-sizing: content-box; padding: 10px; cursor: pointer" onclick="login()">登录
            </button>
        </div>
    </div>
</div>

<script src="jquery.min.js"></script>

<script>
    function login() {
        let username = $("#username").val();
        let password = $("#password").val();
        if (!username) {
            alert("请输入账号")
            return;
        }
        let data = {username: username, password: password}
        $.ajax({
            type: "POST",
            url: "/user/login",
            data: JSON.stringify(data),
            contentType: "application/json",
            success: (res) => {
                if (res.code === '0') {
                    location.href = "/";
                } else {
                    alert("账号或密码错误")
                }
            }
        })
    }
</script>

</body>
</html>

jquery.min.js
文件在博客园
https://www.cnblogs.com/a276665092

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
欢迎来到首页
</body>
</html>

UserMapper.xml

<?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.example.mapper.UserMapper">
  <resultMap id="BaseResultMap" type="com.example.entity.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="username" jdbcType="VARCHAR" property="username" />
    <result column="nickname" jdbcType="VARCHAR" property="nickname" />
    <result column="password" jdbcType="VARCHAR" property="password" />
  </resultMap>
  <sql id="Base_Column_List">
    id, username, nickname, `password`
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from user
    where id = #{id,jdbcType=INTEGER}
  </select>
  <select id="selectAll" resultType="com.example.entity.User">
    select <include refid="Base_Column_List" />
    from user
  </select>
  <select id="selectByUsernameAndPassword" resultType="com.example.entity.User">
    select <include refid="Base_Column_List" />
    from user where username = #{username} and password = #{password}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from user
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.example.entity.User" useGeneratedKeys="true">
    insert into user (username, nickname, `password`
      )
    values (#{username,jdbcType=VARCHAR}, #{nickname,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
      )
  </insert>
  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.example.entity.User" useGeneratedKeys="true">
    insert into user
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="username != null">
        username,
      </if>
      <if test="nickname != null">
        nickname,
      </if>
      <if test="password != null">
        `password`,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="username != null">
        #{username,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        #{password,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.example.entity.User">
    update user
    <set>
      <if test="username != null">
        username = #{username,jdbcType=VARCHAR},
      </if>
      <if test="nickname != null">
        nickname = #{nickname,jdbcType=VARCHAR},
      </if>
      <if test="password != null">
        `password` = #{password,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.example.entity.User">
    update user
    set username = #{username,jdbcType=VARCHAR},
      nickname = #{nickname,jdbcType=VARCHAR},
      `password` = #{password,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

UserMapper

package com.example.mapper;

import com.example.entity.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(User record);

    int insertSelective(User record);

    User selectByPrimaryKey(Integer id);

    List<User> selectAll();

    int updateByPrimaryKeySelective(User record);

    int updateByPrimaryKey(User record);

    User selectByUsernameAndPassword(User user);
}

User

package com.example.entity;

import java.io.Serializable;

/**
 * user
 * @author 
 */

public class User implements Serializable {
    private Integer id;

    private String username;

    private String nickname;

    private String password;

    private static final long serialVersionUID = 1L;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }
}

UserController

package com.example.controller;

import com.example.common.Result;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserMapper userMapper;

    @PostMapping("/login")
    public Result<User> login(@RequestBody User user) {
        if (!checkParam(user)) {
            return Result.error("-1", "缺少必要参数");
        }
        User dbUser = userMapper.selectByUsernameAndPassword(user);
        if (dbUser == null) {
            return Result.error("-1", "账号或密码错误");
        }
        return Result.success(dbUser);
    }

    private boolean checkParam(User user) {
        return user.getUsername() != null && user.getPassword() != null;
    }
}

Result

package com.example.common;

public class Result<T> {
    private String code;
    private String msg;
    private T data;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.code = "0";
        result.msg = "成功";
        result.setData(data);
        return result;
    }

    public static <T> Result<T> success() {
        Result<T> result = new Result<>();
        result.code = "0";
        result.msg = "成功";
        return result;
    }

    public static <T> Result<T> error(String code, String msg) {
        Result<T> result = new Result<>();
        result.code = code;
        result.msg = msg;
        return result;
    }
}

结构


转载:https://blog.youkuaiyun.com/xqnode/article/details/113079010

SQL(Structured Query Language)是一种用于管理和操作关系型数据库的标准编程语言。以下是对 SQL 基础知识的详细复习,涵盖数据库、表、查询、事务、视图、数据备份与还原等核心概念和操作。 ### 数据库与表 数据库是用于存储和管理数据的结构化集合,通常包含多个表、视图、索引和存储过程等对象。每个表由行和列组成,行表示记录,列表示字段。每个表通常包含一个主键(Primary Key),用于唯一标识每一行,确保数据完整性。此外,外键(Foreign Key)用于建立表之间的关系,确保参照完整性[^2]。 #### 常用操作 - **创建表**: ```sql CREATE TABLE table_name ( column1 datatype constraints, column2 datatype constraints, ... ); ``` - **插入数据**: ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); ``` - **查询数据**: ```sql SELECT column1, column2, ... FROM table_name WHERE condition; ``` ### 查询与子查询 SQL 查询用于从数据库中检索数据。基本查询包括选择特定列、过滤数据(使用 `WHERE` 子句)、排序(使用 `ORDER BY`)、分组(使用 `GROUP BY`)和聚合函数(如 `SUM`, `AVG`, `COUNT`)。 #### 子查询 子查询是嵌套在另一个查询中的查询,通常用于动态计算某个条件的值。例如,查询每个科目中高于该科目平均分的学生记录: ```sql SELECT sname, course, score FROM students AS a WHERE score >= ( SELECT AVG(score) FROM students AS b WHERE a.course = b.course ); ``` ### 视图(View) 视图是一个虚拟表,基于 SQL 查询的结果集。视图可以简化复杂查询、提供数据抽象和安全性。 #### 创建与操作视图 - **创建视图**: ```sql CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition; ``` - **查询视图**:与普通表相同。 - **修改视图**: ```sql ALTER VIEW view_name AS SELECT column1, column2, ...; ``` - **删除视图**: ```sql DROP VIEW [IF EXISTS] view_name; ``` ### 事务(Transaction) 事务是一组必须同时成功或失败的操作,确保数据的一致性和完整性。事务具有 ACID 属性: - **原子性(Atomicity)**:事务中的所有操作要么全部完成,要么全部不执行。 - **一致性(Consistency)**:事务前后数据库的状态必须保持一致。 - **隔离性(Isolation)**:事务之间互不干扰。 - **持久性(Durability)**:事务提交后,更改是永久性的。 #### 事务操作 - **开始事务**: ```sql START TRANSACTION; ``` - **提交事务**: ```sql COMMIT; ``` - **回滚事务**: ```sql ROLLBACK; ``` ### 数据备份与还原 数据备份是保护数据库免受数据丢失的重要手段。常见的备份方式包括: - **全量备份**:备份整个数据库或特定表的结构和数据。 - **增量备份**:仅备份自上次备份以来发生变化的数据,适用于大型项目。 - **日志备份**:备份事务日志,用于恢复到某个特定时间点。 #### 备份与还原操作 - **备份表结构与数据**: ```bash mysqldump -u username -p database_name table_name > backup_file.sql ``` - **还原数据**: ```bash mysql -u username -p database_name < backup_file.sql ``` ### 隔离级别 SQL 标准定义了四种隔离级别,用于控制事务之间的可见性和并发行为: 1. **读未提交(Read Uncommitted)** 2. **读已提交(Read Committed)** 3. **可重复读(Repeatable Read)** 4. **串行化(Serializable)** 设置隔离级别: ```sql SET TRANSACTION ISOLATION LEVEL isolation_level; ``` ### 相关问题 1. 如何在 SQL 中实现多表连接查询? 2. 什么是索引?它在 SQL 查询优化中的作用是什么? 3. SQL 中的触发器(Trigger)是什么?如何创建和使用? 4. 如何在 SQL 中使用窗口函数(Window Function)? 5. 什么是存储过程?它的优缺点是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值