如果你想看其他的环境搭建,那么请参考我的其余博文。
手把手教你阿里云服务器(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
情景引入:
小白:快起床快起床!!!!!!
我:又怎么了,让我睡一个安心觉可以吗?
小白:微服务好火,你有没有听说过呢?
我:听过了,而且我有跟你讲过一些SpringBoot的基础知识,你难道忘记了吗?SpringBoot可是微服务的入门基础呀!
小白:对呀,但是,学得比较零散,而且我之前都是用的Spring+SpringMVC+Mybatis这三种框架进行开发的,所以,我想让你给我讲讲怎么利用SpringBoot进行搭建呢?这样的话,我就可以用上之前学习的知识啦!
我:原来是这样呀,那你就不可以等我睡了这个懒觉吗?
小白:不行不行,学习可不等人的。学习使我快乐!!!
我:好吧,看在你这么有积极性上,我就勉为其难的给你好好说一下吧。
小白:真开心。。。。。。。
情景分析:我们很多人开发我想用的都是SSM(Spring+SpringMVC+Mybatis)框架,既然随着微服务的火热,我们也必不可少的要赶上潮流。在之前的博文里面,我已经对SpringBoot的入门知识进行了讲解,可以让大家先对SpringBoot进行一个大体的了解,这样对我们学习也是很有帮助的,毕竟,我们要知其然还要知其所以然。
https://blog.csdn.net/cs_hnu_scw/article/details/78522784
在这篇博文中,我主要是讲解通过SpringBoot来搭建SSM框架,并且,我这里主要是讲解Mybatis的操作都是基于Mapper.xml的基础上进行的(注意:这里全程都不用mybatis的注解进行开发,所以,更符合我们之前的SSM开发的方式)。另外的话,主要是通过两种搭建方式进行讲解,因为,对于SpringBoot来说,它给我们减少了配置文件的烦恼,而之前我们的SSM都是配置文件,所以,
方法一:SpringBoot+Mybatis环境搭建(通过Mybatis官方提供的 mybatis-spring-boot-starter方式)
github项目源码地址:https://github.com/qq496616246/SpringBootMybatisByXml
方法二:SpringBoot+Mybatis环境搭建(利用mybatis-spring的传统方式,这种更加灵活)
github项目源码地址:https://github.com/qq496616246/SpringBootMybatisByMapper
方法三:SpringBoot+Mybatis环境搭建(Mybatis采用注解开发)
直接看我的另外一篇博文:https://blog.csdn.net/Cs_hnu_scw/article/details/78961232
大家,请注意区分这两种方法,是不一样的,而且不同的情况适用不同的方法。
全文搭建环境:IDEA+Mysql+Windows7
步骤:
(1)
(2)
(3)
(4)
(5)当创建完成项目之后,将下面多余的内容进行删除。
(6)编写实体类pojo。比如,我这里以非常简单的Person类为示例
package com.hnu.scw.pojo;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @ Author :scw
* @ Date :Created in 下午 9:31 2018/6/13 0013
* @ Description:定义一个‘人’的实体bean
* @ Modified By:
* @Version: $version$
*/
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;
}
}
(7)编写Mapper操作接口
package com.hnu.scw.mapper;
import com.hnu.scw.pojo.Person;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @ Author :scw
* @ Date :Created in 下午 1:53 2018/6/14 0014
* @ Description:用于处理person pojo相关的数据库操作
* @ Modified By:
* @Version: $version$
*/
//下面两个注解使用任一一个即可
//@Repository
@Mapper
public interface PersonMapper{
/**
* 添加一个人的数据信息
* @param person
*/
void personAdd(Person person);
}
注意:要么加入@Repository或者@Mapper注解,也就是要把这个作为springboot容器中的bean。否则,我们无法在Service层中进行注入操作。
(8)编写Service层接口
package com.hnu.scw.service;
import com.hnu.scw.pojo.Person;
/**
* @ Author :scw
* @ Date :Created in 下午 1:55 2018/6/14 0014
* @ Description:${description}
* @ Modified By:
* @Version: $version$
*/
public interface PersonService {
/**
* 添加一个人的数据信息
* @param person
*/
public void personAdd(Person person);
}
(9)编写Service层的实现类
package com.hnu.scw.service.imp;
import com.hnu.scw.mapper.PersonMapper;
import com.hnu.scw.pojo.Person;
import com.hnu.scw.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @ Author :scw
* @ Date :Created in 下午 1:56 2018/6/14 0014
* @ Description:person实体操作的service实现类
* @ Modified By:
* @Version: $version$
*/
@Service
public class PersonServiceImp implements PersonService{
@Autowired
private PersonMapper personMapper;
@Override
public void personAdd(Person person) {
personMapper.personAdd(person);
}
}
注意:要在实现类上加入@Service注解,而不是在接口中加入,这是容易搞错的地方。
(10)编写Controller控制层
package com.hnu.scw.controller;
import com.hnu.scw.pojo.Person;
import com.hnu.scw.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* 测试springboot的环境搭建(controller控制层)
*/
@Controller
public class MyTest {
@Autowired
private PersonService personService;
//跳转到添加人员的页面
@RequestMapping(value = "/toaddperson")
public String toAddPersonJsp(){
return "person_add";
}
@RequestMapping(value = "/addperson") //进行添加人员的操作
public String addPersonOption(Person person){
personService.personAdd(person);
return "person_add" ;
}
}
关键的地方来了,请注意看后续的内容:
(11)在application.properties文件中添加数据库配置以及mybatis配置和SpringMVC的配置
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
#Mybatis扫描
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
#起别名。可省略写mybatis的xml中的resultType的全路径
mybatis.type-aliases-package=com.hnu.scw.pojo
# 配置数据库的内容
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database = mysql
# 显示Debug的信息
#logging.level.org.springframework=DEBUG
(12)添加mapper文件映射
INSERT INTO person(name)
VALUES
(
#{name}
)
注意;如果在application.propertise的mybatis中没有配置下面的内容的话,那么paremeterType就要用绝对路径的内容
mybatis.type-aliases-package=com.hnu.scw.pojo
(13)创建webapp/WEB-INF/views文件目录(与java和resources目录保持同级),用于存放jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
欢迎您的到来
随便填一填呗
(14)OK,差不多完成,就剩最后添加pom.xml的依赖。(注意:请认真看里面的内容,这个步骤的话,我们可以根据在实际的过程中一边进行添加,而我这里放在最后是因为方便大家进行阅读,所以这是灵活的地方)
4.0.0
com.example.scw.springboot
demo
0.0.1-SNAPSHOT
jar
SpringBootMybatisDemo
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.2.RELEASE
UTF-8
UTF-8
1.8
nexus-aliyun
nexus-aliyun
http://maven.aliyun.com/nexus/content/groups/public/
true
false
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-jdbc
junit
junit
test
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.1.1
com.github.abel533
mapper
2.3.4
mysql
mysql-connector-java
jstl
jstl
1.2
org.apache.tomcat.embed
tomcat-embed-jasper
8.5.23
org.springframework.boot
spring-boot-maven-plugin
(15)现在,我们运行我们的主类。(这个类的名字就是创建项目时候写的。)
package com.hnu.scw.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* Springboot项目的运行入口
*/
@MapperScan("com.hnu.scw.mapper") //扫描mapper,要不然就在每个mapper接口用@mapper,否则就这样进行扫描
@SpringBootApplication(scanBasePackages = "com.hnu.scw")
@EnableTransactionManagement //开启事务管理
public class SpringBootMybatisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisDemoApplication.class, args);
}
}
(16)通过浏览器访问:localhost:8080/toaddperson
当我们填入内容,然后提交之后,我们再去看数据库,就会发现数据库中多了一条数据,就说明环境搭建成功!
项目结构:
-----------------------------------------------------------------------------------------------------
注意:
因为我们上面是采用默认的SpringBoot内部的Tomcat服务器,而如果我们需要采用本地的Tomcat的话,那么我们需要安装如下的内容进行处理:
步骤
前面创建项目还是跟第一种是一样的,所以就不多说。(前10步一样)
关键的部分来了,请认真看和对比方法一
(11)创建一个包(我这里就用com.hnu.scw.config作示例),专门用于存放所有的配置文件的内容,主要是Mybatis
(12)在resources目录下,创建配置数据源的jdbc.properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=true
jdbc.username=root
jdbc.password=123456
(13)在刚刚创建的包里面,创建一个类,用于配置数据源,我这类命令为:SpringConfig
package com.hnu.scw.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.jolbox.bonecp.BoneCPDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import javax.sql.DataSource;
/**
* @ Author :scw
* @ Date :Created in 下午 9:03 2018/6/13 0013
* @ Description:用于配置数据库等配置文件
* @ Modified By:
* @Version: $version$
*/
@Configuration
@PropertySource(value = {"classpath:jdbc.properties"})
public class SpringConfig {
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.driverClassName}")
private String jdbcDriverClassName;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
/**
* 配置数据库
* @return
*/
@Bean(name = "mydataSource")
public DataSource mydataSource(){
DruidDataSource datasource = new DruidDataSource();
// 数据库驱动
datasource.setDriverClassName(jdbcDriverClassName);
// 相应驱动的jdbcUrl
datasource.setUrl(jdbcUrl);
// 数据库的用户名
datasource.setUsername(jdbcUsername);
// 数据库的密码
datasource.setPassword(jdbcPassword);
// 每个分区最大的连接数
datasource.setMaxActive(20);
// 每个分区最小的连接数
datasource.setMinIdle(5);
return datasource;
/*
BoneCPDataSource boneCPDataSource = new BoneCPDataSource();
// 数据库驱动
boneCPDataSource.setDriverClass(jdbcDriverClassName);
// 相应驱动的jdbcUrl
boneCPDataSource.setJdbcUrl(jdbcUrl);
// 数据库的用户名
boneCPDataSource.setUsername(jdbcUsername);
// 数据库的密码
boneCPDataSource.setPassword(jdbcUsername);
// 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0
boneCPDataSource.setIdleConnectionTestPeriodInMinutes(60);
// 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0
boneCPDataSource.setIdleMaxAgeInMinutes(30);
// 每个分区最大的连接数
boneCPDataSource.setMaxConnectionsPerPartition(100);
// 每个分区最小的连接数
boneCPDataSource.setMinConnectionsPerPartition(5);
return boneCPDataSource;*/
}
}
注意:我这里没明白我用Druid数据源就可以成功,如果是使用BonCP连接就不行,它会报连接数据库超时,目前我还没明白原因,如果你知道原因,欢迎留言给我。
(13)继续创建一个类,用于配置Mybatis的内容,我命名为:MybatisConfig
package com.hnu.scw.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import javax.sql.DataSource;
/**
* @ Author :scw
* @ Date :Created in 下午 9:23 2018/6/13 0013
* @ Description:配置mybatis内容
* @ Modified By:
* @Version: $version$
*/
@Configuration
public class MybatisConfig {
@Autowired
private DataSource mydataSource;
@Bean(name = "sqlSessionFactory")
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory() {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
try {
// 设置数据源
sqlSessionFactoryBean.setDataSource(mydataSource);
// 设置mybatis的主配置文件
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource mybatisConfigXml = resolver.getResource("classpath:mybatis/mybatis-config.xml");
sqlSessionFactoryBean.setConfigLocation(mybatisConfigXml);
//设置mybatis扫描的mapper.xml文件的路径(非常重要,否则找不到mapper.xml文件)
Resource[] mapperResources = resolver.getResources("classpath:mybatis/mapper/*.xml");
sqlSessionFactoryBean.setMapperLocations(mapperResources);
// 设置别名包,便于在mapper.xml文件中ParemeType和resultType不要写完整的包名
sqlSessionFactoryBean.setTypeAliasesPackage("com.hnu.scw.pojo");
return sqlSessionFactoryBean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
(14)继续创建一个类,用于配置Mybatis扫描mapper和获取数据库操作对象
package com.hnu.scw.config;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ Author :scw
* @ Date :Created in 下午 9:28 2018/6/13 0013
* @ Description:mapper扫描配置
* @ Modified By:
* @Version: $version$
*/
@Configuration
@AutoConfigureAfter(MybatisConfig.class) //保证在MyBatisConfig实例化之后再实例化该类
public class MapperScannerConfig {
// mapper接口的扫描器
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
mapperScannerConfigurer.setBasePackage("com.hnu.scw.mapper");
return mapperScannerConfigurer;
}
}
(15)继续创建一个类,用于配置SpringMVC的内容,比如拦截器等等(可以选择性配置,不配也没关系)
比如配置拦截器,就类似下面即可
@Configuration
public class SpringMVCConfig extends WebMvcConfigurerAdapter {
//一个拦截用户的拦截器类,这个就和我们正常编写拦截器一样的形式
@Autowired
private UserLoginHandlerInterceptor userLoginHandlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 判断用户是否登录的拦截器
registry.addInterceptor(userLoginHandlerInterceptor).addPathPatterns("/cart/**");
}
}
(16)修改SpringBoot项目的入口函数的内容。(主要是添加一些扫描操作)
package com.hnu.scw.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* Springboot项目的运行入口
*/
@SpringBootApplication(scanBasePackages = "com.hnu.scw")
@EnableTransactionManagement //开启事务管理(根据自身需求来即可)
public class SpringBootMybatisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisDemoApplication.class, args);
}
}
(17)在resources文件目录下面,创建mybatis的配置文件,命名为mybatis-config.xml
注意:看到这个就很熟悉了吧,就和我们SSM的框架中的配置Mybatis的内容差不多,所以,你可以自身进行相应的修改即可,根据自身的需求来进行配置内容。
(18)在resources文件目录下,并且和mybatis-config.xml同一级创建一个文件,用于保存mapper.xml文件
INSERT INTO person(name)
VALUES
(
#{name}
)
(19)在application.properties文件中添加springmvc的相关内容(这个也可以在我们直接创建的springmvcConfig中设置)
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
(20)创建一个webapp/WEB-INF/views文件目录,用于存放我们的JSP页面(这个和方法一是一样,就不贴JSP代码了)
(21)OK,配置完成,剩下的就是启动我们SpringBoot的入口函数了。
(22)如果效果和我们方法一的页面操作结果一致,那么恭喜你,环境搭建完成哦。~!
最后项目的结构如下:(可以对比方法一哦)
下面是对应的pom.xml的配置内容;(大家对比一下和方法一的区别)
4.0.0
com.example.scw.springboot
demo
0.0.1-SNAPSHOT
jar
SpringBootMybatisDemo
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.2.RELEASE
UTF-8
UTF-8
1.8
nexus-aliyun
nexus-aliyun
http://maven.aliyun.com/nexus/content/groups/public/
true
false
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-jdbc
junit
junit
test
org.mybatis
mybatis
3.4.5
org.mybatis
mybatis-spring
1.3.0
mysql
mysql-connector-java
com.jolbox
bonecp-spring
0.8.0.RELEASE
com.alibaba
druid
1.1.6
jstl
jstl
1.2
org.apache.tomcat.embed
tomcat-embed-jasper
8.5.23
org.springframework.boot
spring-boot-maven-plugin
问题1:提示mapper对象无法注入到service层
解决方法:(1)请检查mapper类是否添加了相应的注解(2)在SpringBoot的入口类中,是否添加了@MapperScan扫描mapper类。当然,如果mapper类用了@mapper注解,那么就不需要进行这个扫描处理了,如果是@Reposity那么就需要考虑
问题2:环境运行一切正常,但是进行数据库操作的时候,就报错,提示连接数据库超时。
比如:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to....
和Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection;
以及java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
解决方法:(1)检查是否添加了mysql的连接的依赖(2)检查是否添加了数据源(3)检查依赖是否有冲突(4)看对应的错误提示
问题3:运行提示:java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L错误
解决方法:这个问题主要是由于mybatis-spring的版本不兼容的问题,建议的话采用1.3.0,因为我用了1.2.6的就有问题,我也不知道到底为什么。
问题4:当我们一切运行正常,但是在有数据库操作之后,我们发现控制台打了很多类似下面的日志:
Establishing SSL connection without server's identity verification is not recommended. According to
解决方法:这是由于高版本的mysql的连接是进行了ssl加密的(具体可以看http和https的区别),而我们连接mysql数据库是用的sockect连接。。所以,我们在配置mysql的url的时候:对比下面两个配置:
错误的:
jdbc.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
正确的:
jdbc.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=true啊
对的,其实就是最后多了@useSSL=true
问题5:配置环境没问题,但是运行有操作数据库的时候,页面就出现500的错误,比如出现
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
解决方法:其实这个就是由于环境没有扫描到我们配置的mapper.xml的内容,所以我们主要检查MybatisConfig是否添加了扫描mapper.xml的内容,或者是我们的路径写错了。
问题6:针对JSP页面无法跳转,页面会报错。
问题解决:(1)在pom.xml中,没有添加JSP的依赖(2)对于webapp的目录没有创建对位置(3)application.properties中没有配置前缀webapp/WEB-INF/和后缀.jsp
好了,上面的内容,详细的说明了三种配置方法(其实更喜欢方法二,因为配置能够更加的灵活),都是自身特意进行错误重现和方便更多人进行学习而进行的专门编写。另外的话,针对我们平常的开发,还可以用注解的形式,而用注解开发当然有好处也有坏处,这个需要根据我们自身的需求来的。如果,想看如何用注解进行SpringBoot+Mybatis的开发,那么请跳转到我的另外一篇文章。
感谢各位的阅读,欢迎进行交流~~~~~~~