不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!
以书籍表为例子,进行书籍的增删改查。数据库如下所示。
pom.xml
文件的
标签中加入如下依赖。<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.1.4version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>
application.yml
。server:
servlet:
context-path: /springbootdemo # 配置路径
port: 8081 # 配置端口号
spring:
datasource:
username: root # 数据库连接用户名
password: 123456 # 数据库连接密码
# 配置数据库 bookstore 是数据库名称
url: jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
# 配置JDBC驱动
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml # 配置数据库操作文件
type-aliases-package: com.hnucm.springbootdemo.model # 配置数据来源
#showSql
logging:
level:
com:
hnucm:
springboot: debug
传参:
json
格式的,使用@RequestBody
注释;/
格式的,使用@PathVariable(value = "")
注释;?
格式的,使用@RequestParam(value = "")
注释。model
文件夹,用于存放数据类。注:下列创建方式都一样。dao
文件夹,用于存放抽象接口。controller
文件夹,用于存放控制器类。service
文件夹,用于存放逻辑接口和具体实现。tools
文件夹,用于存放错误信息提示和消息通知工具类。resources
文件夹中创建mapper
文件夹,用于存放数据库操作文件。model
文件夹下创建数据类对象——Book
。@Data
//采用注解,默认存在get和set方法
public class Book {
//数据类型和名称尽量和数据库表中的一致
private int bno;
private String bname;
private String bauth;
}
dao
文件夹下创建抽象接口,内部加入增加数据的方法。@Mapper //采用注解,表示其为抽象接口类
public interface BookMapper {
//增加数据方法
//传入的是整本书籍的数据
int addBook(Book book);
}
service
文件夹下创建逻辑接口和具体实现类,利用dao
层抽象接口实现具体功能。//逻辑接口
public interface BookService {
int addBook(Book book);
}
@Service //利用注解证明其为具体实现类
public class BookServiceImpl implements BookService{
//利用dao层抽象接口方法实现
@Autowired
BookMapper bookMapper;
@Override
public int addBook(Book book) {
//实现功能
return bookMapper.addBook(book);
}
}
package com.huncm.springbootdemo.tools;
import java.util.HashMap;
import java.util.Map;
/**
* 返回数据封装类
*/
public class Result extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public Result() {
put("code", 0);
put("msg", "success");
}
public static Result error() {
return error(500, "未知异常,请联系管理员");
}
public static Result error(String msg) {
return error(500, msg);
}
public static Result error(int code, String msg) {
Result r = new Result();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static Result ok(String msg) {
Result r = new Result();
r.put("msg", msg);
return r;
}
public static Result ok(Map<String, Object> map) {
Result r = new Result();
r.putAll(map);
return r;
}
public static Result ok() {
return new Result();
}
public Result put(String key, Object value) {
super.put(key, value);
return this;
}
}
package com.huncm.springbootdemo.tools;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.sql.SQLException;
@ControllerAdvice
public class MyControllerAdvice {
@ResponseBody
@ExceptionHandler(value = SQLException.class)
public Result sqlHandler(Exception ex) {
return Result.error(501,ex.getMessage());
}
/**
* 全局异常捕捉处理
*
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Result errorHandler(Exception ex) {
return Result.error(500,ex.getMessage());
}
}
controller
文件夹下创建控制器类,进行接口的实现,利用工具类提示信息。@RestController //控制器注解
@CrossOrigin //跨域注解
public class BookController {
@Autowired
BookService bookService;
@RequestMapping("addBook")
public Result addBook(Book book) {
//打印需要加入的书籍信息
System.out.println(book);
//利用服务层接口方法进行功能实现
int result = bookService.addBook(book);
//判断是否成功
if(result > 0){
return Result.ok("增加书籍成功");
}
return Result.error("增加书籍失败");
}
}
mapper
文件夹下创建数据库操作文件,进行数据库操作,真正实现功能。
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huncm.springbootdemo.dao.BookMapper">
<insert id="addBook" parameterType="com.huncm.springbootdemo.model.Book">
insert into bookinfo(bname,bauth) values (#{bname},#{bauth});
insert>
mapper>
dao
层接口中加入删除数据的方法。//删除数据方法 根据书籍编号删除
int deleteBook(int bno);
service
层进行实现。注:service
层的接口方法和dao
层一致,不再复写。@Override
public int deleteBook(int bno) {
return bookMapper.deleteBook(bno);
}
controller
层调用实现。@RequestMapping("deleteBook")
public Result deleteBook(int bno) {
//打印删除的书籍编号
System.out.println(bno);
//利用服务层接口方法进行功能实现
int result = bookService.deleteBook(bno);
//判断是否成功
if(result > 0){
return Result.ok("删除书籍成功");
}
return Result.error("删除书籍失败");
}
mapper
层操作数据库。
<delete id="deleteBook" parameterType="Integer">
delete from bookinfo where bno = #{bno};
delete>
dao
层接口中加入修改数据的方法。//修改数据方法 根据书籍编号修改数据内容
int updateBook(Book book);
service
层进行实现。@Override
public int updateBook(Book book) {
return bookMapper.updateBook(book);
}
controller
层调用实现。@RequestMapping("updateBook")
public Result updateBook(Book book) {
//打印修改的书籍信息
System.out.println(book);
//利用服务层接口方法进行功能实现
int result = bookService.updateBook(book);
//判断是否成功
if(result > 0){
return Result.ok("修改书籍成功");
}
return Result.error("修改书籍失败");
}
mapper
层操作数据库。
<update id="updateBook" parameterType="com.huncm.springbootdemo.model.Book">
update bookinfo set bname = #{bname},bauth = #{bauth} where bno = #{bno};
update>
dao
层接口中加入查询数据的方法。//注:查询一条数据,Book和List都可以
//注:查询多条数据,只能List
//注:所以为了方便,统一使用List
//查询数据方法 查询全部书籍
List<Book> findAllBook();
//查询数据方法 根据书籍编号进行查询
List<Book> findBookById(int bno);
//查询数据方法 根据书籍名称进行查询
List<Book> findBookByName(String bname);
service
层进行实现。@Override
public List<Book> findAllBook() {
return bookMapper.findAllBook();
}
@Override
public List<Book> findBookById(int bno) {
return bookMapper.findBookById(bno);
}
@Override
public List<Book> findBookByName(String bname) {
return bookMapper.findBookByName(bname);
}
controller
层调用实现。@RequestMapping("findAllBook")
public Result findAllBook() {
//返回json格式的数据,key构造为data
return Result.ok().put("data",bookService.findAllBook());
}
@RequestMapping("findBookById")
public Result findBookById(int bno) {
//打印输入的书籍编号
System.out.println(bno);
return Result.ok().put("data",bookService.findBookById(bno));
}
@RequestMapping("findBookByName")
public Result findBookByName(String bname) {
//打印输入的书籍名称
System.out.println(bname);
return Result.ok().put("data",bookService.findBookByName(bname));
}
mapper
层操作数据库。
<select id="findAllBook" resultType="com.huncm.springbootdemo.model.Book">
select * from bookinfo;
select>
<select id="findBookById" resultType="com.huncm.springbootdemo.model.Book">
select * from bookinfo where bno = #{bno};
select>
<select id="findBookByName" resultType="com.huncm.springbootdemo.model.Book">
select * from bookinfo where bname = #{bname};
select>
使用postwoman
接口测试工具进行测试。如下图所示。
注:json
格式的key
和value
外面的是双引号,前面使用自定义格式时,用单引号,总是报空。
验证数据库可知,该接口测试成功。
对比可知,编号14的书籍删除成功,该接口测试成功。
对比修改前后内容可知,编号15的记录确实已经修改,该接口测试成功。
由上图可知,该接口测试成功。
由上图可知,该接口测试成功。
由上图可知,该接口测试成功。