当写了前一篇关于SpringBoot的文章之后,有很多朋友就提问说,关于SpringBoot整合Mybatis,还有SpringBoot热部署,并且还有说关于整合JSP配置的一些问题,然后决定写这一篇文章来帮有疑惑的朋友来解决一下问题。(SpringBoot整合Hibernate的使用,及其SpringBoot的基本知识可以参考之前的一篇章 SpringBoot基础学习 )
github项目源码地址:https://github.com/qq496616246/SpringBootAndMybatis
如果你想看其他的环境搭建,那么请参考我的其余博文。
手把手教你阿里云服务器(Ubuntu系统)如何部署Web开发环境
地址:https://blog.csdn.net/cs_hnu_scw/article/details/79125582
手把手教你如何玩转SSH(Spring+Strus2+Hibernate)
地址:https://blog.csdn.net/cs_hnu_scw/article/details/77888051
手把手教你如何玩转SSH(Spring+SpringMVC+Hibernate)
地址:https://blog.csdn.net/cs_hnu_scw/article/details/78849772
手把手教你如何玩转SSM框架搭建(Maven版本)
地址:https://blog.csdn.net/cs_hnu_scw/article/details/80709822
手把手教你如何玩转SSM框架整合(非Maven版本)
地址:https://blog.csdn.net/cs_hnu_scw/article/details/78157672
手把手教你如何玩转SpringBoot整合Mybatis(mapper.xml方式开发)
地址:https://blog.csdn.net/cs_hnu_scw/article/details/80693248
手把手教你如何玩转SpringBoot整合MyBatis(mybatis全注解开发和热部署及其JSP配置详解)
地址:https://blog.csdn.net/cs_hnu_scw/article/details/78961232
主要讲解内容如下:
(1)SpringBoot整合Mybatis
(2)热部署
(3)Mybatis注解开发的一些常用例子
一:环境
windows7 +IDEA + mysql
二:开始搭建环境
(1)创建一个SpringBoot的项目工程-----------------(这个我就不多说了,如果不知道的就看上面提到的连接里面的文章,里面说得非常非常详细了)
(2)在pom.xml文件中添加JSP和Mybatis的依赖
温馨提示一点:
1:对于SpringBoot本身不提供Mybatis的,但是Mybatis却有提供支持SpringBoot,所以,关于这个导入依赖的时候要注意一点
2:大家可以通过 Maven中心仓库 这个地方去寻找对应的依赖,我觉得挺实用的
添加的内容如下:
<!--添加相应的数据库依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!--配置JSP依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>8.5.23</version>
</dependency>
注意:不管你们配的是什么版本,但是一定要保证版本是能够兼容即可。。。。。
(3)编写application.properties配置文件的内容
#配置关于数据库的一些内容
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot?useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=XXXXX
spring.datasource.password=XXXXXXXXXXX
#配置Controller层返回JSP
#前缀 ,如果这里最后添加了一个/,那么就不需要在controller的函数返回的时候加/,否则就需要添加,一般都是在这里添加
#后缀
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
(4)编写实体类
package com.hnu.scw.model;
/**
* @author Administrator
* @create 2018-01-03 10:33
* @desc 对应数据库中的实体类
**/
public class Person {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
(5)搭建mapping映射
温馨提示:我习惯采用全注解编程,所以没有使用mapping.xml的文件,如果习惯用xml文件来编写mybatis的话,那么就需要在application.properties文件中指定mapping文件的地方和实体位置,就需要添加如下代码:
如果按照我的习惯,那么直接进行下面内容即可(跳过上面的配置)
package com.hnu.scw.mapper;
import com.hnu.scw.model.Person;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/**
* function : 针对Person实体进行的crud操作
*/
@Mapper
public interface PersonMapping {
/**
* 添加person数据
* @param person
*/
@Insert("insert into person (name) values(#{name})")
public void addPerson(Person person);
/**
* 根据id查询到person数据
* @param id
* @return
*/
@Select("select * from person where id = #{id}")
public Person getPersonById(Integer id);
}
(6)搭建service层
package com.hnu.scw.service;
import com.hnu.scw.mapper.PersonMapping;
import com.hnu.scw.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author scw
* @create 2018-01-03 10:40
* @desc 进行对person实体操作的service,这里就不写接口了,但是实际开发中,应该要面向接口编程
**/
@Service
public class PersonService {
@Autowired
public PersonMapping personMapping ;
/**
* 添加person数据
* @param person
*/
public void addPerson(Person person){
personMapping.addPerson(person);
}
/**
* 根据id获取person数据
* @param id
* @return
*/
public Person getPersonById(Integer id){
return personMapping.getPersonById(id);
}
}
(7)搭建controller层
package com.hnu.scw.controller;
import com.hnu.scw.model.Person;
import com.hnu.scw.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author scw
* @create 2018-01-03 10:31
* @desc 测试SpringBoot整合Mybatis的controller层
**/
@Controller
public class PersonController {
@Autowired
public PersonService personService;
/**
* 添加person数据
* @param person
* @return
*/
@RequestMapping(value = "person/add")
public String addPerson(Person person){
personService.addPerson(person);
return "success";
}
/**
* 根据ID查询数据
* @param id
* @param model
* @return
*/
@RequestMapping(value = "person/getperson")
public String addPerson(Integer id , Model model){
Person person = personService.getPersonById(id);
model.addAttribute("person" , person);
return "ok";
}
}
(8)搭建JSP的配置---------------重点又来了
第一步:在src/main/下,创建一个webapp文件目录
第二步:创建一个WEB-INF文件目录-----------这也就对应我们之前步骤中application.properties配置的路径内容
第三步:在WEB-INF目录下,创建jsp目录
第四步:创建对应的Jsp即可
所以,对应的目录结构如下所示:----------其中的JSP页面没有什么特别,就是普通的JSP页面而已,所以这里不贴了,我只是演示一下而已
(9)重点中的重点,认真看的一步---------将webapp目录设置为web资源,从而实现右击选择new,可以出现JSP页面的创建
注意:大家可以先不要这样配置,可以先试试,右击选择new,看是否有JSP这个选项哦~~~~~~~~~~~~~~~
这个其实是因为,SpringBoot默认只支持html,所以就对jsp没有这个支持了。。另外,本来默认的静态文件和页面可以放在resource目录下的public下面即可,这是SpringBoot默认支持扫描的路径,一共是支持四个文件目录,关于这个可以参考我写的关于SpringBoot的内容。
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
双击箭头的位置,然后修改成我们创建的那个webapp的那路径即可。
第七步:
OK,最后的结果就是这样,然后点击右下角的Apply即可,然后再去项目中右击,就会发现出现了new JSP这个选项了。
第八步:
(10)运行main函数,即可。。。。。。。。。。。如果出现了预期的情况,那么就说明配置成功啦~~恭喜你~~~~~~~
好了,贴一张整个项目的工程结构:
注意:在这里面配置的过程可能出现的异常问题:
(1)mysql连接不上,那么就确认你的电脑里面安装了mysql,并且打开了mysql的服务
(2)服务器端口不对,默认的端口是8080,如果需要修改,则可以在application.properites文件中添加server.port=XXXX即可
(3)访问路径是对的,可是返回的JSP却不出现,而且还报了org.apache.tomcat.util.security.Escape异常,那么恭喜你,在你配置的依赖中,出现了jar冲突,这个一般是因为配置的下面这个版本不对,配置8.5.23即可,不能够配置9.0.+的版本。
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
(4)提示mapper的bean无法获取
解决方法:是因为在依赖中没有配置如下的依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
三:如何实现SpringBoot的热部署
热部署原理:
配置文件中用了spring-boot-devtools主要是因为这是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动更快。其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机)
温馨提示:使用了热部署之后,千万不要频繁的进行ctrl+s(保存)操作,因为这样的话,就会自动进行部署重启了,这样会影响性能的哦~!
步骤:
(1)pom.xml添加依赖
<!--配置SpringBoot的热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork><!--注意要修改这里-->
</configuration>
</plugin>
(2)在application.properties配置文件中添加缓存禁止配置
#禁用缓存---要配置,否则无法生效
spring.thymeleaf.cache=false
spring.freemarker.cache=false
spring.groovy.template.cache=false
spring.velocity.cache=false
(3)修改IDEA的配置
1:ctrl+shift+A,然后输入make project automatically
2:ctrl+shift+A,输入Registry
然后再勾选
(4)修改浏览器中的缓存禁止---因为我都是用的谷歌浏览器,所以就以该浏览器做代表,其他浏览器类似即可
1:ctrl+shift+J,,,调出开发者功能
2:选择Network
3:勾选禁止缓存
四:Mybatis注解的一些技术使用
(1)插入数据之后需要返回插入数据的对应Id
@Insert("insert into question (description) " +
"values(#{currentQuestion.description})")
@Options(useGeneratedKeys = true, keyProperty = "currentQuestion.id")
void insertQuestion(@Param("currentQuestion")Question question);
备注:1:配置@Options(useGeneratedKeys=true, keyProperty="对象.属性") 这个的作用是设置是否使用JDBC的getGenereatedKeys()方法获取主键并赋值到keyProperty设置的对象的属性中,说白了就是把自增长的主键值赋值给对象相应的属性
2.:在插入后,使用对象.主键属性的getXXId()方法 获取主键值
(2)参数是List集合
@Select("<script>" +
"select * " +
"from question " +
"where " +
"chapter in " +
"<foreach collection='chapters' item='item' open='(' separator=',' close=')'>" +
"#{item}" +
"</foreach>" +
"</script>")
List<Question> queryQuestionByChapter(@Param("chapters") List<String> chapters);
(3)参数是数组
@Select("<script> select * from question " +
"where " +
"id in " +
"<foreach collection='questionIds' item='item' open='(' separator=',' close=')'>" +
"#{item}" +
"</foreach>" +
"</script>")
List<Question> queryQuestionDetaileById(@Param("questionIds") String[] questionIds);
OK,所有的内容到此就结束了,是不是发现挺简单的呢?但是里面包含的内容却很多并且很重要,关键还是要掌握哦~!欢迎指定~@!!~~~