1.注解方式整合mybatis
1.1 创建District的Mapper接口
public interface DistrictMapper {
@Select("select * from district")
List<District> findAll();
@Select("select * from district where id= #{id}")
District findOneById(@Param("id") Integer id);
}
@Insert("insert into district(id, name)" + "values (#{id}, #{name})")
@Options(useGeneratedKeys = true, keyColumn = "id")
int insertOne(@Param("id") Integer id, @Param("name") String name);
@Update("update district set name=#{name} where id=#{id}")
int updateOne(@Param("id") Integer id, @Param("name") String name);
1.2 添加mybatis注解
针对增删改查:@Insert,@Delete,@Update,@Select
1.2.1 常用注解说明
- @Mapper
可以给接口自动生成一个实现类,让spring对mapper接口的bean进行管理,并且可以省略去写复杂的xml文件。
- @Options
配置映射语句的属性。例如:@Options(useGeneratedKeys = true, keyColumn = "id"):指定表的自增主键并自动绑定到实体类对象。
- @Result
修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。
- @Param
如果你的映射方法的形参有多个,这个注解使用在映射方法的参数上就能为它们取自定义名字。若不给出自定义名字,多参数(不包括 RowBounds 参数)则先以 "param" 作前缀,再加上它们的参数位置作为参数别名。例如 #{param1}, #{param2}。
- @Select、@Delete、@Insert、@Update
这四个注解分别代表将会被执行的 SQL 语句。它们用字符串数组(或单个字符串)作为参数。如果传递的是字符串数组,字符串之间先会被填充一个空格再连接成单个完整的字符串。
还是需要在启动类中添加@MapperScan注解
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan(basePackages = "com.company.firstspringboot.mapper")
public class FirstSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(FirstSpringbootApplication.class, args);
}
}
在往数据库中添加数据时:出现这样的问题:

这是因为:在application.yml中要把编码加上

完整的application.yml
server:
port: 8080
servlet:
context-path: /
# 连接数据库的信息
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///air?serverTimeZone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
# MyBatis配置
mybatis:
# 扫描映射文件
mapper-locations: classpath:mapper/*.xml
# 配置别名扫描的包
type-aliases-package: com.company.firstspringboot.entity
configuration:
# 开启驼峰映射配置
map-underscore-to-camel-case: true
# 查看sql语句
logging:
level:
com.company.firstspringboot: DEBUG
1.3 测试,看到执行的sql语句
在application.yml文件中添加
# 查看sql语句
logging:
level:
com.company.firstspringboot: DEBUG
class DistrictMapperTest extends FirstSpringbootApplicationTests {
@Autowired
private DistrictMapper mapper;
@Test
void findAll() {
List<District> list = mapper.findAll();
for (District district : list) {
System.out.println(district);
}
}
@Test
void findOneById() {
District oneById = mapper.findOneById(5);
System.out.println(oneById);
}
}
可以看到执行的sql语句,其实就是debug模式

@Test
void insertOne() {
int district = mapper.insertOne(10, "秦淮区");
System.out.println(district);
}
@Test
void updateOne() {
int i = mapper.updateOne(9, "雨花台区");
}
2. SpringBoot整合分页助手
导入依赖
https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter
<!-- 分页助手pageHelper依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
AirMapperTest.java
import com.company.firstspringboot.FirstSpringbootApplicationTests;
import com.company.firstspringboot.entity.Air;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
class AirMapperTest extends FirstSpringbootApplicationTests {
@Autowired
private AirMapper airMapper;
@Test
void findAll() {
List<Air> all = airMapper.findAll();
for (Air air : all) {
System.out.println(air);
}
}
@Test
public void findByPage() {
// 1.执行分页
PageHelper.startPage(1, 5);
// 2.执行查询
List<Air> list = airMapper.findAll();
// 3.封装PageInfo对象
PageInfo<Air> pageInfo = new PageInfo<>(list);
// 4.输出
for (Air air : pageInfo.getList()) {
System.out.println(air);
}
}
}

3.SpringBoot整合JSP
1.需要导入依赖,在pom.xml中
springboot不推荐使用jsp,所以在spring-boot-starter-web启动器中并没有包括这两个,需要单独引入jstl和tomcat-embed-jasper的依赖支持
<!-- JSP核心引擎依赖--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!-- JSTL--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>
2.创建webapp以及WEB_INF去存放JSP页面

JspController.java
package com.company.firstspringboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class JspController {
@RequestMapping("/index")
public ModelAndView index(Model model) {
model.addAttribute("name", "张三");
return new ModelAndView("index");
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello ${name}</h1>
</body>
</html>
3.指定view的前缀和后缀,在application.yml中
spring:
mvc:
# 视图的前缀和后缀
view:
prefix: /WEB_INF/
suffix: .jsp

在整合jsp过程中出现了两个问题:
1.出现下面的问题

因为用的是IDEA,需要特别注意其中一个项目配置,否则可能找不到jsp页面。


2.只返回了文字,并没有返回页面


原因分析:@RestController注解相当于@ResponseBody和@Controller合在一起的作用。在使用@RestController注解Controller时,Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
包括在Mapping注解使用的同时使用@ResponseBody时也会出现同样的问题。
解决办法:①去除@ResponseBody或将含有Rest的注解换成对应的原始注解;
②不通过String返回,通过ModelAndView对象返回,上述例子可将return语句换成下面:
@RestController
public class JspController {
@RequestMapping("/index")
public ModelAndView index(Model model) {
model.addAttribute("name", "张三");
return new ModelAndView("index");
}
}
在使用ModelAndView对象返回的时候,不需要考虑有没有@ResponseBody类似的注解。
参考:
https://juejin.cn/post/6844903993391448072
https://www.cnblogs.com/myitnews/p/12347191.html
https://www.cnblogs.com/guo-xu/p/11203740.html