用户注册【项目 商城】2

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 用户注册【项目 商城】2

1 创建数据表

1.选中数据库

use store

2.创建t_user表:

CREATE TABLE `t_user`  (
    uid INT AUTO_INCREMENT COMMENT '用户id',
  username VARCHAR(20) NOT NULL UNIQUE  COMMENT '用户名',
  password CHAR(32) NOT NULL COMMENT'密码',
  salt CHAR(36) COMMENT'盐值',
  phone VARCHAR(20)COMMENT'电话号码',
  email VARCHAR(30)COMMENT '电子邮箱',
    gender INT COMMENT  '性别:0-女,1-男',
    avatar VARCHAR(50) COMMENT'头像',
  is_delete INT COMMENT'是否删除:0-未删除,1-已删除',
  created_user VARCHAR(20)  COMMENT'日志-创建人',
    modified_user VARCHAR(20) COMMENT'日志-最后修改执行人',
  created_time DATETIME COMMENT'日志-创建时间',
  modified_time DATETIME COMMENT'日志-最后修改时间',
    PRIMARY KEY (uid)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

对应t_user.sql


2.创建用户实体类

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

package com.cy.store.entity;
import jdk.nashorn.internal.objects.annotations.Constructor;
import lombok.*;
import org.springframework.context.annotation.Configuration;
import java.io.Serializable;
import java.util.Date;
/**
 * 作为实体类的基类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class BaseEntity implements Serializable {
    private String createdUser;        //created_user VARCHAR(20)  COMMENT'日志-创建人',
    private String modifiedUser;         //modified_user VARCHAR(20) COMMENT'日志-最后修改执行人',
    private Date createdTime ;       //created_time DATETIME COMMENT'日志-创建时间',
    private Date modifiedTime ;        //modified_time DATETIME COMMENT'日志-最后修改时间',
}

Lombok使用详解

对应 基类


2.创建用户的实体类。需要继承BaseEntity基类

package com.cy.store.entity;
import lombok.*;
import java.io.Serializable;
/**
 * 用户的实体类 StringBoot约定大于配置
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User extends BaseEntity implements Serializable {
    private Integer uid;              //    uid INT AUTO_INCREMENT COMMENT '用户id',
    private String username;          //    username VARCHAR(20) NOT NULL UNIQUE  COMMENT '用户名',
    private String password;          //    password CHAR(32) NOT NULL COMMENT'密码',
    private String salt;              //    salt CHAR(36) COMMENT'盐值',
    private String phone;             //    phone VARCHAR(20)COMMENT'电话号码',
    private String email;             //    email VARCHAR(30)COMMENT '电子邮箱',
    private Integer gender;           //    gender INT COMMENT  '性别:0-女,1-男',
    private String avatar;            //    avatar VARCHAR(50) COMMENT'头像',
    private Integer isDelete;         //    is_delete INT COMMENT'是否删除:0-未删除,1-已删除',
}

对应User


3.用户注册-持久层

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

3.1规划SQL语句

1.用户的注册功能,相当于做数据的插入操作。

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

2.在用户的注册时首先去查询当前的用户名是否存在,如果存在则不能进行注册。相当于是一条查询语句。

select * from t_user where username=?

3.2创建接口与抽象方法

1.定义Mapper接口。在项目的目录结构下首先创建一个mapper文件夹,在这个包下在根据不同的功能模块来创建mapper接口。创建一个UserMapper的接口。要在接口中定义这两个sql语句抽象方法。

package com.cy.store.mapper;
import com.cy.store.entity.User;
/**
 * 用户模块的持久层接口
 */
//@Mapper
public interface UserMapper {
    /**
     * 插入用户的数据
     * @param user 用户的数据
     * @return 受影响的行数(增、删、改,都有受影响的行数作为返回值,可以根据返回值来判断是否执行)
     */
    Integer insert(User user);
    /**
     * 根据用户名来查询用户的数据
     * @param username 用户名
     * @return 如果找到对应的用户则返回用户的数据,否则返回null值
     */
    User findByUsername(String username);
}

2.在启动类配置mapper接口文件的位置

//MapperScan注解指定当前项目中的Mapper接口的路径的位置
@MapperScan("com.cy.store.mapper")

3.3编写映射

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

2.创建接口的映射文件,遵循和接口名称保持一致即可。创建一个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">
<!--namespace属性:用于指定当前的映射文件和哪个接口进行映射,需要指定接口的文件路径,需要标注包的完整路径接口-->
<mapper namespace="com.cy.store.mapper.UserMapper">
</mapper>

3.配置接口中的方法对应上SQL语句。需要借助标签来完成。insert\update\delete\select,对应sql语句的增删改查操作。

   <!--自定义映射规则:  resultMap标签来完成自定义映射规则  -->
    <!--
        id属性:标签给这个映射负责分配一个唯一的id值,对应的就是resultMap="id属性"
        type属性:取值是一个类,表示数据库中的查询结果与java中的哪一个实体类进行结果集的映射    
    -->
    <resultMap id="UserEntityMap" type="com.cy.store.entity.User">
        <!--  将表的字段和类的属性不一致的字段进行匹配指定,名称一致可以省略不写      -->
        <!--
            配合完成名称不一致的映射
              column 属性:表中的字段名称
              property 属性:类中的属性名称  
        -->
        <!--  在定义映射规则时,注解不可以省略的  -->
        <id column="uid" property="uid"/>
        <result column="is_delete" property="isDelete"/>
        <result column="created_user" property="createdUser"/>
        <result column="created_time" property="createdTime"/>
        <result column="modified_user" property="modifiedUser"/>
        <result column="modified_time" property="modifiedTime"/>
    </resultMap>
    <!-- id属性:表示映射的接口中方法的名称,直接在标签的内容中编写SQL -->
    <!--
            useGeneratedKeys属性:表示开启某个字段的值递增(主键设置为递增)
            keyProperty属性:表示将表中的哪个字段作为主键进行递增
    -->
    <insert id="insert" useGeneratedKeys="true" keyProperty="uid">
        INSERT INTO
            t_user (username, password, salt, phone, email, gender, avatar, is_delete, created_user, created_time, modified_user, modified_time)
        VALUES
        (#{username}, #{password}, #{salt}, #{phone}, #{email}, #{gender}, #{avatar}, #{isDelete}, #{createdUser}, #{createdTime}, #{modifiedUser}, #{modifiedTime})
    </insert>
    <!--select语句在执行的时候,查询的结构是一个对象,多个对象    -->
    <!--
        resultType:表示查询的结构集类型,只需要指定对应类的类型,并且包含完整接口:resultType="com.cy.store.entity.User"
        resultMap: 标签当表的字段和类的属性字段名称不一致时,来自定义查询结果集的映射规则
    -->
    <select id="findByUsername" resultMap="UserEntityMap">
        SELECT * FROM t_user WHERE username = #{username}
    </select>

对应UserMapper


3.将mapper文件的位置注册到properties对应的配置文件中。

mybatis.mapper-locations=classpath:mapper/*.xml

3.单元测试:每一个独立的层编写完毕后需要编写单元测试方法,来测试当前的功能。在test包结构下创建一个mapper包,在这个包下在创建对持久层的测试。

package com.cy.store.mapper;
import com.cy.store.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
//@SpringBootTest:表示标注当前的类是测试类,不会随同项目一块打包
@SpringBootTest
//@RunWith:表示启动这个单元测试类(单元测试类是不能够运行的),需要传递一个参数,必须是SpringRunner的实例类型
//@RunWith(SpringRunner.class)
public class UserMapperTests {
    //idea有检测的功能,接口是不能直接创建Bean的(动态代理技术来解决),
    //File | Settings | Editor | Inspections
    //Spring | Spring Core | Code | Autowiring for bean class
    //error-->warning
    @Autowired
    private UserMapper userMapper;
    /**
     * 单元测试方法,就可以单独独立运行,不用启动整个项目,可以做单元测试,提升了代码的测试效率
     * 1.必须被Test注解所修饰
     * 2.返回值类型必须是void
     * 3.方法的参数列表不指定任何类型
     * 4.方法的访问修饰符必须是public
     */
    @Test
    public void insert(){
        User user=new User();
        user.setUsername("tim");
        user.setPassword("123");
        Integer row = userMapper.insert(user);
        System.out.println(row);
    }
    @Test
    public void findByUsername(){
        User user = userMapper.findByUsername("tim");
        System.out.println(user);
    }
}

UsermapperTest


修改权限

//File | Settings | Editor | Inspections

//Spring | Spring Core | Code | Autowiring for bean class
//error–>warning







测试


相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
2月前
|
移动开发 容器
订水商城H5实战教程-04用户注册
订水商城H5实战教程-04用户注册
|
2月前
|
小程序 程序员 开发工具
电商小程序05用户注册
电商小程序05用户注册
|
2月前
|
JavaScript 数据安全/隐私保护
|
2月前
|
数据安全/隐私保护
|
26天前
|
前端开发 Python
五. Django项目之电商购物商城 -- 短信验证码生成
五. Django项目之电商购物商城 -- 短信验证码生成
|
2月前
|
容器
会员管理系统实战开发教程06-会员充值
会员管理系统实战开发教程06-会员充值
|
2月前
|
JavaScript 前端开发 索引
会员管理系统实战开发教程04-会员开卡
会员管理系统实战开发教程04-会员开卡
|
11月前
|
SQL JSON 前端开发
加入购物车【项目 商城】
加入购物车【项目 商城】
37 0
|
9月前
|
前端开发 JavaScript 容器
会员管理系统实战开发教程05-会员开卡
会员管理系统实战开发教程05-会员开卡
|
8月前
|
NoSQL 数据库 Redis
淘东电商项目(20) -会员唯一登录
淘东电商项目(20) -会员唯一登录
46 0