Spring Boot 项目7:用户注册-持久层开发

216 阅读3分钟

写在前面

上一篇文章我们进行了用户注册接口开发的准备工作,这篇文章我们进行用户注册的持久层开发

用户注册-持久层开发

我们的用户注册-持久层开发需要进行的工作包括如下:

  1. 规划需要执行的 SQL 语句
  2. 设计接口和抽象方法
  3. 编写映射

规划需要执行的SQL语句

用户注册,我们需要执行的 SQL 语句就是往 t_user 表中插入数据,插入前需要判断用户是否已经存在(根据用户名来判断,因为我们创建用户表的时候设置了用户名唯一),所以我们在执行插入语句前先要执行一条查询语句,就是在t_user 表中根据用户名去查询,用户不存在的话才允许注册,用户已存在的话在业务层进行处理。

设计接口和抽象方法

我们在store目录下新建一个接口mapper.UserMapper,编写代码如下:

package com.cy.store.mapper;

import com.cy.store.entity.User;

/** 用户模块的持久层接口 */
public interface UserMapper {
    /**
     * 插入用户
     * @param user 用户信息
     * @return 受影响的行数,根据返回值判断是否执行成功
     */
    Integer insert(User user);

    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 查到用户则返回对应用户信息,没查到则返回null
     */
    User findByUsername(String username);
}

还需要在启动类配置Mapper接口的路径,代码如下,MapperScan注解指定当前项目中的Mapper接口的路径,在项目启动时会自动加载所有的接口文件:

...
@SpringBootApplication
@MapperScan("com.cy.store.mapper")
public class StoreApplication {
    ...
}

编写映射

我们的映射文件放在 resources 目录下,映射文件的名称和接口名称保持一致,我们在 resources 目录新建一个mapper目录,并在mapper目录下新建一个UserMapper.xml文件,编写代码如下:

  • namespace属性用于指定当前的映射文件和哪个接口进行映射,值为指定接口的文件的路径
  • resultMap标签用来自定义映射规则,当表的字段和实体类的属性字段不一致时,需要自定义映射规则,其中id属性表示给自定义映射规则分配一个唯一的id值,type属性表示结果集和哪个实体类进行映射
  • id标签用来映射主键
  • result标签用来映射不一致的字段,一致的字段可以省略不写
  • insert标签用来写插入SQL语句,其中id属性表示映射的接口中的方法的名称,useGeneratedKeys属性表示是否开启某个字段的自增,keyProperty属性表示要自增的字段,SQl语句写在标签内部即可
  • select标签用来写查询SQL语句,其中id属性和insert标签的id属性一样,表示映射的接口中的方法的名称,resultMap属性是当表的字段和类的属性字段不一致时,用来自定义查询结果集的映射规则,值为resultMap标签的id属性的值
<?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.store.mapper.UserMapper">
    <!--  因为t_user表的字段和用户实体类的字段不一致,比如is_delete和isDelete,所以要自定义映射规则  -->
    <resultMap id="UserEntityMap" type="com.cy.store.entity.User">
        <id column="uid" property="uid"></id>
        <result column="is_delete" property="isDelete"></result>
        <result column="created_user" property="createdUser"></result>
        <result column="created_time" property="createdTime"></result>
        <result column="modified_user" property="modifiedUser"></result>
        <result column="modified_time" property="modifiedTime"></result>
    </resultMap>
    
    <!--  对应我们上面写的insert()接口,通过设置namespace找到对应文件的接口  -->
    <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>

    <!--  对应我们上面写的findByUsername()接口  -->
    <select id="findByUsername" resultMap="UserEntityMap">
        select * from t_user where username = #{username}
    </select>
</mapper>

以上都完成后,还需要将mapper文件的位置注册到配置文件中,打开application.properties文件,添加如下代码:

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

写在最后

以上就是用户注册-持久层开发的全部内容