Smiling & Weeping

                    ----我本没喜欢的人,

                      见你的次数多了,

                      也就有了。

1.创建数据表

1.1.选中数据表:

use store

1.2.创建t_user表:

2创建用户实体类

2.1通过表的结构提取出表的公共字段,放在一个实体类的基类中,起名BaseEntity基类中

  主要作用是声明变量(私有),再使用get和set(Alt+insert生成),注意驼峰命名法

2.2创建用户的实体类,需要继承BaseEntity基类

  public class User extends BaseEntity implements Serializable{}

  注意:一定要声明1.get和set方法 2.equals()和hashcode()方法 3.toString()方法

3.注册-持久层

通过MyBatis来操作数据库,在做mybatis开发的流程

3.1规划需要执行的SQL语句

3.1.1用户的注册功能,相当于在做数据的插入操作

insert into t_user(username , password) values(值列表)

3.1.2在用户注册时要去先查询当前的用户名是否存在,如果存在则不能注册相当于使用一条查询语句

select * from t_user where usename=?

3.2设计接口和方法

定义Mapper接口在项目的目录结构下首先创建一个mapper包,在这个包下再根据不同的功能模块创建mapper接口,创建一个UserMapper的接口(Interface)。要在接口中定义这两个SQL语句抽象方法。
在UserMapper中不建议使用@Mapper,因为一个程序中会有很多的@Mapper
因此在StoreApplication中使用MapperScan
//MapperScan注解指定当前项目中的Mapper接口路径的位置,在项目启动的时候会自动加载所有的接口
@MapperScan("com.cy.mapper")

3.3编写映射

3.3.1定义xml映射文件,与对应接口进行关联。所有的映射文件需要放置resources目录下,在这个目录下创建一个mapper文件夹,然后在这个文件夹下存放Mapper的映射文件。

配置文件:(在官网可以直接拿到https://mybatis.org/mybatis-3/zh/getting-started.html)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>

//selct语句可以暂时删掉,自己进行声明

</mapper>

 1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <!--namespace的属性:用于指定当前的映射文件和哪个接口进行映射,需要制定接口的文件路径,需要标注包的完整路径结构-->
6 <!--自定义映射规则:resultMap标签来完成映射规则的定义-->
7 <mapper namespace="com.cy.store.mapper.UserMapper">
8
9 <!--
10 id属性:表示给这个映射规则分配一个唯一的id值,对应的就是resultMap="id"属性的取值
11 type属性:取值是一个类,表示的是数据库中查询的结果与Java中哪个实体类进行结果集的映射
12 -->
13 <!--不能使用resultType是因为字段名称不一致-->
14 <resultMap id="UserEntityMap" type="com.cy.store.entity.User">
15 <!--只做一件事:将表的资源和类的属性不一致的字段进行匹配指定,名称一致的字段可以省略不写-->
16 <!--
17 配合完成名称不一致的映射
18 column属性:表示表中资源名称
19 property属性:表示类中的属性名称
20 -->
21 <!--在定义映射规则时主键是不可以省略的,不论名称是否一致-->
22 <id column="uid" property="uid"></id>
23 <result column="is_delete" property="isDelete"></result>
24 <result column="created_user" property="createdUser"></result>
25 <result column="created_time" property="createdTime"></result>
26 <result column="modified_user" property="modifiedUser"></result>
27 <result column="modified_time" property="modifiedTime"></result>
28 </resultMap>
29 <!--id属性:表示映射的接口中方法的名称,直接在标签的内部来编写SQL语句-->
30 <!--
31 useGeneratedKeys属性:表示开启某个字段的值递增(一般主键设置为递增)
32 keyProperty属性:表示将表中的哪个字段作为主键进行递增
33 -->
34 <insert id="insert" useGeneratedKeys="true" keyProperty="uid">
35 INSERT INTO t_user (
36 username,password,salt,phone,email,gender,avatar,is_delete,
37 created_user,created_time,modified_user,modified_time
38 )VALUES(
39 #{username},#{password},#{salt},#{phone},#{email},#{gender},#{avatar},#{isDelete},
40 #{createdUser},#{createdTime},#{modifiedUser},#{modifiedTime}
41 )
42 </insert>
43 <!--select语句在执行的时候,查询的是一个对象,多个对象-->
44 <!--
45 若是单个对象:
46 resultType:表示查询的结果集类型,只需要指定对应映射类的类型,并且包含完整包接口
47 resultMap:表示当表的资源和类的对象属性的字段名称不一致时,来自定义查询结果集的映射规则
48 -->
49 <select id="findByUsername" resultMap="UserEntityMap">
50 SELECT * FROM t_user WHERE username = #{username}
51 </select>
52 </mapper>

namespace属性:用于指定当前映射文件和哪个接口进行映射,需要指定接口的文件路径,需要标注包的完整路径接口

id属性:表示映射的接口中方法的名称,直接在标签的内部来编写SQL语句

比如com.cy.store.mapper.UserMapper

3.3.2创建接口对应的映射文件,遵循和接口的名称一致即可。创建UserMapper.xml
3.3.3配置接口方法对应上的SQL语句。需要借助标签来完成,insert、update、delete、select,对应的是SQL的增删改查操作
values后面是小括号
3.3.4将mapper文件位置注册到properties对应的配置文件中
mybatis.mapper-locations=classpath:mapper/*.xml
3.3.5单元测试:每个独立的层编写完毕之后需要编写单元测试方法,来测试当前的功能,在test包结构下创建一个mapper包,在这个包下在创建持久层的功能测试
4.注册-业务层
4.1规划异常
4.1.1用户在进行注册的时候可能会产生用户名被占用的错误,抛出一个异常:
正在执行数据插入操作的时候,服务器、数据库宕机。处于正在执行插入的过程中所产生的异常:insertException
RuntimeException异常,作为这类异常的子类,然后再去定义具体的异常类型来继承这个异常,业务层异常的基类,ServiceException异常,这个异常继承RuntimeException异常。
4.1.1异常E,接口I,implement
4.1.1根据业务层不同的功能来详细定义具体的异常的类型,统一的去继承ServiceException异常类
4.2设计接口和抽象方法
4.2.1创建一个实现类UserServicelmpl类,需要实现这个接口,并且实现抽象的方法
4.2.2单元测试包下创建一个UserServiceTests
4.2.3一定要保存盐值
5.注册-控制层
5.1创建响应
状态描述信息、数据。这部分功能封装一个类中,将这个类作为方法值,返回给前端浏览器
5.2设计相关的请求
依据当前的业务功能模块进行请求的设计
请求路径:/users/reg
请求参数:User user
请求类型:POST
响应结果:JsonResult<Void>
5.3处理请求
5.3.1创建一个控制层对应的类UserController类。依赖于业务层的接口。
5.4控制层优化设计
在控制抽离一个父类,在这个父类中统一的去处理关于异常的相关操作。编写一个Basecontroller类,统一处理异常。
6.前端业务开发
6.1在register页面中编写发送请求的方法,点击事件来完成。选选中对应的按钮(¥(“选择器”)),再去添加点击事件,$.ajax()函数发送异步请求
6.2JQUery封装了一个函数,称之为$.ajax函数通过对象来调用ajax函数,可以异步加载相关的请求。依靠的是JavaScript提供的一个对象XHR(XMLHTTPResponse),封装了这个对象
6.3ajax使用方式,语法结构:
需要传递一个方法体作为方法的参数来使用
$.ajax();
function fun(){
}
但一般不这么使用,一般:一对大括号称之为方法体,ajax接收多个参数,参数与参数之间要求使用逗号进行分割,每个参数使用:分割,参数的组成部分一个是参数的名称(不能随变定义),是参数的值,,参数的值要求使用字符串来表识:
$.ajax({
url:"",
type:"",
data:"",
dataType:"",
sucess:"",
sucess: function(){
},
error: function(){
}
});
ajax函数参数的含义:
url : 表示请求的地址(URL地址),不能包含参数列表部分的内容,例如:“localhost:8080/users/reg”
type : 请求类型(GET和POST请求的类型)。例如:type:"POST"
data : 向指定的请求URL地址发送数据。例如:data:"username=tom&pwd=123"
dataType : 提交的数据类型一般指定为JSON类型。dataType:“json”
success : 当服务器正常响应客户端时,会自动的调用succees参数方法,并将服务器返回的数据以参数的方式传递给这个方法的参数上
error : 当服务器未正常响应客户端时,会自动的调用error参数方法,并将服务器返回的数据以参数的方式传递给这个方法的参数上
6.5js代码可以独立存放在一个JS的文件里或者声明在一个script标签里

我们为了进行一些数据的控制,我们对基本类型我们使用包装类来完成,包装类中提供了一些相关的API,所以用的时候,可以调用一些相关的API进行一些关于逻辑上的判断,比较方便

当然了对于相关变量一定要注意驼峰命名法

//任何实体类get和set方法、equals和hashcode()方法、toString方法
在UserMapper中不建议使用@Mapper,因为一个程序中会有很多的@Mapper
因此在StoreApplication中使用MapperScan
//MapperScan注解指定当前项目中的Mapper接口路径的位置,在项目启动的时候会自动加载所有的接口
@MapperScan("com.cy.mapper")

JAVA-Springboot实践项目-用户注册的更多相关文章

  1. Java SpringBoot 项目构建 Docker 镜像调优实践

    PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...

  2. 《Java 程序设计》课堂实践项目 课后学习总结

    <Java 程序设计>课堂实践项目 课后学习总结 String类的使用(sort) 目录 Linux命令(sort) 课堂实践 课后思考 学习老师的代码之后的思考:int与Integer ...

  3. 《Java 程序设计》课堂实践项目汇总链接

    1.<Java 程序设计>课堂实践项目-命令行参数 2.<Java 程序设计>课堂实践项目-mini dc 3.<Java 程序设计>课堂实践项目-Arrays和S ...

  4. 《Java 程序设计》课堂实践项目-类定义

    <Java 程序设计>课堂实践项目类定义 课后学习总结 目录 改变 类定义实验要求 课堂实践成果 课后思考 改变 修改了博客整体布局,过去就贴个代码贴个图很草率,这次布局和内容都有修改. ...

  5. 《Java 程序设计》课堂实践项目-简易计算器

    <Java 程序设计>课堂实践项目简易计算器 课后学习总结 目录 改变 简易计算器实验要求 课堂实践成果 课后思考 改变 修改了博客整体布局,过去就贴个代码贴个图很草率,这次布局和内容都有 ...

  6. 《Java 程序设计》课堂实践项目-Arrays和String单元测试

    <Java 程序设计>课堂实践项目-Arrays和String单元测试 课后学习总结 目录 改变 Arrays和String单元测试实验要求 课堂实践成果 课后思考 改变 修改了博客整体布 ...

  7. 20155308 2016-2017-2《Java程序设计》课堂实践项目

    20155308 2016-2017-2<Java程序设计>课堂实践项目 在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅 ...

  8. # 20155308 2016-2017-2《Java程序设计》课堂实践项目 5月17日

    20155308 2016-2017-2<Java程序设计>课堂实践项目 5/17 本次因为git出现了问题,所以没有按时提交我的代码 问题一 在IDEA中对P145 MathTool.j ...

  9. 20155320 2016-2017-2《Java程序设计》第十二周课堂实践项目

    20155320 2016-2017-2<Java程序设计>第十二周课堂实践项目 1.修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 2.在IDEA中以TDD的 ...

  10. 20155321 2016-2017-2《Java程序设计》课堂实践项目2

    20155321 2016-2017-2<Java程序设计>课堂实践项目2 实践内容 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: ...

随机推荐

  1. 主流原型设计工具-Axure

    原型设计工具是一种用于设计和验证用户界面的软件工具,它可以帮助用户将界面设计想法转化为可交互的原型.以下是几种常见的原型设计工具: Axure:Axure是一款强大的原型设计工具,可以创建高保真的原型 ...

  2. [汽车]车架号(VIN)的设计与规范

    1 车架号概述 VIN是英文Vehicle Identification Number(车辆识别代码)的缩写,也就是我们平时所说的车架号.大架号. 总共由17位字符组成,是汽车唯一的身份识别信息,好比 ...

  3. MySQL8新特性窗口函数详解

    本文博主给大家详细讲解一波 MySQL8 的新特性:窗口函数,相信大伙看完一定能有所收获. 本文提供的 sql 示例都是基于 MySQL8,由博主亲自执行确保可用 博主github地址:http:// ...

  4. 使用hashicorp Raft开发分布式服务

    使用hashicorp Raft开发高可用服务 开发raft时用到的比较主流的两个库是Etcd Raft 和hashicorp Raft,网上也有一些关于这两个库的讨论.之前分析过etcd Raft, ...

  5. 前端基于 radio 增强单选框组件

    前端基于radio增强单选框组件, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12977 效果图如下:       # ## ...

  6. 面试官:讲讲MySql索引失效的几种情况

    索引失效 准备数据: CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAUL ...

  7. Set 接口及其常用方法

    Set 接口基本介绍 Set接口是Collection接口的一个子接口,其主要特点如下: 不允许重复元素:Set接口的实现类不会包含重复的元素.更正式地说,不包含任何一对使得e1.equals(e2) ...

  8. java.lang.IndexOutOfBoundsException

    原因:一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误 解决方案:用 array[] 的  .length 查看 数组的长度

  9. 力扣 662 https://leetcode.cn/problems/maximum-width-of-binary-tree/

    需要了解树的顺序存储 如果是普通的二叉树 ,底层是用链表去连接的 如果是满二叉树,底层用的是数组去放的,而数组放的时候 会有索引对应 当前父节点是索引i,下一个左右节点就是2i,2i+1 利用满二叉树 ...

  10. 通信原理知识点总结(XDU网信通原)

    因为感觉第2章和第7章内容特别乱,当时老师讲的时候好像也没有按照一个正确的顺序来讲,所以我就把这两部分的内容按照结构顺序整理了一下,这样更便于理解和记忆 第2章 无线信道传输特性 显示不全点链接看完整 ...