写在前面
上一篇文章我们进行了用户注册接口开发的准备工作,这篇文章我们进行用户注册的持久层开发
用户注册-持久层开发
我们的用户注册-持久层开发需要进行的工作包括如下:
- 规划需要执行的 SQL 语句
- 设计接口和抽象方法
- 编写映射
规划需要执行的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
写在最后
以上就是用户注册-持久层开发的全部内容