springboot + mybatis 的專案,實現簡單的CRUD
以前都是用Springboot+jdbcTemplate實現CRUD
但是趨勢是用mybatis,今天稍微修改,建立springboot + mybatis 的專案,實現簡單的CRUD
上圖是專案的目錄結構,建立一個user實體,包含id,姓名,手機,密碼,flag等資訊,然後對使用者進行增刪查改。
drop table if exists user; CREATE TABLE `user` ( id tinyint(4) NOT NULL AUTO_INCREMENT, name varchar(200) NOT NULL, age int(11) NOT NULL,、 phone varchar(20) NOT NULL, password varchar(20) NOT NULL, flag int(4), PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
用Intellij IDEA進行開發,建立一個新的springboot專案,選中SQL中的mybaits,生成之後預設帶有DemoApplication主函式啟動類,最後啟動的時候要在主函式上新增mapper掃描@MapperScan("com.example.demo.mapper") //掃描全部mapper
其他的程式碼依次如下: User
public class User implements Serializable { private Long id; private String name; private int age; private String phone; private String password; private boolean flag; 省略了getter and setter }
userService
package com.example.demo.service; import com.example.demo.pojo.User; import java.util.List; public interface userService { List<User> findAll(); List<User> selectAll(); List<User> selectById(int id); int create(User user); int updateUserById(User user); int deleteUserById(int id); }
userServiceImp
package com.example.demo.serviceImp; import com.example.demo.mapper.userMapper; import com.example.demo.pojo.User; import com.example.demo.service.userService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class userServiceImp implements userService { @Autowired private userMapper userMapper; public List<User> findAll() { System.err.println("查詢所有使用者介面"); List<User> list = userMapper.findAll(); return list; } @Override public List<User> selectAll() { List<User> list = userMapper.selectAll(); return list; } @Override public List<User> selectById(int id) { List<User> list = userMapper.selectById(id); return list; } @Override public int create(User user) { int count = userMapper.create(user); return count; } @Override public int updateUserById(User user) { int count = userMapper.updateUserById(user); return count; } @Override public int deleteUserById(int id) { int count = userMapper.deleteUserById(id); return count; } }
userMapper
package com.example.demo.mapper; import com.example.demo.pojo.User; import java.util.List; public interface userMapper { List<User> findAll(); List<User> selectAll(); List<User> selectById(int id); int create(User user); int updateUserById(User user); int deleteUserById(int id); }
userController
package com.example.demo.controller; import com.example.demo.pojo.User; import com.example.demo.serviceImp.userServiceImp; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import java.util.List; @Api(tags = {"demo介面"}) @Controller @RequestMapping("user") public class userController { @Autowired private userServiceImp userService; @ApiOperation(value = "顯示全部使用者的資訊倒序") @RequestMapping("userLists") @ResponseBody public List<User> showUsers() { List<User> list = userService.findAll(); return list; } @ApiOperation(value = "顯示全部使用者的資訊") @RequestMapping("selectAll") @ResponseBody public List<User> selectAll() { List<User> list = userService.selectAll(); return list; } @ApiOperation(value = "根據ID查詢使用者的資訊") @RequestMapping("selectById") @ResponseBody public List<User> selectById(int id) { List<User> list = userService.selectById(300); return list; } @ApiOperation(value = "建立新使用者資訊") @PostMapping("create") @ResponseBody public String create(User user) { int count = userService.create(user); System.out.println(count); if (count>0) return ("成功新增"+count+"條記錄"); else return "新增使用者失敗"; } @ApiOperation(value = "根據ID更新使用者資訊") @PostMapping("updateUserById") @ResponseBody public String updateUserById(User user) { int count = userService.updateUserById(user); System.out.println(count); if (count>0) return ("成功更新"+count+"條記錄"); else return "更新使用者失敗"; } @ApiOperation(value = "根據ID刪除使用者資訊") @PostMapping("deleteUserById") @ResponseBody public String deleteUserById(int id) { int count = userService.deleteUserById(id); System.out.println(count); if (count>0) return ("成功刪除"+count+"條記錄"); else return "刪除使用者失敗"; } }
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.example.demo.mapper.userMapper"> <resultMap id="userResultMap" type="com.example.demo.pojo.User"> <id column="id" property="id" jdbcType="BIGINT"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="age" property="age" jdbcType="VARCHAR"/> <result column="phone" property="phone" jdbcType="VARCHAR"/> <result column="password" property="password" jdbcType="VARCHAR"/> <result column="flag" property="flag" jdbcType="BIGINT"/> </resultMap> <select id="findAll" resultMap="userResultMap"> SELECT id,name,age,phone,password,flag FROM user order by id desc </select> <select id="selectById" parameterType ="int" resultMap="userResultMap"> select * from user where id = #{id} </select> <select id="selectAll" resultMap="userResultMap"> select * from user order by id desc </select> <insert id="create" parameterType="com.example.demo.pojo.User"> insert into user(name,age,phone,password,flag)values (#{name},#{age},#{phone},#{password},#{flag}) </insert> <updateid="updateUserById" parameterType="com.example.demo.pojo.User"> update user set name = #{name},age =#{age},phone =#{phone},password = #{password},flag = #{flag} where id = #{id} </update> <deleteid="deleteUserById" parameterType ="int"> delete from user where id = #{id} </delete> </mapper>
1. Mapper method 'com.example.demo.mapper.userMapper.create attempted to return null from a method with a primitive return type (int).] with root cause
是新增使用者資訊介面,發現使用者資訊已經成功插入資料庫,但是頁面提示
There was an unexpected error (type=Internal Server Error, status=500).
Mapper method 'com.example.demo.mapper.userMapper.create attempted to return null from a method with a primitive return type (int).
出錯原因很簡單,mapper.xml 對映檔案中,新增記錄應該用insert,我懶,直接複製了上面的select, 然後搓了很久。。
2. 找不到Bean
出錯原因很簡單,啟動類主函式沒有新增mapper掃描,需要新增 @MapperScan("com.example.demo.mapper")
這個專案的github地址是 https://github.com/JasmineQian/SpringDemo_2019/tree/master/springboot2mybatis
以前我管理github很亂,自己看到的程式碼,自己擼的程式碼,都隨便網上塞,然後之後都不怎麼回顧。然後就學過什麼都忘記了。隱約記得遇到過,具體解決方法不知道。
就像《少林英雄》歌中常的那樣,
練功必須頂大太陽 (哼)
晚上還要借月亮光(哈)
一日不練十日空(哼哈)