(1)测试类的使用
1> 左侧有单个执行的按钮,@Test注解是JUnit测试框架中的,作为测试用例使用
2> @Autowired注解,是Spring依赖注入(DI)机制的一部分,Spring将自动提供类所需要的依赖项,而不需要实例化或查找
3> 数据库连接池---优化数据库访问
4> 新建单元测试类UserMapperTests
package com.cy.practice1_store.mapper;
import com.cy.practice1_store.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
//标注为测试类,不会同项目一起打包
@SpringBootTest
//启动这个单元测试类
@RunWith(SpringRunner.class)
public class UserMapperTests {
@Autowired
private UserMapper userMapper;
/**
* 单独运行,做单元测试
* 1、必须要@Test
* 2、返回为void
* 3、参数列表不指定任何类型
* 4、必须为public
*/
@Test
public void insert(){
User user = new User();
user.setUsername("lwj");
user.setPassword("123");
Integer rows = userMapper.insert(user);
System.out.println(rows);
}
@Test
public void findByUsername(){
User user = userMapper.findByUsername("lwj");
System.out.println(user);
}
}
(2)有关mapper的文件结构
示例:User对象
1> User:
package com.cy.practice1_store.entity;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.io.Serializable;
/**
* 用户实体类
* @Author lwj
*/
@Component
@Data
public class User extends BaseEntity implements Serializable {
private Integer uid;
private String username;
private String password;
private String salt;
private String phone;
private String email;
private Integer gender;
private String avatar;
private Integer isDelete;
}
@Data是Lombok库的一个注解,用于自动生成 getter、setter、equals、hashCode 和 toString 等常用方法来减少代码冗长并提高代码可读性。
@Component将 Java 类标记为 Spring bean,允许 Spring 在应用程序上下文中检测、实例化和管理该类的实例。
2> UserMapper:
package com.cy.practice1_store.mapper;
import com.cy.practice1_store.entity.User;
import org.apache.ibatis.annotations.Mapper;
/**
* @author 86152
*/
@Mapper
public interface UserMapper {
/**
*插入用户
* @param user 用户数据
* @return 受影响的行数
*/
Integer insert(User user);
/**
*根据用户名查询是否存在用户
* @param username 用户名
* @return 找到返回User,没有找到返回null
*/
User findByUsername(String username);
}
3> 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">
<mapper namespace="com.cy.practice1_store.mapper.UserMapper">
<resultMap id="UserEntityMap" type="com.cy.practice1_store.entity.User">
<!-- 主键不可以忽略 -->
<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>
<!-- 插入用户数据:Integer insert(User user) -->
<!-- useGeneratedKeys 表示自增 -->
<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>
<!-- 根据用户名查询用户数据:User findByUsername(String username) -->
<!--
resultType: 表示查询的结果集类型,,指定映射类的类型,如上面的com.cy.practice1_store.entity.User
resultMap: 因为有些表的资源和类的对象属性字段名称不一致,如is_delete和isDelete,需要进行映射
-->
<select id="findByUsername" resultMap="UserEntityMap">
SELECT
*
FROM
t_user
WHERE
username = #{username}
</select>
</mapper>
4> IUserService:
package com.cy.practice1_store.service;
import com.cy.practice1_store.entity.User;
/**
* 用户模块业务层接口
* @author 86152
*/
public interface IUserService {
/**
* 用户注册
* @param user
*/
void reg(User user);
}
5> UserServiceImpl:
package com.cy.practice1_store.service.impl;
import com.cy.practice1_store.entity.User;
import com.cy.practice1_store.mapper.UserMapper;
import com.cy.practice1_store.service.IUserService;
import com.cy.practice1_store.service.ex.InsertException;
import com.cy.practice1_store.service.ex.UsernameDuplicatedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public void reg(User user) {
String username = user.getUsername();
User result = userMapper.findByUsername(username);
//用户名已存在
if(result != null){
throw new UsernameDuplicatedException("用户名被占用");
}
//补全数据
user.setIsDelete(0);
user.setCreatedUser(user.getUsername());
user.setModifiedUser(user.getUsername());
Date date = new Date();
user.setCreatedTime(date);
user.setModifiedTime(date);
//未知异常
Integer rows = userMapper.insert(user);
if(rows != 1){
throw new InsertException("注册过程中产生了未知异常");
}
}
}
上面就是一个持久层、业务层大概的结构例子
下面为简单的控制层使用,以及前端js部分代码
控制层:
package com.cy.practice1_store.controller;
import com.cy.practice1_store.service.ex.InsertException;
import com.cy.practice1_store.service.ex.ServiceException;
import com.cy.practice1_store.service.ex.UsernameDuplicatedException;
import com.cy.practice1_store.util.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* @author 86152
*/
public class BaseController {
public static final int OK = 200;
@ExceptionHandler(ServiceException.class)
public JsonResult<Void> handleException(Throwable e){
JsonResult<Void> result = new JsonResult<>(e);
if(e instanceof UsernameDuplicatedException){
result.setState(4000);
result.setMessage("用户名被占用");
}else if(e instanceof InsertException){
result.setState(5000);
result.setMessage("未知异常");
}
return result;
}
}
package com.cy.practice1_store.controller;
import com.cy.practice1_store.entity.User;
import com.cy.practice1_store.service.IUserService;
import com.cy.practice1_store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 86152
* RestController是Controller和ResponseBody的集合
*/
@RestController
@RequestMapping("users")
public class UserController extends BaseController{
@Autowired
private IUserService userService;
@RequestMapping("reg")
public JsonResult<Void> reg(User user){
userService.reg(user);
return new JsonResult<>(OK);
}
}
js代码:
<script type="text/javascript">
$("#btn-reg").click(function () {
$.ajax({
url: "/users/reg",
type: "POST",
data: $("#form-reg").serialize(),
dataType: "json",
success: function (json) {
if(json.state == 200){
alert("注册成功");
}else{
alert("注册失败" + json.message);
}
},
error: function (xhr) {
alert("注册时产生未知错误" + xhr.status)
}
})
})
</script>
其中控制层的/users/reg就对应于ajax的url内容