spring boot+mybatis实现增删改查的坑坑洼洼

背景:公司布置了作业,使用spring boot和mybatis实现增删改查,原题已给出代码结构以及相关的jar包,打包为gradle项目放在GitHub中,接下来就开始自己的表演了。

step1:fork题目中给的GitHub仓库地址

step2:打开IDEA,选择file-new-project from version control-git,将自己仓库的地址填入url中

step3:运行build.gradle文件,然后build项目(这个地方我纠结了很久,每次导入gradle项目,build后还是显示缺少jar包,不知道是网络原因还是什么,多导入几次后就莫名其妙的好了,摸不着头脑。。。另外,貌似可以通过配置使gralde使用本地maven仓库,先占个坑吧,后续学会了再来补上)。

step4:下图为我导入项目的项目结构,有实体类,controller类,dao类,其中实体类User已经定义好,需要自己填充UserController和UserMapper

step5:配置文件,连接本地数据库,如图所示,url,username,password,driver-class-name含义都比较好理解,按照实际情况配置即可。

 

step6:首先写dao层、dao层定义了一个接口,提供了操作数据库的方法接口,具体的实现则通过注解的方式在方法上方声明。附上完整代码。

package com.example.demo.dao;

import com.example.demo.entity.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserMapper {
    // 1. 实现查询所有用户
    @Select("select * from user")
    @Results({
            @Result(property = "id",column = "id"),
            @Result(property = "name",column = "name")
    })
    public List<User> queryList();

    // 2. 根据用户id查询用户
    @Select("select * from user where id=#{id}")
    @Results({
            @Result(property = "id",column = "id"),
            @Result(property = "name",column = "name")
    })
    public User getUserById(long id);

    // 3. 添加新用户
    @Insert( "insert into user(id,name) values (#{user.id},#{user.name})")
    public int insertNewUser(@Param("user") User user);

    // 4. 根据用户id删除用户
    @Delete("delete from user where id=#{id}")
    public int delete(long id);

    // 5. 根据用户id更新用户
    @Update("update user set id=#{user.id},name=#{user.name} where id=#{userId}")
    public int updataUser(@Param("userId") long id,@Param("user") User user);

}

step7: 编写controller层调用dao层的方法,完整代码如下。requestMapping中的路径即为访问路径,例如要获取所有用户信息,则为localhost:8080/user,要获取id=1的用户信息的路径为localhost:8080/user/1

package com.example.demo.controller;

import com.example.demo.dao.UserMapper;
import com.example.demo.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("")
public class UserController {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/user")
    public List<User> findAll() {
        List<User> users=userMapper.queryList();
        return users;
    }

    @GetMapping("/user/{userId}")
    public User findById(@PathVariable long userId) {
        User user=userMapper.getUserById(userId);
        return user;
    }

    @PostMapping("/user")
    public void insertUser(@RequestBody User user) {
        userMapper.insertNewUser(user);
    }

    @PutMapping("/user/{userId}")
    public void updateUser(@PathVariable long userId,@RequestBody User user) {
        userMapper.updataUser(userId,user);
    }

    @DeleteMapping("/user/{userId}")
    public void deleteById(@PathVariable long userId) {
        userMapper.delete(userId);
    }
}

使用postman工具进行测试

问题1:错误代码415,在进行put时出现错误代码415的问题,经过搜索发现put时需要参数,headers中应该把Content-type设置为application/json

 

问题2:在进行put时提示参数不匹配

update方法需要两个参数,一个是id,在路径中给出,一个是修改后的user对象。(实际应用中一般是点击修改按钮时把当前修改对象的id随请求传递,然后修改后,将修改后的信息封装为对象传递到后台进行解析)。本项目中,id作为请求路径的一部分,使用@PathVariable注解表示参数值从请求路径中获取。

变更后的内容则通过json数据传递到后台,再自动封装为对象,此时用到了一个jar包,需要检查一下项目中是否已经引入了这个依赖,这个jar包的作用貌似就是将json格式的数据封装为对象。

当然了,也要告诉一下后台,这个参数是使用json格式传递的,需要将json格式的数据转化为对象,所以一定要在参数前使用@RequestBody注解,如下所示

最终是通过在mapper中接口的参数前添加@param注解解决的,网上说这个注解的作用是给参数命名的,sql语句中使用的应该是param括号中定义的名字,比如下边的userId

 补充:关于@param注解

不使用param注解时,参数只能有一个,并且是JavaBean。在SQL语句里是可以直接使用Javabean的属性的。如下所示的写法是没有问题的(可以与前文使用param的写法进行对比),sql中直接使用id和name。如果在sql中使用#{user.id}或者#{user.name}则会报错:没有为user设置getter,setter方法。

 请注意:在使用requestBody获取参数时涉及到序列化和反序列化的问题,此时实体类中一定要有无参构造器!

问题一:springboot错误: 找不到或无法加载主类  

解决办法:尝试 clean 项目后再重新build

 

问题二:autowired报错

解决办法:在确定代码无误的情况下 可以  File --> Settings打开设置,在Editor --> Inspections中,修改Spring Core --> Code --> Autowiring for Bean Class  的Severity的级别从Erroor改成Warring即可。

 

问题三:想在控制台查看执行的sql语句

解决办法:在application.yml 中设置,注意缩进

mybatis:
mapper-locations: "classpath:mapper/*Mapper.xml"
configuration:
 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

 

posted @ 2019-08-07 16:55  朝朝暮暮dx  阅读(548)  评论(0编辑  收藏  举报