先在数据库创建表,并插入一条数据,方便后续测试
依次执行如下SQL:
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` CHAR(255) NOT NULL COMMENT '用户名称',
`password` VARCHAR(255) DEFAULT NULL COMMENT '用户密码',
`head_url` VARCHAR(255) DEFAULT NULL COMMENT '用户头像',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` INT(1) DEFAULT '0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8
INSERT INTO `db_spring_vue`.`user` (`username`, `password`, `head_url`, `create_time`, `update_time`, `is_deleted`) VALUES('admin','123456','http://www.baidu.com',NOW(),NOW(),'0');
SELECT * FROM `db_spring_vue`.`user` t;
在pom.xml引入mybatis.generator的相关依赖,利用mybatis.generator插件生成相应的数据持久化对象
注意两个依赖的存放位置,mybatis-generator-core放在<dependencies>xxx</dependencies>标签
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
mybatis-generator-maven-plugin,则需要放在<plugins>xxx</plugins>标签之间
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
添加完,记得刷新pom.xml,不然不会下载依赖相关的文件,不会生效
IntelliJ IDEA 2020之前版本,可以配置maven pom.xml自动刷新
在resources目录下,增加mybatis.generator的配置文件generatorConfig.xml,注意如下内容:
第一个是mysql驱动,需要下载,然后这里填上驱动文件的存放路径
[mysql-connector-java-5.1.6.jar] 下载地址:https://imcfile.oss-cn-beijing.aliyuncs.com/shizhan/file/liaoshixiong/mysql-connector-java-5.1.6.jar
第二个是数据库配置,需要指定数据库名:db_spring_vue
第三、四、五是后续生成的持久化相关文件的目录,这里可以不用自己创建,指明路径,执行命令后会自动创建对应的目录
第六则是指定要持久化的数据库表表名,以及持久化后返回的对象名,目前就user一个表,返回对象我也叫user
后续若要操作其他表,则复制第六,修改对应的表名和对象名即可
Mybatis Generator 配置详解:https://www.imooc.com/article/21444
上述配置完成后,就可以进行持久化操作了
也可以在命令行执行命令:mvn mybatis-generator:generate
执行完成后,会在前面generatorConfig.xml文件里配置的三个目录,生成相应的对象文件:
在SpringbackApplication.java文件,添加注解,指定后续dao层的扫描路径:
@MapperScan(basePackages ="com.springbootvue.springback.dao")
打开pojo/user.java,我们发现已经生成了user的相关get、set方法
这显得有点杂乱,我们通过添加lomobk插件的@Data注解,进行简化
再对原来的application.properties配置文件进行一些优化,先将application.properties改成application.yml,其实.properties和.yml都是可用的,
只是.yml的内容是树形结构,看起来更简洁一些,用哪一个看个人喜欢。
mybatis默认是属性名和数据库字段名一一对应的,即
数据库表列:user_name
实体类属性:user_name
但是java中一般使用驼峰命名
数据库表列:user_name
实体类属性:userName
在Springboot中,可以通过设置map-underscore-to-camel-case属性为true来开启驼峰功能
spring:
datasource:
driver-class-name:com.mysql.cj.jdbc.Driver
username: root
password: qqq123
url: jdbc:mysql://localhost:3306/db_spring_vue?characterEncoding=utf-8&serverTimezone=GMT&useSSL=false
mybatis:
configuration:
map-underscore-to-camel-case:true
mapper-locations: classpath:mappers/*.xml
logging:
pattern:
console:"[%thread] %-5level %logger{36} - %msg%n"
修改UserMapper.xml,增加如下内容,
<select id="countByUsername" parameterType="java.lang.String" resultType="java.lang.Integer">
select
count(1)
from user
where username = #{username,jdbcType=VARCHAR}
</select>
<select id="selectByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
where username = #{username,jdbcType=VARCHAR}
</select>
第一个就是增加countByUsername方法,用于后面注册接口检查用户是否已注册
第二个则是增加selectByUsername方法,用于后面登录接口检查用户是否已存在
注意两者的返回,一个是返回java.lang.Integer,一个是返回BaseResultMap
再到文件dao/UserMapper,添加刚刚的两个对象
int countByUsername(String username);
UserselectByUsername(String username);
在com.springbootvue.springback,新建包service
再在包service下新增接口文件IUserService.java
在IUserService.java添加注册和登录方法,注意请求参数,注册是user对象,登录则只需要传入username和password
我们这里比较简单,注册时也只要填username和password,但通常情况下,注册还会有其他的email、address等。
所以注册时入参是user对象,登录则只是username和password
因为register方法要传入user对象,所以,我们还需要在dao/user.java生成user对象的构造方法
操作完成如下:
接下来,创建包Impl,再在包Impl下创建类文件UserServiceImpl.java,编写register和login方法的具体实现
注意别漏了@Service注解和引入userMapper:
package com.springbootvue.springback.service.Impl;
import com.springbootvue.springback.dao.UserMapper;
import com.springbootvue.springback.pojo.User;
import com.springbootvue.springback.service.IUserService;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
@Service
public class UserServiceImplimplements IUserService {
@Resource
private UserMapperuserMapper;
/**
*注册
* @param user
*/
@Override
public void register(User user){
//检查username不能重复
int countByusername =userMapper.countByUsername(user.getUsername());
if (countByusername >0){
throw new RuntimeException("该username已注册!!!");
}
//对密码进行MD5加密
user.setPassword(DigestUtils.md5DigestAsHex(
user.getPassword().getBytes(StandardCharsets.UTF_8)
));
//写入数据库
int resultCount =userMapper.insertSelective(user);
if (resultCount ==0){
throw new RuntimeException("注册失败!!!");
}
}
/**
*登录
* @param username,password
*/
@Override
public void login(String username,String password){
User user =userMapper.selectByUsername(username);
if (user ==null){
//用户不存在(返回:用户名或密码错误)
throw new RuntimeException("登录用户不存在!!!");
}
if (!user.getPassword().equalsIgnoreCase(DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8)))){
//密码错误(返回:用户名或密码错误)
throw new RuntimeException("登录密码错误!!!");
}
}
}
选中register或login方法,右键,生成单元测试方法
注意选Junit 4,以及选中要进行单元测试的方法
完成后,会在test目录下按路径生成对应的单元测试文件,编写单测代码:
package com.springbootvue.springback.service.Impl;
import com.springbootvue.springback.SpringbackApplicationTests;
import com.springbootvue.springback.pojo.User;
import com.springbootvue.springback.service.IUserService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
public class UserServiceImplTestextends SpringbackApplicationTests {
@Autowired
private IUserServiceuserService;
@Test
public void register() {
User user =new User("abccc","qqq123");
userService.register(user);
}
@Test
public void login() {
userService.login("abccc","qqq123");
}
}
修改SpringbackApplicationTests.java,添加注解@RunWith(SpringRunner.class)
在UserServiceImplTest.java,右键执行单元测试,也可以选择某一个方法,执行这一个方法的单元测试
查看单元测试结果:
查看数据库,注册成功:
目前只是简单的实现了注册登录接口,但都没有返回值,下一次来进行优化,添加返回值,再添加userinfo和logout接口,来检查是否登录成功和退出