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'日志-最后修改时间', }
对应 基类
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
前
后