springboot的介绍
- 样板化配置。springboot可以简化我项目的配置,让我们ssm项目的配置变得更加简单。
- 内置了tomcat服务器。以后的web项目不用部署了,直接运行main方法后,就启动了tomcat,tomcat里面就有了我们的项目。
搭建springboot的开发环境
-
配置jdk的版本,因为springboot2依赖了spring5,spring5又依赖了jdk1.8,所以我们的项目至少是jdk1.8.
pom.xml文件中修改jdk的版本。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
-
引入依赖。引入一个就可以了。这一个就相当于spring的核心jar包和springmvc的相关jar包。
<dependency> <groupId>org.springframework.boot</groupId> <artifa ctId>spring-boot-starter-web</artifactId> <version>2.1.4.RELEASE</version> </dependency>
-
开发控制器类。跟以前一样。
@Controller @RequestMapping("/user") public class UserController { @ResponseBody @RequestMapping("/test") public Map test(String name){ System.out.println(name+"=================="); //响应的数据 Map map=new HashMap(); map.put("a","zhangsan"); map.put("b","20"); return map; } }
-
写main方法启动tomcat。这时可以访问该项目了。
注意:
- 类名必须叫Application
- 类必须建在com.baizhi。只有建在这个包里面,springboot才会扫描本包以及子包中的注解。
- 在这类上面添加注解。@SpringBootApplication
@SpringBootApplication public class Application { public static void main(String[] args) { //启动springboot框架 SpringApplication.run(Application.class,args); } }
-
测试运行。默认tomcat的端口号是8080,我们需要写配置文件对端口号进行修改。
application.properties放在resources文件夹里面。
#tomcat的端口号 server.port=8989 #项目的项目名,以后我们访问该项目http://ip:port/context-path server.servlet.context-path=/springboot_day1
springboot的配置文件
有两种配置方式。
- application.properties配置。
- application.yml配置。
两者配置的内容是一样的。只是配置方式不一样。
yml用来替换properties文件。两者都叫application,放的位置也一样都在resources里面。
server: port: 8989 servlet: context-path: /springboot_day1
yml是通过缩进(两个空格)来指定关系的。
mybatis跟springboot集成
-
引入依赖。
<!--mybatis跟springboot集成的依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!--mybatis要链接mysql数据库,mysql数据库的驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
-
在application.yml里面配置数据源信息。
#配置数据库的连接信息 spring: datasource: url: jdbc:mysql://localhost:3306/idea_day1?useUnicode=true&characterEncoding=utf8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver #给实体起别名,设置映射文件的路径。 mybatis: type-aliases-package: com.baizhi.entity mapper-locations: classpath:mapper/*.xml
-
写实体类,dao接口,dao的mapper文件。
跟以前一样
-
在dao接口上面添加注解。
@Mapper//这个注解是让springboot识别dao接口,自动生成dao的实现类,并让spring管理起来。
让spring管理dao有两个注解可以选择:
-
在dao接口上面添加@Mapper,这种方式需要每个dao都添加。
-
在springboot的启动类上面扫描dao包。管理dao对象。
@SpringBootApplication @MapperScan("com.baizhi.dao")//扫描dao包 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
-
-
测试dao。
参考下一个步骤,跟junit集成。
springboot跟junit进行集成测试
-
引入依赖。
<!--junit单元测试的依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--springboot做单元测试的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.1.4.RELEASE</version> </dependency>
-
在测试类上使用注解。@SpringBootTest
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class TestDao { //飘红不影响使用 @Autowired private StudentDao studentDao; @Test public void testSelectAll(){ List<Student> students = studentDao.selectAll(); students.forEach(System.out::println); } }
springboot和业务类的相关配置
业务类的作用控制事务,mybatis插件分页。
控制事务
- 我们可以在类上面添加注解。@Transactional来标注这个类 中所有的方法都开启事务。
- 我们可以在查询方法上面添加 @Transactional(readOnly=true)表示查询方法上面不使用回滚段以此来提高查询速度。
@Service
@Transactional//表示在当前类中所有的方法都要开启事务
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Transactional(readOnly = true)//查询方法的事务策略是只读
@Override
public List<Student> selectAll() {
return studentDao.selectAll();
}
@Transactional(readOnly = true)
@Override
public PageInfo<Student> selectByPage(int curPage, int pageSize) {
PageHelper.startPage(curPage,pageSize);
List<Student> students = studentDao.selectAll();
PageInfo<Student> pi=new PageInfo<>(students);
return pi;
}
}
使用mybatis的插件实现分页
- 引入mybatis插件依赖。跟以前的依赖不一样。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
- 业务类的写法跟以前一样。
mybatis-plus跟springboot集成
lombok可以帮助我们生成实体类的get和set方法。我们需要在实体类上面添加注解@Data.使用lombok依赖后,我们的实体类没有显式写出get和set方法,这样我们写代码时,调用get和set方法会报错。我们需要在idea里面下载安装一个lombok的插件。
安装插件:idea的菜单file里面—-》setting—–》plugin—–》搜索lombok
安装好插件后,idea需要重启。
具体步骤:
-
引入依赖。
<!--springboot核心依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.4.RELEASE</version> </dependency> <!--mybatis-plus跟springboot集成的依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.2</version> </dependency> <!--mybatis要链接mysql数据库,mysql数据库的驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!--junit单元测试的依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--springboot做单元测试的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.1.4.RELEASE</version> </dependency> <!-- 简化实体类开发的一个依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency>
-
在yml配置文件中修改mybatis的相关配置。
#项目的项目名,以后我们访问该项目http://ip:port/context-path server: port: 8989 servlet: context-path: /springboot_day102 #配置数据库的连接信息 spring: datasource: url: jdbc:mysql://localhost:3306/idea_day1?useUnicode=true&characterEncoding=utf8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver #给实体起别名,设置映射文件的路径。 mybatis-plus: type-aliases-package: com.baizhi.entity mapper-locations: classpath:mapper/*.xml
-
在实体类中我们可以使用lombok,作用就是不用生成get和set方法了。
import java.util.Date; @Data public class Student { private int id; private String name; private int age; private Date birth; }
-
dao接口继承BaseMapper。
-
其他的mapper文件和业务类,控制器类跟以前一样。
springboot跟jsp的整合
默认在webapp里面的jsp不能访问到。springboot不推荐使用jsp作为表现层的页面。如果我们想让springboot和jsp在一块工作我们需要对springboot进行配置。
-
需要在maven里面安装springboot的插件。修改pom.xml文件。
<!--pom文件中以前的插件可以删除,用jsp的插件替代--> <build> <finalName>springboot_day1</finalName> <!--引入jsp运行插件--> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.4.RELEASE</version> <!--使用热部署出现中文乱码解决方案--> <configuration> <fork>true</fork> <!--增加jvm参数--> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> </configuration> </plugin> </plugins> </build>
注意事项:pom文件中以前的插件可以删除掉。这个标签不能放在依赖里面。
-
引入jsp需要的依赖。
<!--整合jsp--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>2.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>8.5.34</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
-
jsp要求热部署。需要在springboot进行配置。
#设置jsp的热部署 server.servlet.jsp.init-parameters.development=true
在application.properties文件中配置。
-
测试。
使用jsp插件后,我们启动springboot框架时,就不在运行Application类中的主函数了。我们通过springboot的run插件运行springboot框架。
常见错误
-
使用spring-boot-maven-plugin插件后报错,报错信息:
Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.1.RELEASE:run (default-cli) on project springboot_day102: Application finished with exit code: 1
解决办法:先把jsp的热部署配置去除。jsp.init-parameters.development:true
-
在mybatis-plus里面使用pageHelper后报错的解决办法:
NoClassDefFoundError: org/mybatis/logging/LoggerFactory
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> <!--pageHelper跟mybatis-Plusjar包冲突,我们排除掉插件依赖的mybatis版本--> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </exclusion> </exclusions> </dependency>
不同的idea版本查看错误的地方是不一样的。需要自己找一下。
-
端口号被占用 address is in use
检查tomcat是否启动,idea里面检查,看看idea外部是否启动tomcat,到任务管理器里面关闭java.exe进程
jackson
jackson和fastjson都是json转换工具,这些工具可以将java对象转换为json字符串。我们在使用ajax技术的时候需要用到他。常见的转换工具:jackson,fastjson,gson
springboot里面默认使用的json转换工具是jackson。jackson和fastjson的用法基本一样。唯一的区别是常见的注解不一样。
springboot里面使用jackson设置日期属性常见方式有两种:
-
在实体类的属性上添加注解。优先级高。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date birth;
-
在yml配置文件中设置全局的日期格式。优先级低
spring: datasource: url: jdbc:mysql://localhost:3306/idea_day1?useUnicode=true&characterEncoding=utf8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver jackson: date-format: yyyy-MM-dd time-zone: GMT+8
springboot实现文件上传
-
写jsp,跟以前一样。有三点:method,enctype,type=file
-
控制器。跟以前一样。
@Controller @RequestMapping("/user") public class UserController { @Value("${imgPath}")//获取springboot配置文件中的变量,把配置文件中的变量赋值给该属性 private String path; @RequestMapping("/upload") public String upload(MultipartFile headImg,String username) throws IOException { headImg.transferTo(new File(path,headImg.getOriginalFilename())); return "forward:/success.jsp"; } }
-
把d盘普通文件夹部署到服务器上。
#配置数据库的连接信息 spring: datasource: url: jdbc:mysql://localhost:3306/idea_day1?useUnicode=true&characterEncoding=utf8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver resources: static-locations: file:${imgPath} servlet: multipart: max-request-size: 3MB #设置总的请求大小 max-file-size: 2MB #设置单个文件上传的大小 #设置一个路径供配置文件和controller共用 imgPath: d:\\testImg
上传后,通过浏览器访问的路径:
http://ip:port/appName/(testImg文件夹里面图片的名字)
mybatis-plus的代码生成器
mybatis-plus可以根据表生成我们的实体类,dao接口,mapper文件,业务接口,业务类,和一个空的控制器类。
-
引入代码生成器的依赖。
<!--代码生成器的依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency>
-
写生成java代码(实体类,dao接口,mapper文件,业务接口,业务类)的代码。
这个界面可以设置代码生成到model里面。
- 生成后,代码生成器就没有用了。
springboot没有使用log4j记录日志,logback
springboot中是使用了logback来记录日志信息的。我们需要引入logback的配置文件放到resources文件夹里面。来打印执行的sql信息。信息的输出级别ERROR>WARN>INFO>DEBUG
mybatisPlus中的分页方法
mybatisPlus中自带了分页功能,那么我们就可以使用mybatisPlus中的分页替换PageHelper分页。
使用的步骤:
-
写配置类。com.baizhi.config 专门放置配置类。存放分页插件的配置类。
//这是一个配置mybatisplus分页插件的类。 /* * 替换之前的 * <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> </plugins> * */ @Configuration//该类是一个配置类 public class MyBatisPlusPageInterceptor { @Bean //<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/> public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
-
在测试类添加分页的测试方法。
/*分页*/ @Test public void testQuery3(){ //第一个参数是当前页号,第二个参数是一页显示多少条数据 Page<Student> page=new Page<>(1,3); //增加查询条件 QueryWrapper<Student> qw=new QueryWrapper<>(); qw.gt("age",20); //返回值里面存储了当前页的所有信息,等价于以前的PageInfo对象 IPage<Student> p = studentService.page(page,qw); //获取当前页数据 List<Student> records = p.getRecords(); records.forEach(System.out::println); }