【从0到1完成一个项目(四)】用户中心(中)

本文介绍了如何使用SpringBoot整合SSM框架,从项目初始化、数据库设计到CRUD操作。强调理解框架整合的重要性,分享了数据库表设计的注意事项,如字段命名、类型选择和索引设置。并演示了使用MyBatisX插件自动生成代码,解决了驼峰命名与数据库字段转换的问题。最后,讨论了目录结构规范和代码生成工具的使用,提倡遵循最佳实践,避免重复劳动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

书接上回,项目的初始化就完成了,其实项目的初始化都大差不差,做过一遍就行,面试也不会考这个,工作中基本都是直接写需求,所以这种机械的工作记录好,忘了就来看看,保存好初始化万用模板,下次直接用,这不丢人。
更加重要的是理解springboot是如何整合SSM框架的,这就涉及到源码的理解了,这一部分放在八股文里学习。

设计库表

需要考虑的问题

  • 有哪些表(哪些模型)?表中有哪些字段(模型的属性)?字段的类型?字段是否添加索引?
  • 表与表之间的关联
  • 性别是否需要加索引

设计表

用户表

字段说明类型
id用户id(主键自增)bigint
username昵称varchar
userAccount登录账号varchar
avatarUrl头像varchar
gender性别tinyint
userPassword密码varchar
phone电话varchar
email邮箱varchar
userStatus用户状态int(0-正常)【未来可的封号逻辑】
createTime创建时间(数据插入时间)datetime
updateTime更新时间(数据更新时间)datetime
isDelete是否删除0 1 (逻辑删除)tinyint

几个注意的点:

  1. 字段名字使用驼峰命名
  2. 多写注释
  3. 注意类型要合适
  4. 不要过度设计
  5. 当有多个表时,注意数据库的三范式

建表

  1. 在idea里直接访问数据库,右击数据库,可以选择new 一个表,也可以选择jump to query console,区别就是前者使用idea的建表工具,后者自己写sql,一般第一次建表使用idea工具,后面想要修改表,使用第二种。
  2. 点击了jump to query console,会让你选择新建查询,还是打开默认的查询,一般选择默认的,因为会有之前的记录。
  3. 开始建表(sql语句)
create table user
(
    id           bigint auto_increment comment 'id' primary key ,
    username     varchar(256)                       null comment '用户昵称',
    userAccount  varchar(256)                       null comment '账号',
    avatarUrl    varchar(1024)                      null comment '用户头像',
    gender       tinyint                            null comment '性别',
    userPassword varchar(512)                       not null comment '密码',
    phone        varchar(128)                       null comment '电话',
    email        varchar(512)                       null comment '邮箱',
    userStatus   int      default 0                 not null comment '状态0-正常',
    createTime   datetime default CURRENT_TIMESTAMP null comment '创建时间',
    updateTime   datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
    isDelete     tinyint  default 0                 not null comment '是否删除'
)
    comment '用户';

记录一下这里遇到的bug:
当时创建时间和更新时间的默认值发生冲突导致建表失败,隐约记得是当时两个默认值写的是datestamp,然后执行就报错了。具体修bug的过程就是先删掉这两个字段,建表,然后从之前的项目中复制这两个属性的建表语句(如上)。datetime是日期和时间都有,默认值就是当前的时间戳。

插一道面试题:
简单描述mysql中,索引,唯一索引,主键,联合索引的区别,对数据库的性能有什么影响?
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。

普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。

主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。

索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。

什么是主键?
主键指的是一个列或多列的组合(单主键和多主键之分),其值能唯一的标识表中的每一行,通过它可强制表的实体完整性,主键主要用途在于与其他表的外键关联,以及对记录的修改或删除。
主键是数据表的特殊的唯一索引,比如学生表有学号(主键)和姓名(索引)。

关于这道面试题,在复习mysql时,再详细看看,现在只是提一下。

后端写代码了

数据库设计好,就可以写CRUD了。

规整目录结构

因为之前做过一些demo测试,现在该删的删,然后新建一些目录(目录的建立就有约定熟成的意味在里面,以后做项目慢慢体会)

目录(包)说明
controller请求层(控制层)这个包的类专门用来接收前端发过来的请求,不做任何的业务处理(其实它就是javaweb里的servlet,只不过spring用dispatherServlet把它封装了
service专门用来编写业务逻辑,一般这一层是比较复杂的,因为实际需求的业务都很复杂
mapper数据访问层,和数据打交道,只做crud,一般这一层定义接口,然后mybatis的配置文件写sql,之前写的接口删掉,待会直接用MybatisX生成mapper接口
model定义了数据库的一些模型,或者用到的一些封装类
utils存放一些工具类,比如说加密、格式转换、日期转换等等。(就是和我们业务关系不太大的,为了节省我们的操作)
resources/static一般写前后端不分离的项目,在static放一些静态文件(没用删除)
resources/templates一般写前后端不分离的项目,放页面模板文件(没用删掉)
model里面有之前做demo测试用的User,现在没用了,删掉User,待会直接用MybatisX生成实体类
SampleTest之前做demo测试用的,现在没用了,删掉
最后的目录大致这样

目录结构

实现基本数据库操作(写代码)

这里我们介绍一个插件,它就是MyBatisX,它能根据表的字段生成domain实体对象、mapper接口(操作数据库的对象)、mapper.xml(定义了mapper对象和数据库的关联,可以在里面自己写SQL,具体这块有点忘记了,之后好好学Mybatis的映射文件里的resultMap和sql等等标签,不要记,要的是整理出来,方便查阅复习,摸透它的本质,就好使用了)service(包含常用的CRUD)、serviceImpl(具体实现的service)。

这里讲解一下mybatisplus生成的mapper和service里面的继承和实现关系:

首先mybatisplus相对于mybatis最大的优势在于,对于单表的CRUD不再需要自己写mapper的接口方法和对应的映射文件,比如我们要对User表做增删改查,我们只要定义一个UserMapper接口继承BaseMapper(这个字节码在引入的mybatisplus的jar包里面),继承的这个接口里面就有一套crud,但是没有具体的实现,也没有对应的映射文件,那为什么还可以操作数据库,这就要看mybatisplus的底层原理了(之后再说。)但是如果我们想要进行多表操作,那就只能老老实实写接口方法和映射文件了。

然后说一说生成的service里面的继承和实现关系:
首先就是UserService继承了IService(这个字节码也是在Mybatisplus的jar包里),这个接口定义了一套User表的CRUD,那么实现这个接口的类就是ServiceImpl(这个类也是Mybatisplus生成的),这个类是带有泛型的,传入了UserMapper,这就可以发现是使用UserMapper进行数据库的操作的,然后就是UserServiceImpl继承了ServiceImpl,然后实现UserServie,UserServiceImpl除了有ServiceImpl的方法外,自己也可以增加方法,所以在UserServiceImpl里面也要依赖userMapper,所以就形成闭环了,意思就是service里的操作数据库的方法都是调用mapper里的方法。

说一个题外话:一般做项目起步都是springboot,至于SSM只要学会它的原理就行,没有必要用它去搭一个项目,因为会写很多配置文件,很繁琐。然后简历里准备至少两个项目(前后不分离、分离),至于javaweb的原生项目没必要做了,了解大致框架就行(明白有哪些知识点),说白了就是一句话,不要重复造轮子,而且更重要的一点就是节省时间去学更多企业里的新技术,不要为了整理所学而整理,那样会丢了西瓜捡芝麻,而且学了后面的东西站在更高的维度再看前面的就跟玩一样。
先完成后完美。

用关系图来滤清就是这样的:
在这里插入图片描述
具体插件的使用:

  1. 安装MyBatisX插件(就是一个自动生成代码的工具而已)

  2. 右击数据表

  3. 然后配置生成代码的路径,建议生成的代码单独放在一个文件夹里,然后自己手动移动。
    在这里插入图片描述

  4. 生产:
    在这里插入图片描述

  5. 将生成的代码搬运到对应包,然后删掉generator

  6. 测试(一般写了一个阶段就要测试一下,证明这个阶段没有问题,如果所有的测试放在最后就很乱,就应该做一点测一点)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

这里安利一个插件GenerateAllSetter(自动生成所有的set方法,原则上一切不涉及业务的代码都可以生成,不管是插件还是框架都是帮你解决重复的又不涉及业务的代码,让开发者专注于业务代码的编写,所以平时就要多学习这种“偷懒思维”,偷懒促使科技的进步)

把光标放在user上,按下alt+enter,选择第二个,调用该对象的所有的set方法,并指定默认值
在这里插入图片描述
在这里插入图片描述
把数据库有默认值的字段删掉

在这里插入图片描述
还可以加一个断言:

Assertions.assertTrue(result);

然后执行测试,发现报错了。记录一下:
bug的原因是:我们在设计数据库的字段时,采用的是驼峰命名法,然后利用插件生成的实体类属性是和数据库的命名保持一致,也是驼峰,但是mybatisplus在通过反射由实体类的属性推向数据库的字段时(这里应该是生成sql,这也就知道了为什么没有映射文件也可以操作数据库,那就是mybatisplus帮我们生成了sql),会将驼峰转换成下划线,所以就出现了“在‘字段列表’中找不到user_account”,当然找不到呀,因为我们数据库是使用驼峰命名,这也就是暗示我们数据库约定应该是采用下划线的命名方法。

解决办法:在application.yml关闭默认的转换:

在这里插入图片描述
再次执行测试,成功。

这篇博客就到这了,事无巨细,写博客的过程也学到很多,费曼学习法。
下一篇正式写业务:登录和注册逻辑。

参考:别人的笔记和自己的笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kplusone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值