springboot整合mybatis(纯注解版)
1、注解:参考表
-
@ResponseBody:表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。
-
@Controller:用于定义控制器类,在spring 项目中由控制器负责将用户发来的URL
-
@RestController:用于标注控制层组件,@ResponseBody和@Controller的合集。
-
@Autowired:自动导入依赖的bean
-
@Mapper:一般用于修饰dao层(Mapper层)的组件
-
@Service:一般用于修饰service层的组件
-
@Repository:使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。
-
@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。根据不同需求和场景可以使用 @GetMapping、 @PostMapping、@DeleteMapping和@PutMapping进行替代
-
@RequestBody:@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交
2、项目流程
2.1、添加依赖
在项目POM文件中添加依赖,这里需要加入几个常用的依赖,分别如下:
当然也可以手动添加pom.xml进去
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.2、配置文件
-
接下来配置application.yml,将数据源和MyBatis分别进行配置,使其生效:
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssmtest?useSSL=true&useUnicode=true&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# Java结果集对象中自动转换成驼峰命名参数
mybatis:
configuration:
map-underscore-to-camel-case: true
server:
port: 8080
理解:其中,对于map-underscore-to-camel-case配置,是为了将数据库字段和实体对象属性做映射,对于数据库表中aa_bb形式的表名或字段名,可自动映射成aaBb形式。
2.3、代码实现
-
项目整体架构(注意所以的包都要和主方法在一个路径下面也就是包下面)
-
编写entity实体类
package com.lyh.boot.entity; import lombok.Data; @Data //这是是lombok,也就是省去了你写set,get方法了,自动帮你生成 public class Blog { private Integer id; private String title; private String author; private String createTime; private Integer views; }
-
编写mapper
-
定义Mapper,在dao包中创建UserMapper接口,进行数据库查询的定义,这里先实现CRUD的基础操作:
package com.lyh.boot.mapper; import com.lyh.boot.entity.Blog; import org.apache.ibatis.annotations.*; import java.util.List; @Mapper public interface BlogMapper { @Select("select * from ssmtest.blog") List<Blog> blogList(); @Insert("insert into ssmtest.blog(title,author,create_time,views) VALUES(#{title},#{author},#{createTime},#{views})") Integer addBlog(Blog blog); @Update("update ssmtest.blog set title=#{title},author=#{author},create_time=#{createTime},views=#{views} where id = #{id}") Integer updateBlog(Blog blog); @Delete("delete from ssmtest.blog where id = #{id}") Integer deleteBlog(@Param("id") Integer id); }
-
@Mapper注解是MyBatis的注解,是用来说明这个是一个Mapper,对应的xxxMapper.xml就是来实现这个Mapper。然后再server层使用@Autowired注解或者@Resource引用进即可。可省略,需要在启动类上添加Mapper扫描基础包的配置:
@MapperScan(value = {"com.lyh.boot.mapper"})
-
@Insert注解、@Update、@Select、@Delete声明方法要执行的语句。
-
@Param注解用于给定映射器方法参数一个名字,如不添加,参数将会以他们的顺序位置来被命名。
注意:因为是纯注解,需要使用@Mapper注解和@Repository注解来将这个类注册为Mapper类方便Spring识别,且无需配置Mapper映射xml文件,用注解来声明查询的Sql即可。
-
-
编写service
Service接口与具体实现类编写,首先在service包中新建impl实现类子包,然后在service包中添加UserService类,编写查询业务:
-
接口
package com.lyh.boot.service; import com.lyh.boot.entity.Blog; import java.util.List; public interface BlogService { //查询所以数据 List<Blog> blogList(); //添加数据 Integer addBlog(Blog blog); //修改数据 Integer updateBlog(Blog blog); //根据ID删除数据 Integer deleteBlog(Integer id); }
-
实现类IMPl
package com.lyh.boot.service.impl; import com.lyh.boot.entity.Blog; import com.lyh.boot.mapper.BlogMapper; import com.lyh.boot.service.BlogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class BlogServiceImpl implements BlogService { @Autowired private BlogMapper blogMapper; @Override public List<Blog> blogList() { List<Blog> blogs = blogMapper.blogList(); System.out.println(blogs.toString()); return blogs; } @Override public Integer addBlog(Blog blog) { Integer i = blogMapper.addBlog(blog); System.out.println(i); return i; } @Override public Integer updateBlog(Blog blog) { return blogMapper.updateBlog(blog); } @Override public Integer deleteBlog(Integer id) { Integer i = blogMapper.deleteBlog(id); if (i>0){ System.out.println("删除成功"); } return i; } }
-
注意:
需要注意的是,真正实现Service的作用的是实现类BlogServiceImpl并非BlogService接口,因此,@Service注解应添加至实现类上方。
-
-
编写controller
最后是Controller,在controller包中,创建UserController类,用来处理用户请求等操作:
package com.lyh.boot.controller; import com.lyh.boot.entity.Blog; import com.lyh.boot.service.BlogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Repository; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("blog") public class BlogController { @Autowired private BlogService blogService; @GetMapping("list") public List<Blog> getBlogList() { return blogService.blogList(); } @PostMapping("add") public boolean addBlog(@RequestBody Blog blog) { Integer addBlog = 0; try { addBlog = blogService.addBlog(blog); } catch (Exception e) { System.out.println("sss"); } if (addBlog > 0) { return true; } return false; } @PostMapping("update") public boolean updateBlog(@RequestBody Blog blog) { Integer updateBlog = 0; try { updateBlog = blogService.updateBlog(blog); } catch (Exception e) { System.out.println("修改失败"); } if (updateBlog > 0) { return true; } return false; } @PostMapping("delete") public boolean deleteBlog(@RequestParam Integer id) { Integer deleteBlog = 0; try { deleteBlog = blogService.deleteBlog(id); } catch (Exception e) { System.out.println(); } if (deleteBlog > 0) { return true; } return false; } }
因为本文不涉及任何Web界面,所有的Controller方法均以restful api 方式呈现,因此直接使用@RestController注解来修饰;次出分别定义了四个API,用于实现CRUD,接下来运行项目,使用接口调试工具来测试接口可用性。
@RequestParam:这个注解意思就是你需要在测试的时候用(?id=9)这种方式传参
-
测试:
###查询所以用户 GET http://localhost:8686/blog/list <> 2024-01-31T171434.200.json <> 2024-01-31T170831.200.json <> 2024-01-31T164053.200.json ###添加用户信息 POST http://localhost:8686/blog/add Content-Type: application/json { "title": "网络安全", "author": "jialihao", "createTime": "1992-6-3", "views": 1000 } <> 2024-01-31T171533.500.json <> 2024-01-31T171524.500.json <> 2024-01-31T171440.500.json <> 2024-01-31T170916.500.json <> 2024-01-31T165611.500.json <> 2024-01-31T165541.500.json ###修改用户信息 POST http://localhost:8686/blog/update Content-Type: application/json { "id": 9, "title": "网络安全", "author": "jialihao", "createTime": "1992-6-3", "views": 1000 } <> 2024-01-31T174548.200.json ###删除用户根据ID POST http://localhost:8686/blog/delete?id=9 Content-Type: application/x-www-form-urlencoded <> 2024-02-01T105326.200.json
-
错误集合,
java.lang.ClassNotFoundException: com.lyh.boot.SpringbootMybatisCrudApplication
解决办法: