springboot
1.springboot的概念
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
2.springboot的相关特点
-
创建独立的spring应用程序
-
内嵌tomcat,不需要部署
-
简化maven配置
-
自动配置
-
无需xml相关的配置
spring1.x xml
spring2.x 注解 数据持久层使用xml 业务层使用注解
spring.3.x java配置
spring 4.x java配置
spring 4.x java配置
xml | @configuration |
---|---|
bean标签的形式 | @Bean |
注意 @Bean用来修饰方法,表明返回值交由对象管理
** @configuration 用来修饰类表名当前类为配置类.**
3.springboot的约束
-
src/main/java
com.baizhi 主包
entity 子包
dao
service
controller
conf
入口类 注意:入口类必须在主包下和子包同级
-
src/main/resources
springboot的配置文件 注意:配置文件名字必须叫application,将配置文件放置在resources目录下
- application.yml
- application.yaml
- application.properties
-
src/test/java
-
src/test/resources
4.使用maven搭建springboot的第一个环境
-
导入jar
<!--父级项目依赖--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <!--web支持的jar springboot的启动器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--测试支持的jar--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <!-- 只在test测试里面运行 --> <scope>test</scope> </dependency>
-
开发入口类
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class,args); } }
-
开发配置文件 yml的配置文件需要注意属性名和属性值之间有空格的间隔
注意:默认启动端口号为8080
默认启动没有项目名
server: port: 8989 context-path: /springboot
1.注解剖析
1.@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan
//当前的注解是一个组合注解
@Configuration //作用:声明当前类是一个配置类
@ComponentScan //作用:组件扫描 把一些加有@service @controller @component @repository注解的对象交由工厂管理
@EnableAutoConfiguration //开启自动配置 datasource sqlsessionFactorybean mapperScanner
2.@RestController //作用:组合注解 @Controller @ResponseBody 声明当前类为控制器,并且类中所用方法返回json
注意:springboot默认不支持jsp,默认的视图层模版为thmyleaf
5.快速搭建springboot应用程序
6.springboot和第三方技术的集成
6.1.mybatis
1.导入jar
<!--整合mybatis-->
<!--mybatis和springboot的整合包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
<!--数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.19</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--mybatis的核心jar-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
2.相关的配置
注意:springboot采用自动配置 装配相关对象所以不需要手动配置相关的组件,但是需要声明动态的参
数,如数据源相关参数
server:
port: 8989
context-path: /springboot
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:oracle:thin:@localhost:1521:xe
driver-class-name: oracle.jdbc.OracleDriver
username: hr
password: hr
mybatis:
mapper-locations: classpath:com/baizhi/mapper/*Mapper.xml
type-aliases-package: com.baizhi.entity
3.手动声明dao包的位置加入注解@MapperScan
6.2.lombok
1.概念
使java代码变的更加优雅,以注解的方式代替之前的冗长代码,底层采用字节码技术生成相应方法
2.使用lombok
1.下载lombok相关插件
2.下载lombok的jar
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
3.常用注解的解释
@Data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter :注解在属性上;为属性提供 setting 方法
@Getter :注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor :注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor :注解在类上;为类提供一个全参的构造方法
@NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
@Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
6.3.MBG(mybatis-generator)
1.相关介绍
mybatis的一个插件,根据创建数据库表,生成实体类,dao,mapper文件
2.使用
1.导入jar以及插件
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
</dependencies>
<configuration>
<!--配置文件的路径 -->
<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
</plugin>
2.添加generator.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="test" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<commentGenerator>
<!-- 这个元素用来去除指定生成的注释中是否包含生成的日期 false:表示包含 -->
<!-- 如果生成日期,会造成即使修改一个字段,整个实体类所有属性都会发生变化,不利于版本控制,所以设置为true -->
<property name="suppressDate" value="true" />
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@localhost:1521:xe" userId="hr" password="hr">
</jdbcConnection>
<javaTypeResolver>
<!-- This property is used to specify whether MyBatis Generator should
force the use of java.math.BigDecimal for DECIMAL and NUMERIC fields, -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成模型的包名和位置 entity -->
<javaModelGenerator targetPackage="com.baizhi.entity"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成映射文件的包名和位置 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成DAO的包名和位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.baizhi.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 要生成哪些表 -->
<table tableName="city" domainObjectName="City"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
3.执行 mybatis-generator:generate
6.4.通用mapper 官网:https://github.com/abel533/Mapper/wiki
1.通用mapper和MBG对比
MBG | 通用Mapper |
---|---|
反向生成实体,dao,mapper | 通过实体帮你生成sql语句 |
2.通用mapper的使用
1.导入的jar
<!--通用mapper的启动器 注意这是mybatis和mybatis启动器的封装-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.19</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>oracle</artifactId>
<version>1.0.0</version>
</dependency>
2.配置
server:
port: 8989
context-path: /springboot
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:oracle:thin:@localhost:1521:xe
username: hr
password: hr
driver-class-name: oracle.jdbc.OracleDriver
mybatis:
type-aliases-package: com.baizhi.entity
3.包扫描@MapperScan 注意:不要使用mybatis原生的注解而是采tk.mybatis.spring.annotation.MapperScan
4.mapper接口继承Mapper
3.通用mapper的相关注解
@Table //用在类上 声明数据库的表名
@Id //用在属性上 声明当前属性为主键
@Column(name ="username") //作用在属性上 用来指定数据库中的字段名称
//注意:建议使用驼峰命名法 数据库中以下划线分割如 userage 实体类中要使用驼峰规则如 userAge
//主键策略 两种形式分别是oracle 和 mysql
//oracle
@KeySql(sql = "select sm_user_seq.nextval from dual", order = ORDER.BEFORE)
//mysql
@KeySql(useGeneratedKeys = true)
@Transient //用在属性上 作用声明当前属性不是数据库中的列
// 分页 RowBounds rowBounds=new RowBounds(4,4); 第一个参数是起始下标 第二个参数是每页的条数
6.5.spirngboot集成jsp
1.导入jar
<!-- 给内嵌tomcat提供jsp解析功能的jar-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2.修改springboot配置的视图解析器
spring:
mvc:
view:
prefix: /
suffix: .jsp
3.以插件形式启动 官方提供的插件
注意:由于内嵌tomcat默认不支持页面热部署的功能需要添加相关的配置
server:
jsp-servlet:
init-parameters:
development: true
6.6.springboot中需要处理的小细节
1.乱码
1.由于springboot启动其中已经配置了编码过滤器,源码如下,并且默认值为UTF-8,所以不需要配置
@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
2.如果配置配置项如下
spring:
http:
encoding:
charset: utf-8
force: true
2.文件上传
1.springboot默认装配了文件处理器,源码如下 默认单个文件大小为1MB,一次请求携带的文件大小为10MB
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
return multipartResolver;
}
2.自定义配置
spring:
http:
multipart:
max-file-size: 10MB
max-request-size: 100MB
3.日期格式如何接受
1.方法1:在实体类上加上注解
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
2.方法2:全局配置,配置yaml
#配置Jackson时间格式转换
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
4.静态资源处理
1.不需要处理
get请求优先找静态资源,找controller
post请求直接找controller
5.测试
1.导入测试相关的启动器,默认集成的junit所以无需再次导入junit的jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.注解
@Runwith(SpringRunner.class) //启动spring的工厂
@SpringbootTest //开启自动配置,并且装配项目中相关bean,如dao,service,controller
6.配置文件切分
1.由于实际开发时需要生产环境和测试环境,为了减少测试环境上线时频繁修改配置文件的问题,可以做配置文件的切分,主配置文件中主要配置公共的参数,小配置文件中配置独立的参数
2.如何选择激活哪个配置文件
spring:
profiles:
active: test
7.fastjson的集成 将类型转换器交由工厂管理
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
2.相关注解
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
6.7.springboot集成logback
6.7.1.log4j.properties
1.日志的级别:debug—info—warn–error 日志级别越低打印日志量越多,越详细
2.日志的分类: 父日志(根日志) 控制全局日志
子日志 某个包中的日志 子日志优先级高于父日志
3.Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
4.Layout:日志输出格式,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
5.打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22 : 10 : 28 , 921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )
6.7.2.logback.xml
1.由于springboot集成了logback所以不需要引入jar直接导入配置文件即可
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern> [%p] [%d{yyyy-MM-dd HH:mm:ss}] %m %n</pattern>
</layout>
</appender>
<root level="info">
<appender-ref ref="stdout"/>
</root>
<logger name="com.baizhi.mapper" level="DEBUG"/>
</configuration>
7.springboot中的属性注入
7.1.spring的属性注入方式
@Configuration
@PropertySource(value = "classpath:jdbc.properties")
public class JavaConf {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driver}")
String driver;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(url);
druidDataSource.setDriverClassName(driver);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
7.2.springboot的注入形式
1.第一种属性注入方式
声明配置属性类
@ConfigurationProperties(prefix = "jdbc")
public class JDBCProp {
String url;
String driver;
String username;
String password;
}
在相关配置类中引入当前属性类
@EnableConfigurationProperties(value = JDBCProp.class)
public class JavaConf {
@Autowired
JDBCProp jdbcProp;
}
2.第二种注入方式 注意:配置文件中的属性必须和当前对象属性保持一致
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
注意:通过属性注入的方式可以修改容器中的bean
7.2springboot 自动装配原理
springboot通过启动器的形式将一些必须创建的bean先创建出来,比如视图解析器,处理器适配器,处理器映射器,后续开发者可以通过手工配置bean的形式覆盖原来的对象,或者可以通过更简单的属性注入的方式修改该实例.
8.idea中的debug调试
1.使用方式 在相关的类上标注断点,以断点模式启动
如果想执行下一步操作, f8
结束当前的断点,或者是下一个断点,f9
进入方法体,f7
跳出方法体shift+f8
9.mybatis的分页插件之pagehelper
1.导入pagehelper的启动器
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.2</version>
</dependency>
第一个参数为 页码 第二个参数为 每页显示多少条
PageHelper.startPage(1,3);
List<User> users = userMapper.selectAll();
turn druidDataSource;
}
注意:通过属性注入的方式可以修改容器中的bean
###### 7.2springboot 自动装配原理
springboot通过启动器的形式将一些必须创建的bean先创建出来,比如视图解析器,处理器适配器,处理器映射器,后续开发者可以通过手工配置bean的形式覆盖原来的对象,或者可以通过更简单的属性注入的方式修改该实例.
## 8.idea中的debug调试
1.使用方式 在相关的类上标注断点,以断点模式启动
```java
如果想执行下一步操作, f8
结束当前的断点,或者是下一个断点,f9
进入方法体,f7
跳出方法体shift+f8
9.mybatis的分页插件之pagehelper
1.导入pagehelper的启动器
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.2</version>
</dependency>
第一个参数为 页码 第二个参数为 每页显示多少条
PageHelper.startPage(1,3);
List<User> users = userMapper.selectAll();