初始化项目
通过spring官网初始化SpringBoot项目
使用idea工具打开Springboot项目,项目结构
添加pom依赖
<!--springboot启动类-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--webmvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--devtools自动部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<!--devtools自动部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
添加maven远程仓库阿里云镜像
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
application.yml相关配置
server:
port: 9090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/DatabaseName?serverTimezone=GMT%2b8
mybatis:
mapper-locations: classpath:mapper/*.xml #扫描所有mybatis的xml文件
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql
使用navicat数据库可视化管理工具管理MySQL数据库
一、实现用户注册功能
user表
CREATE TABLE `user` (
`user_id` int NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_account` varchar(255) DEFAULT NULL COMMENT '用户账号',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`salt` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '盐值',
`user_name` varchar(255) DEFAULT NULL COMMENT '用户姓名',
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb3;
实体类User
@Getter
@Setter
public class User {
private Integer userId;
private String userAccount;
private String password;
private String salt;
private String userName;
private String email;
}
mapper接口实现类
public interface UserMapper {
/**
* 插入一条用户数据
* @param user
* @return 受影响的行数
*/
Integer insert(User user);
/**
* 根据用户名查询用户数据
* @param username
* @return 如果找到对应的用户则返回这个用户的数据,没有找到返回null值
*/
User findByUsername(String username);
/**
* 根据id删除一条用户
* @param id
* @return 返回受影响行数
*/
Integer deleteById(Integer id);
/**
* 更新一条数据
* @param user
* @return 返回受影响的行数
*/
Integer update(User user);
}
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.example.demo.mapper.UserMapper">
<!--自定义映射规则-->
<resultMap id="DifUser" type="com.example.demo.entity.User">
<id column="user_id" property="userId"></id>
<result column="user_account" property="userAccount"></result>
<result column="user_name" property="userName"></result>
<result column="email" property="email"></result>
</resultMap>
<!--id指定接口方法的名称-->
<insert id="insert">
INSERT INTO user(user_account,password,salt,user_name,email) values (#{userAccount},#{password},#{salt},#{userName},#{email})
</insert>
<!--当表的字段和类的对象的属性不一致时,来自定义查询结果集的映射规则-->
<select id="findByUsername" resultMap="DifUser">
SELECT * FROM user WHERE user_name=#{userName}
</select>
<delete id="deleteById">
DELETE FROM user WHERE user_id=#{userId}
</delete>
<update id="update">
update user set user_account=#{userAccount},user_name=#{userName},email=#{email} where user_id=#{userId}
</update>
</mapper>
IUserService:用户注册方法在这个接口中实现
public interface IUserService {
/**
* 用户注册方法
* @param user 用户的数据对象
*/
void reg(User user);
}
UserServiceImpl:实现用户注册功能相关逻辑
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public void reg(User user) {
User result = userMapper.findByUsername(user.getUserName());
//如果结果不为null,则抛出用户名被占用异常
if (result!=null){
throw new UsernameDuplicatedException("用户名被占用");
}else {
//如果结果为null,则执行注册业务
String oldPassword=user.getPassword();
String salt= UUID.randomUUID().toString().toUpperCase();
user.setSalt(salt);
String md5Password = getMd5Password(oldPassword, salt);
System.out.println(md5Password);
user.setPassword(md5Password);
Integer rows = userMapper.insert(user);
if (rows!=1){
throw new InsertException("注册失败");
}
}
}
/**
* md5算法加密
*/
private String getMd5Password(String password,String salt){
for (int i = 0; i < 3; i++) {
//三次加密
password = DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()).toUpperCase();
}
//返回加密的密码
return password;
}
}
ServiceException :业务异常处理基类
public class ServiceException extends RuntimeException {
public ServiceException() {
super();
}
public ServiceException(String message) {
super(message);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(Throwable cause) {
super(cause);
}
protected ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
InsertException:插入方法异常
public class InsertException extends ServiceException {
public InsertException() {
super();
}
public InsertException(String message) {
super(message);
}
public InsertException(String message, Throwable cause) {
super(message, cause);
}
public InsertException(Throwable cause) {
super(cause);
}
protected InsertException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}