在Spring Boot集成mybatis框架搭建完成后,进行了一个例子的简单练手。由于在上篇文章中已经讲过了一个最简单的例子的创建,因此本文章只会写关于要求内所添加的内容。要求如下:
(1) 数据输出格式JsonResult
接口的输出格式已有了要求,因此需要创建一个公共类JsonResult,来返回数据。
public class JsonResult {
private long total;
private String message;
private boolean status;
private Object data;
public JsonResult(){
this("", true)
}
public JsonResult(String msg, boolean status){
this(0, msg, null, true);
}
public JsonResult(long total, Object data){
this(total, "", data, true);
}
public JsonResult(long total, String msg, Object data){
this(total, msg, data, true);
}
public JsonResult(int total, String msg, boolean status, Object data){
this.total = total;
this.message = msg;
this.status = status;
this.data = data;
}
......
省略了setter和getter
......
}
(2) Dao层
按照要求,需要根据userId和userCode查询或删除用户。因此在传入参数时候,需要传入两个参数。传入两个参数时候,需要加入@Param,声明变量名,否则会报异常。
@Mapper
public interface UserMapper {
List<User> getUserList();
User getUser(@Param("userId") String userId, @Param("userCode") String userCode);
int insertUser(User user);
int deleteUser(@Param("userId") String userId, @Param("userCode") String userCode);
int updateUser(User user);
}
<select id="getUser" resultType="com.hisense.mybatisserver.entity.User">
SELECT * FROM user
<where>
<if test="userId != null and userId != ''">
userId = #{userId, jdbcType=VARCHAR}
</if>
<if test="userCode != null and userCode != ''">
AND userCode = #{userCode, jdbcType=VARCHAR}
</if>
</where>
</select>
传递多个参数,需要使用where标签,他去自动去除条件语句句首的AND和OR。如果不加where标签,直接只用WHERE,那么如果userId为null,则生成的sql如下,后台会报异常。
SELECT * FROM user WHERE AND userCode = ?
jdbcType的作用是当插入的为空值时候,不指定jdbcType将会报错,在上述代码中,加入了userCode!=""的判断,所以此处不加jdbcType也行。
<select id="getUserList" resultType="com.hisense.mybatisserver.entity.User">
SELECT
userCode, age, phone, modifiedTime
FROM user ORDER BY modifiedTime DESC
</select>
List要求只展示特定的字段,并且按照修改时间排序,所以SQL语句需要进行修改,利用ORDER BY进行排序,DESC为降序,ASC为升序。
(3) 服务层
1. getUserList
List时候由于我们不可能一次性就把数据库的数据全部提取出来,需要采用分页。在SQL语句中,我们通常用LIMIT进行分页。此例子中我们采用一个mybatis的分页插件PageHelper。在pom.xml中添加依赖。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
分页插件需要从页面传递两个参数,一个是从第几条开始查,一个是一个页面多少条数据。PageHelper.startPage(start, pageSize)后面跟着的第一条查询语句,会为其生成的SQL语句,加上LIMIT,从而实现分页的效果。用PageInfo封装list,调用getTotal()方法可以获得总共的条数。
public JsonResult getUserList(int start, int pageSize) {
PageHelper.startPage(start, pageSize);
List<User> list = userMapper.getUserList();
PageInfo<User> pageInfo = new PageInfo<User>(list);
long total = pageInfo.getTotal();
return new JsonResult(total, "success", list);
}
2. insertUser
用户ID采用UUID主键生成策略。
public JsonResult insertUser(User user) {
User u = userMapper.getUser(null, user.getUserCode());
if(u != null) return new JsonResult("userCode已重复", false);
user.setUserId(UUID.randomUUID().toString().replaceAll("-", ""));
user.setCreateTime(new Date());
user.setModifiedTime(new Date());
userMapper.insertUser(user);
return new JsonResult("success", true);
}
(4) 控制层
在控制层中,代码与上篇文章中的基本类似,唯一的区别是插入或更新用户数据时候,需要进行数据验证。验证也可以通过javascript在前端完成验证。类似涉及写数据库的操作,需要采用POST,method = RequestMethod.POST规定了只有POST才能进入此方法。@RequestBody作用为接受json数据,转化为User类型的对象,@Valid标识需要验证的对象,BindingResult为验证的结果。
@RequestMapping(value = "/add", method = RequestMethod.POST)
public Object insertUser(@Valid @RequestBody User user, BindingResult result){
if(result.hasErrors()){
String msg = "";
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError fieldError:
fieldErrors) {
msg += fieldError.getDefaultMessage() + ",";
}
return new JsonResult(msg.substring(0, msg.length() - 1), false);
}
JsonResult res = userService.insertUser(user);
return res;
}
在User类中需要在getter方法上加注解,定义你的校验格式。不写在变量上,因为变量是private,加了会破坏类的封装性。
@NotNull(message = "年龄不能为空")
@Min(value = 18, message = "年龄必须满18岁")
@Max(value = 100, message = "年龄不能超过100岁")
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@NotNull(message = "邮箱不能为空")
@Pattern(regexp = "\\w+(\\.\\w)*@\\w+(\\.\\w{2,3}){1,3}", message = "邮箱格式不正确")
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
@NotNull(message = "手机号码不能为空")
@Pattern(regexp = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$", message = "手机号码格式不正确")
public String getPhone() {
return phone;
}
(5) 测试
利用Postman软件进行测试。下面只放add、list、detail三个的测试结果。