SpringBoot第一个项目---用户注册部分

(1)测试类的使用

1> 左侧有单个执行的按钮,@Test注解是JUnit测试框架中的,作为测试用例使用

2> @Autowired注解,是Spring依赖注入(DI)机制的一部分,Spring将自动提供类所需要的依赖项,而不需要实例化或查找

3> 数据库连接池---优化数据库访问

4> 新建单元测试类UserMapperTests

package com.cy.practice1_store.mapper;


import com.cy.practice1_store.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


//标注为测试类,不会同项目一起打包
@SpringBootTest
//启动这个单元测试类
@RunWith(SpringRunner.class)
public class UserMapperTests {
    @Autowired
    private UserMapper userMapper;

    /**
     * 单独运行,做单元测试
     * 1、必须要@Test
     * 2、返回为void
     * 3、参数列表不指定任何类型
     * 4、必须为public
     */
    @Test
    public void insert(){
        User user = new User();
        user.setUsername("lwj");
        user.setPassword("123");
        Integer rows = userMapper.insert(user);
        System.out.println(rows);
    }

    @Test
    public void findByUsername(){
        User user = userMapper.findByUsername("lwj");
        System.out.println(user);
    }



}

(2)有关mapper的文件结构

示例:User对象

1> User:

package com.cy.practice1_store.entity;

import lombok.Data;
import org.springframework.stereotype.Component;

import java.io.Serializable;

/**
 * 用户实体类
 * @Author lwj
 */
@Component
@Data
public class User extends BaseEntity implements Serializable {
    private Integer uid;
    private String username;
    private String password;
    private String salt;
    private String phone;
    private String email;
    private Integer gender;
    private String avatar;
    private Integer isDelete;
}

 @Data是Lombok库的一个注解,用于自动生成 getter、setter、equals、hashCode 和 toString 等常用方法来减少代码冗长并提高代码可读性。

@Component将 Java 类标记为 Spring bean,允许 Spring 在应用程序上下文中检测、实例化和管理该类的实例。

2> UserMapper:

package com.cy.practice1_store.mapper;

import com.cy.practice1_store.entity.User;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author 86152
 */
@Mapper
public interface UserMapper {
    /**
     *插入用户
     * @param user 用户数据
     * @return 受影响的行数
     */
    Integer insert(User user);

    /**
     *根据用户名查询是否存在用户
     * @param username 用户名
     * @return 找到返回User,没有找到返回null
     */
    User findByUsername(String username);
}

3> 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.cy.practice1_store.mapper.UserMapper">
    <resultMap id="UserEntityMap" type="com.cy.practice1_store.entity.User">
        <!-- 主键不可以忽略 -->
        <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>

    <!-- 插入用户数据:Integer insert(User user) -->
    <!-- useGeneratedKeys 表示自增 -->
    <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>

    <!-- 根据用户名查询用户数据:User findByUsername(String username) -->
    <!--
         resultType: 表示查询的结果集类型,,指定映射类的类型,如上面的com.cy.practice1_store.entity.User
         resultMap: 因为有些表的资源和类的对象属性字段名称不一致,如is_delete和isDelete,需要进行映射
    -->
    <select id="findByUsername" resultMap="UserEntityMap">
        SELECT
            *
        FROM
            t_user
        WHERE
            username = #{username}
    </select>
</mapper>

 4> IUserService:

package com.cy.practice1_store.service;

import com.cy.practice1_store.entity.User;


/**
 * 用户模块业务层接口
 * @author 86152
 */
public interface IUserService {

    /**
     * 用户注册
     * @param user
     */
    void reg(User user);
}

5> UserServiceImpl:

package com.cy.practice1_store.service.impl;

import com.cy.practice1_store.entity.User;
import com.cy.practice1_store.mapper.UserMapper;
import com.cy.practice1_store.service.IUserService;
import com.cy.practice1_store.service.ex.InsertException;
import com.cy.practice1_store.service.ex.UsernameDuplicatedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public void reg(User user) {
        String username = user.getUsername();
        User result = userMapper.findByUsername(username);

        //用户名已存在
        if(result != null){
            throw new UsernameDuplicatedException("用户名被占用");
        }

        //补全数据
        user.setIsDelete(0);
        user.setCreatedUser(user.getUsername());
        user.setModifiedUser(user.getUsername());
        Date date = new Date();
        user.setCreatedTime(date);
        user.setModifiedTime(date);

        //未知异常
        Integer rows = userMapper.insert(user);
        if(rows != 1){
            throw new InsertException("注册过程中产生了未知异常");
        }
    }
}

上面就是一个持久层、业务层大概的结构例子

下面为简单的控制层使用,以及前端js部分代码

控制层:

package com.cy.practice1_store.controller;

import com.cy.practice1_store.service.ex.InsertException;
import com.cy.practice1_store.service.ex.ServiceException;
import com.cy.practice1_store.service.ex.UsernameDuplicatedException;
import com.cy.practice1_store.util.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * @author 86152
 */
public class BaseController {

    public static final int OK = 200;

    @ExceptionHandler(ServiceException.class)
    public JsonResult<Void> handleException(Throwable e){
        JsonResult<Void> result = new JsonResult<>(e);
        if(e instanceof UsernameDuplicatedException){
            result.setState(4000);
            result.setMessage("用户名被占用");
        }else if(e instanceof InsertException){
            result.setState(5000);
            result.setMessage("未知异常");
        }
        return result;
    }
}
package com.cy.practice1_store.controller;

import com.cy.practice1_store.entity.User;
import com.cy.practice1_store.service.IUserService;
import com.cy.practice1_store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 86152
 * RestController是Controller和ResponseBody的集合
 */
@RestController
@RequestMapping("users")
public class UserController extends BaseController{
    @Autowired
    private IUserService userService;

    @RequestMapping("reg")
    public JsonResult<Void> reg(User user){
        userService.reg(user);
        return new JsonResult<>(OK);
    }
}

js代码:

<script type="text/javascript">
			$("#btn-reg").click(function () {
				$.ajax({
					url: "/users/reg",
					type: "POST",
					data: $("#form-reg").serialize(),
					dataType: "json",
					success: function (json) {
						if(json.state == 200){
							alert("注册成功");
						}else{
							alert("注册失败" + json.message);
						}
					},
					error: function (xhr) {
						alert("注册时产生未知错误" + xhr.status)
					}
				})
			})
		</script>

其中控制层的/users/reg就对应于ajax的url内容

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值