spring boot 数据库层

2023-11-05

项目开启
首先设计数据库以及存储表、表的联系 —需要存贮的信息

基本表的性质
  基本表与中间表、临时表不同,因为它具有如下四个特性:
   (1) 原子性。基本表中的字段是不可再分解的。
   (2) 原始性。基本表中的记录是原始数据(基础数据)的记录。
   (3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
   (4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。
  理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来

例如商城的话:
表的设计基本思想:
一对多 多对一 多对多 最终还是要化为 一对多
基本数据表就是:基本用户 管理员用户 三元用户 商品信息 商品分类 商品的中间表 订单 订单具体信息

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="org.sang.mapper.UserMapper">
    <select id="loadUserByUsername" resultType="org.sang.bean.User">
        SELECT * FROM user WHERE username=#{username}
    </select>
    <insert id="reg" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user set username=#{username},password=#{password},nickname=#{nickname}
    </insert>
    <update id="updateUserEmail">
        UPDATE user set email=#{email} WHERE id=#{id}
    </update>
    <select id="getUserByNickname" resultMap="BaseResultMap">
        SELECT u.*,r.`id` AS rid,r.`name` AS rname FROM user u,roles r,roles_user ru WHERE u.`id`=ru.`uid` AND
        r.`id`=ru.`rid` AND u.`id` NOT IN(SELECT u.`id` FROM user u,roles_user ru WHERE u.`id`=ru.`uid` AND ru.`rid`=1)
        <choose>
            <when test="nickname!=null and nickname!=''">
                and u.nickname like concat('%',#{nickname},'%') ORDER BY u.`id`
            </when>
            <otherwise>
                ORDER BY u.`id` limit 20
            </otherwise>
        </choose>
    </select>
    <select id="getUserById" resultMap="BaseResultMap">
        SELECT u.*,r.`id` AS rid,r.`name` AS rname FROM user u,roles r,roles_user ru WHERE u.`id`=ru.`uid` AND
        r.`id`=ru.`rid` AND u.`id`=#{id}
    </select>
    <resultMap id="BaseResultMap" type="org.sang.bean.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="nickname" property="nickname"/>
        <result column="password" property="password"/>
        <result column="enabled" property="enabled"/>
        <result column="email" property="email"/>
        <result column="userface" property="userface"/>
        <result column="regTime" property="regTime"/>
        <collection property="roles" ofType="org.sang.bean.Role">
            <id column="rid" property="id"/>
            <result column="rname" property="name"/>
        </collection>
    </resultMap>
    <select id="getAllRole" resultType="org.sang.bean.Role">
        select * from roles;
    </select>
    <update id="updateUserEnabled">
        UPDATE user set enabled=#{enabled} WHERE id=#{uid}
    </update>
    <delete id="deleteUserById">
        DELETE FROM user WHERE id=#{id}
    </delete>
    <delete id="deleteUserRolesByUid">
        DELETE FROM roles_user WHERE uid=#{id}
    </delete>
    <insert id="setUserRoles">
        INSERT INTO roles_user(rid,uid) VALUES
        <foreach collection="rids" separator="," item="rid">
            (#{rid},#{id})
        </foreach>
    </insert>
</mapper>

接口user封装

package org.sang.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.sang.bean.Role;
import org.sang.bean.User;

import java.util.List;

/**
 * Created by sang on 2017/12/17.
 */
@Mapper
public interface UserMapper {

    User loadUserByUsername(@Param("username") String username);

    long reg(User user);

    int updateUserEmail(@Param("email") String email, @Param("id") Long id);

    List<User> getUserByNickname(@Param("nickname") String nickname);

    List<Role> getAllRole();

    int updateUserEnabled(@Param("enabled") Boolean enabled, @Param("uid") Long uid);

    int deleteUserById(Long uid);

    int deleteUserRolesByUid(Long id);

    int setUserRoles(@Param("rids") Long[] rids, @Param("id") Long id);

    User getUserById(@Param("id") Long id);
}

提供其他类操作数据库

提供给service层再进一层封装 对接口进行实现

    public int reg(User user) {
        User loadUserByUsername = userMapper.loadUserByUsername(user.getUsername());
        if (loadUserByUsername != null) {
            return 1;
        }
        //插入用户,插入之前先对密码进行加密
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        user.setEnabled(true);//用户可用
        long result = userMapper.reg(user);
        //配置用户的角色,默认都是普通用户
        String[] roles = new String[]{"2"};
        int i = rolesMapper.addRoles(roles, user.getId());
        boolean b = i == roles.length && result == 1;
        if (b) {
            return 0;
        } else {
            return 2;
        }
    }

然后传给控制层

    @PostMapping("/reg")
    public RespBean reg(User user) {
        int result = userService.reg(user);
        if (result == 0) {
            //成功
            return new RespBean("success", "注册成功!");
        } else if (result == 1) {
            return new RespBean("error", "用户名重复,注册失败!");
        } else {
            //失败
            return new RespBean("error", "注册失败!");
        }
    }
}

显示到视图层–前端

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring boot 数据库层 的相关文章

  • 无法使用 Django 应用程序从容器连接到 MySQL docker 容器

    当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时 出现以下错误 django db utils OperationalError 2003 Can t connect to MySQL serve
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • Mybatis XML 与注解

    我读过有关Mybatis的书籍和文档 XML和Annotation都可以满足我的要求 但是从myBatis官方网站来看 他们声称XML是做Mappers的更好方法 因为Java注释有局限性 我个人更喜欢注释 例如 public interf
  • MySQL 全文搜索不适用于某些单词,例如“house”

    我已经在 3 个字段中的一小部分记录上设置了全文索引 也尝试了 3 个字段的组合 并得到了相同的结果 有些单词返回结果很好 但某些单词如 house 和 澳大利亚 不这样做 有趣的是 澳大利亚 和 家乡 这样做 这似乎是奇怪的行为 如果我添
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将ElasticSearch与MySQL集成?

    在我的一个项目中 我计划将 ElasticSearch 与 MySQL 结合使用 我已经成功安装ElasticSearch 我可以单独管理ES中的索引 但我不知道如何用 MySQL 实现同样的功能 我读过一些文件 但我有点困惑 没有明确的想
  • PDO PHP 连接,致命错误

    我的连接类 firstcode php class DB functions public db function construct try db new PDO mysql localhost dbname xxx charset ut
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb

随机推荐

  • 期货毁了多少家庭和个人?

    不是交易摧毁人生 而是贪婪和无知 交易是一个专业门槛很高的行业 但大多数人总认为我开完户就算入门了 偏偏你在专业性不足 一知半解的时候是意识不到交易的风险的 你会不会买辆车不考驾照就上路 加速踩油门 减速踩刹车 转弯打方向 看起来也挺简单的
  • java set 比较函数_【Java提高十七】Set接口集合详解

    三 Set接口 Set是一种不包括重复元素的Collection 它维持它自己的内部排序 所以随机访问没有任何意义 与List一样 它同样运行null的存在但是仅有一个 由于Set接口的特殊性 所有传入Set集合中的元素都必须不同 同时要注
  • 动态SQL之choose、when、otherwise标签

    动态SQL之choose when otherwise标签 choose when otherwise chose 父标签 when 相当于if else if 只要有一个条件成立 其它的都不判断了 otherwise 相当于else 若所
  • ctf.show web7

    判断字符型 1 报错 1 更换 反复尝试如果正常返回为字符型注入 判断数字型注入的方法 1 与原界面返回不同或报错 1 and 1 1与原页面返回相同 1 and 1 2与原页面返回不同 即可得出为数字型 id 1 order by 3 与
  • 微信小程序新规,规范用户隐私保护指引

    背景 新功能发版突然遇到弹窗提示 需要更新用户隐私保护指引的设置 否则无法发布新版本 这里吐槽一下 在此之前微信小程序后台消息并未收到相关通知 解决路径如下 入口有两处 第一处如图 第二处入口 发布版本时会有提示 直接拦截 让完善协议 如图
  • java中的<;和>;分别是什么意思

    今天在做java笔试题的时候 有一题出现了这个符号 由于我不认识这个符号就做错了 题目如下 这题的答案是A 而我选了C 后面百度才知道 lt 的意思是小于 lt 符号 在用markdown写文章的时候 就会显示 笔者在这里贴出其他类似的符号
  • C#异步编程学习笔记4 之 异步函数

    C 异步编程学习笔记4 之 异步函数 异步函数 awaiting async 修饰符 异步方法如何执行 可以 await 什么 捕获本地状态 await 之后在哪个线程上执行 UI 上的 await 代码运行原理 与粗粒度的并发相比 编写异
  • Blender插件BoxCutter 7.1.7v15 硬表面建模2.91+教程Box Cutter

    Boxcutter旨在成为最快的屏幕3d视图绘图切割器 通过时间和经验来学习和增强了工具 以使工作流程尽可能地人性化地优化用户 提供各种行为来个性化体验 以使事情保持流畅 每天都会对这些工具进行严格的测试 以确保它们不仅可以与当前版本的Bl
  • Flask-文件上传

    在Flask中处理文件上传非常简单 它需要一个enctype属性设置为 multipart form data 的HTML表单 将该文件提交到指定URL 也可以配置上传文件路径和指定上传文件大小 实例 upload html文件中包含一个f
  • 征战开发板从无到有(三)

    接上一篇 翘首已盼的PCB板子做好了 管脚约束信息都在PCB板上体现出来了 很满意 会不会成为爆款呢 嘿嘿 来 先看看PCB裸板美图 由于征战开发板电路功能兼容小梅哥ACX720 大家可以直接用小梅哥的视频来学习 不会影响学习体验 现在学习
  • C语言最重要的知识点【入门干货】

    C语言最重要的知识点 总体上必须清楚的 1 程序结构是三种 顺序结构 选择结构 分支结构 循环结构 2 读程序都要从main 入口 然后从最上面顺序往下读 碰到循环做循环 碰到选择做选择 有且只有一个main函数 3 计算机的数据在电脑中保
  • RuntimeError: cublas runtime error : resource allocation failed at

    root bsyocr server train tail trainall210722 6 log txt File home server train pytorch pretrained modeling py line 300 in
  • Nginx的安装(实践记录)

    1 安装nginx需要系统中有gcc环境 先查看本机是否安装gcc gcc version 如果没有就需要安装 gcc gcc c gcc g gcc gnat gcc java gcc objc libgcj libgcj devel l
  • C/C++ 杨辉三角形

    题目描述 还记得中学时候学过的杨辉三角形吗 具体的定义这里不再描述 你可以参考以下的图形 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 输入 输入数据包含多个测试实例 每个测试实例的输入只包含一个正整数n 1 lt n lt
  • AJAX学习笔记8 跨域问题及解决方案

    AJAX学习笔记7 AJAX实现省市联动 biubiubiu0706的博客 CSDN博客 跨域 指一个域名的网页去请求另外一个域名资源 比如百度页面去请求京东页面资源 同源与不同源三要素 协议 域名 端口 协议一致 域名一致 端口一致 才算
  • JAVA中的内存分配

    JAVA中的内存分配 栈 方法运行时使用的内存 比如main方法的运行 进入方法栈中执行 堆 存储对象或数组 new来创建的 都存储在堆内存中 方法区 存储可以运行的class文件 本地方法栈 JVM在使用操作系统功能的时候使用 和我们开发
  • 查询、关闭正在运行的Tomcat端口

    查询正在使用的端口 快捷键win R 输入cmd 回车 打开cmd窗口 查看所有的端口进程 请输入netstat ano 查看某个特定端口 输入netstat ano findstr 8089 关闭某个端口进程 输入taskkill f p
  • Javaweb

    一 创建包和类来编译servlet程序 二 编译和运行
  • 如何在老版本浏览器中丝滑地使用JS新特性(ES6)

    如何在老版本浏览器中丝滑地使用JS新特性呢 如何在老版本浏览器中丝滑地使用JS新特性呢 有两种方法可以帮助我们实现 第一种方法就是我们用JS原有的方法 自己去实现JS的新特性 不是说好的丝滑使用新特性吗 就这 哈哈哈 别急 客官留步 我还有
  • spring boot 数据库层

    项目开启 首先设计数据库以及存储表 表的联系 需要存贮的信息 基本表的性质 基本表与中间表 临时表不同 因为它具有如下四个特性 1 原子性 基本表中的字段是不可再分解的 2 原始性 基本表中的记录是原始数据 基础数据 的记录 3 演绎性 由