注解方式整合mybatis & SpringBoot整合分页助手 & SpringBoot整合JSP

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

posted @ 2021-05-10 20:06  GumpYan  阅读(143)  评论(0编辑  收藏  举报