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