Spring Boot学习中的问题总结

文章目录

    • 集成flyway所需要的注意点
    • Spring Boot整和MyBatis遇到的问题
      • 整合MyBatis的过程中遇到的问题
      • 查询不出数据库中text类型的数据
    • thymeleaf知识
      • input
      • textarea
      • href
    • 部署到服务器中遇到的问题
    • 自定义MVC的时候不能使用@EnableWebMvc注解
    • return " " 和 return "redirect: "

集成flyway所需要的注意点

集成flyway所需要导入maven的插件

<plugin>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-maven-pluginartifactId>
plugin>

<plugin>
    <groupId>org.flywaydbgroupId>
    <artifactId>flyway-maven-pluginartifactId>
    <version>6.4.3version>
    <configuration>
        <url>jdbc:mysql://localhost:3306/info?useSSL=falseurl>
        <user>rootuser>
        <password>123456password>
    configuration>
plugin>

集成flyway以后,将需要执行的数据库脚本写成:V1__Create_user_table.sql的形式,然后在里面写你需要执行的相关的SQL语句。以后每需要执行一条SQL语句都需要写一个相应的VXX__版本的SQL脚本。

然后需要注意的一点就是,集成了flyway以后,就不能手动对数据库进行操作,对数据库的操作只能依赖于写一个VXX__版本的SQL脚本,然后执行命令:

mvn flyway:migrate

执行完毕以后会执行的相应的SQL语句,该创建表的就给你创建表,该修改数据库的就给你修改数据库,还会生成一张flyway_schema_history校验表,如下图所示:
Spring Boot学习中的问题总结_第1张图片
该表记录着flyway执行的操作,如果手动进行修改数据库,那么下次再使用mvn flyway:migrate命令执行SQL脚本时,则会报错,因为数据校验不通过。flyway_schema_history记录的操作中没有记录你的这一系列操作,数据对不上,flyway则没办法成功执行。

Spring Boot整和MyBatis遇到的问题

整合MyBatis的过程中遇到的问题

整合MyBatis时需要导入的插件

<plugin>
  <groupId>org.mybatis.generatorgroupId>
  <artifactId>mybatis-generator-maven-pluginartifactId>
  <version>1.4.0version>
plugin>

同时使用MyBatis需要在application.properties配置:

mybatis.configuration.map-underscore-to-camel-case=true

最开始就是因为没有这么配置,导致映射失败。
该配置能使得MyBatis自动完成Java驼峰命名到数据库下划线命名的转化
比如useName ➡ user_name

查询不出数据库中text类型的数据

我在数据库中定义了一个text类型的字段:
使用selectByExampleWithRowbounds方法查出来的数据为null,应该使用selectByExampleWithBLOBsWithRowbounds

thymeleaf知识

input

input标签采用th:value标签可以将值回显到input输入框中

<input type="text" class="form-control" id="title" name="title" placeholder="标题..." th:value="${title}">

textarea

textarea可以采用如下方式将值回显到输入框中

<textarea name="description" id="description" class="form-control" cols="30" rows="10" th:value="${description}">[[${description}]]textarea>

href

地址拼接

<a th:href="@{/(page=${page})}" th:text="${page}">1a>

比如:http://localhost:8080/?page=1
其中?后面的内容是请求所携带的参数

部署到服务器中遇到的问题

将项目部署到服务器以后莫名其妙的说我没有这张表,也没有那张表,但是我看数据库中明明都存在这些表,java代码执行的时候却找不到。

我进入MySQL执行命令时果然发现不对劲。我有一个数据库名字为info。我执行use info。没问题,但是执行user INFO却不行。按道理执行SQL语句的时候大小写应该忽略不计才对。

然后查阅资料才知道Linux中是不忽略SQL语句的大小写的。
执行show variables like '%case%';得到如下信息。只有当lower_case_table_names为1的时候才能忽略大小写。
Spring Boot学习中的问题总结_第2张图片
然后根据这个帖子重新安装了一遍MySQL便可以了。
帖子链接点此
设置Linux忽略大小写成功以后的输出结果:
Spring Boot学习中的问题总结_第3张图片

自定义MVC的时候不能使用@EnableWebMvc注解

当我们使用@EnableWebMvc的时候,就相当于是引入了WebMvcConfigurationSupport这个类,会导致自动配置不生效。比如使用了@EnableWebMvc注解以后,首页的页面找不到了
Spring Boot学习中的问题总结_第4张图片
分析如下:

  • WebMvcAutoConfiguration
    WebMvcAutoConfiguration中的内容:
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)

@ConditionalOnClass({
      Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })

//当WebMvcConfigurationSupport这个class不存在的时候自动配置才会生效,若这个类存在,Spring Boot的自动配置将不会生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({
      DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration 

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)表示只有当WebMvcConfigurationSupport这个class不存在的时候自动配置才会生效,若这个类存在,Spring Boot的自动配置将不会生效。

  • @EnableWebMvc
    @EnableWebMvc中的内容如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({
     ElementType.TYPE})
@Documented
@Import({
     DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
     
}

可以看到@EnableWebMvc注解引入了 DelegatingWebMvcConfiguration。继续往上走而可以发现:

DelegatingWebMvcConfigurationextends WebMvcConfigurationSupport

也就是说使用了@EnableWebMvc实际上就导入了WebMvcConfigurationSupport所以会导致Spring Boot的自动配置失效。

return " " 和 return "redirect: "

return “user/welcome” 会自动跳转user路径下的welcome.html

而return "redirect: user/welcome"则会返回这个controller, 然后重新查找requestmapping的参数。 如果这个controller没有一个@requestmapping(value=“user”),那么就会报错。

因此, return+路径就是纯粹用于跳转页面。 而return+redirect就用于再次转向controller。如果使用model传输数据,使用return+redirect就会导致数据无效。在页面根本取不到相应的数据。
比如:

model.addAttribute("error", "用户未登录");
return "publish";

采用return "publish"的方式返回publish.html页面,就能从model中取出数据,可以在publish.html中使用${error}取值。
但是使用return "redirect:/publish"的方式则不可以

你可能感兴趣的:(Java,java,mysql,mybatis,spring,boot)