Springboot学习过程
https://blog.csdn.net/zxzzxzzxz123/article/details/69941910
1:注解学习:
1.1 @SpringBootApplication 注解(开启springboot自动配置)
SpringBoot的核心注解,是一个组合注解,由@Configuration , @EnableAutoConfiguration , @ ComponentScan组成。直接使用@SpringBootApplication 和 @Configuration,@EnableAutoConfiguration,@ComponentScan是一样的效果。
@Configuration:是做类似于spring xml 工作的注解,标注在类上,类似以前的**.xml。标明这个类是一个配置类。
@EnableAutoConfiguration: SpringBoot自动配置时需要的注解,会让SpringBoot根据类路径中的jar包以来为当前项目进行自动配置。同时也是一个组合注解。
@EnableAutoConfiguration:此注解自动载入应用程序多需的所有bean。
在@EnableAutoConfiguration中用了@Import注解导入EnableAutoConfigurationImportSelector类,而这个类就是自动配置的关键。
@Import:Spring4.2之前只支持导入配置类,Spring4.2之后支持导入普通的java类,并将其声明成一个bean.
@ComponentScan:告诉Spring哪个packages的用注解标识的类会被spring自动扫描并且装入bean容器。
SpringBoot的自动配置:SpringBoot的一大特色就是自动配置,例如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和SpringMVC的依赖,SpringBoot会对Tomcat和SpringMVC进行自动配置。
又例如:添加了spring-boot-starter-data-jpa依赖,SpringBoot会自动进行JPA相关的配置。
SpringBoot会自动扫描@SpringBootApplication所在类的同级包以及下级包的Bean(如果为JPA项目还可以扫描标注@Entity的实体类),所以建议入口类放置在最外层包下。
1.2SpringBoot启动过程:
这里调用了SpringApplication的静态run方法,并将Application类对象和main方法的参数args作为参数传递。
https://blog.csdn.net/zxzzxzzxz123/article/details/69941910
具体加载过程详见网址,反正我没看懂。
一个实例:https://blog.csdn.net/u013187139/article/details/68944972
1.2:@ImportResource
SpringBoot 提倡零配置,即无xml配置,但是在实际项目中,可能有一些特殊要求你必须使用xml配置,这时我们就可以通过Spring提供的@ImportResource来加载xml配置,例如:
1.3:@ConfigurationProperties
有时候有这样子的情景,我们想把配置文件的信息,读取并自动封装成实体类,这样子,我们在代码里面使用就轻松方便多了,这时候,我们就可以使用@ConfigurationProperties,它可以把同类的配置信息自动封装成实体类.
在配置文件里面,我定义了一个user对象:
然后新建了一个用户对象,和配置文件里的相对应。
@Component 加上会进行扫描。
@ConfigurationProperties(prefix = "user")
Prefix代表前缀,配置文件中我定义的是user.name,所以前缀为user的会映射到对象中,前缀后面的名称会作为映射的属性。
1.4:@RestController
@RestController是一个组合注解,是@Controller和@ResponsBody的组合。
@RestContRoller返回的是json数据。
在类上面写了,方法上面就不用写@ResponsBody了
1.5:@GetMapping,@PostMapping,,
这两句话是一样的意思:
1.6:@RequstParam
用于接收前台传递过来的参数。
1.7:@Transactional 开启事务
往往我们在处理事务的时候,比如典型的银行转账问题,A方必须账户少了一千的同事,B的账户才能增加一千。要么全成功,要么全失败。
2:配置文件学习
2.1 profiles(用于选择用哪个配置文件)
我们经常需要把生产环境和测试环境的配置进行区分开,application-dev是测试环境的,
Application-prod是生产环境。使用Spring-profiles-active决定使用哪个配置文件。
3:springboot开启热部署(devtools)
每次修改了文件就重新部署启动tomcat,实在是很麻烦,所以现在配置springboot热部署。
使用devtools。在pom.xml中添加devtools的依赖。
然后在配置文件application-dev.xml中开启热部署功能,如图所示:
thymeleaf是前台界面的,和jsp差不多,但是springboot采用了前者,肯定有有点,后续解释。设置cahe等于true,就是每次修改前台界面之后不会有缓存,会实时刷新。
最后两行,是不需要进行重新加载的文件,比如一些不会变动的文件或者静态的。
经过上面的配置,我发现修改了java文件并没有进行重新部署,于是搜寻了资料,发现需要:
在pom.xml中添加:
然后在file->setting中,找到勾上
然后按住ctrl+shift+a,搜索Registry,选择第一个,进去找到compiler.automake.allow.when.app.running打上勾即可。
4:springboot整合Oracle,mysql,JPAHibernate
4.1 在maven库添加依赖Oracle依赖遇到的问题
首先,springboot的maven库中没有oracle的jar包,包括通过依赖进行下载也是不可以的,估计是因为收费。而我们使用的maven,如果通过在web-inf下的lib下添加Oracle的jar包也是不可行的。解决方法如下:在此之前,需要安装maven库,配置环境,才能使用mvn命令。
然后新建一个文件夹:将ojdbc14.jar放到里面。然后再此文件夹下运行此命令:
cmd输入mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=11.1.0.6.0 -Dpackaging=jar -Dfile=ojdbc14.jar
安装成功之后就可以了:
4.2:IDEA修改自己的maven库地址
搜maven:
修改成自己的maven库地址,默认是保存到c盘去了。
4.3整合Oracle
首先是添加依赖,按照4.1进行的时候,我的jdk是1.8会进行报错,只需要按照4.1的步骤安装ojdbc6就可以了。
我这里的命令是:
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar -Dfile=ojdbc6.jar
通过maven安装之后,在pom.xml中添加依赖就可以了。
然后在application.yml中进行配置:
我的实体类:get,set方法省略了。
4.4整合Mysql
springboot本身是支持mysql的。
添加依赖:
然后在application.yml中配置mysql:之前一直报错,原因是在配置Mysql驱动的时候
用户名username写成了name,导致出错。
在配置mysql的时候一直出错:access denied for user 'root'@'localhost'(using password:YES)
这个错误的原因有两个,一个是配置文件出错,比如我开始的username写成了name。
如果配置文件没有错误的话,就检查一下用户的权限。
grant all privileges on *.* to root@'%' identified by '******' //***表示数据库连接密码
这个是赋予以root开头的用户所有的权限。
再解释下,图中jpa的ddl-auto的选择各个的意思:
4.5到此为止就可以实现一个简单的查询操作了
这里使用的是jpa,pom里面也导入了hibernate,pom里面也配置了。
Hibernate实现了jpa规范,所以以下使用的就是底层hibernate查询的,基本的操作通过接口继承了JPARepository都已经实现了。请看:
4.5.1 控制层
4.5.2 服务层
因为这里用到了JPA,就比较容易实现:jpa需要添加依赖:
然后在application.yml中可以配置相关配置:
然后使用JPA进行查询:
然后进行请求和查看结果:
到此一个简单的查询就完成了。
到这,出现了一个疑问,如果我自己业务复杂的话,需要自己写sql语句是怎么实现的呢,
这里我实现了简单的查询操作:
如果不遵循jpa规范的话是不会调用jpa进行查询的,会按照自己写的sql语句进行查询。
在接口上面夹一个@Query,参数通过@Param,比较简单。
这个是通过hibernate的hql语句进行查询的。
进行原生sql查询:
执行一个插入操作,jpa是有封装好的,自己写一个,涉及到了几个注解。
@Modifying,代表的是这是一个修改操作,和查询区分开。注意这里要添加@Transactional,开启事务,不然报错。
再来思考一下分页是怎么实现的:如图所示:
第一步,除了继承JpaRepository这个接口之外还需要继承JpaSpecificationExecutor这个接口。因为JpaRepository里面没有实现分页的方法:
JpaSpecificationExecutor:
然后根据这个方法的参数类型和返回值类型进行传递。
然后新建了一个service注入userRepository,实现分页:
到此差不多稍微复杂一点的也能实现了。
5:RestFul规则以及JPA
5.1 RestFul是什么
restFul是一种规范,是一种设计风格。
有看出来有什么不同吗,之前的操作都没有问题,但是我们每次请求的地址都再做描述,比如查询的时候用了query,新增的时候用了save,其实没必要,Restful之后,get就是进行查询,post请求就是亲增请求。没必要再进行描述。
5.2 jpa是什么
Java Persistence API:用于对象持久化的 API
Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层
与JDBC类似,JPA统一了java应用程序访问ORM框架的规范。
以前我们的应用程序直接使用ORM框架,如hibernate,mybatis。但是不同的框架使用方法不一样,而JPA让我们以同样的方式访问不同的ORM框架。常用的框架是hibernate。
JPA与hibernate的关系
JPA是一个规范,不是框架
hibernate是JPA的实现
6:springboot整合Mybatis
先看一下最终项目目录:
Users:
UsersMapper接口:自动生成,自己的方法再加。
UsersMapper.xml类。通过配置的工具反向生成的。
6.1:在pom.xml中引入相关依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入Mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!--引入Oracle-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<!--用于开启热部署的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
<!-- mybatis generator 自动生成代码插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<configuration> <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
</project>
其中包含Mybatis的依赖以及数据库连接池,分页等工具依赖的引入。
比较重要是配置mybatis的自动生成代码插件。
6.2 配置application.yml的配置文件
server:
port: 8080 #配置tomcat的默认访问端口号
servlet:
context-path: /demo #配置tomcat默认访问地址
session:
timeout: 60 #配置session的超时时间,默认30分钟
spring:
datasource:
name: demo
url: jdbc:mysql://127.0.0.1:3306/mysql
username: root
password: root
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
mybatis:
mapper-locations: classpath:mapper/*.xml #指定映射xml的位置
type-aliases-package: com.mapper #指定生成接口的位置
#pagehelper分页插件
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
debug: true
重点就是配置了关于myBatis的相关配置。
6.3 创建数据库,这里我用的mysql
//CREATE DATABASE mysql;
CREATE TABLE t_user(
user_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(255) NOT NULL ,
password VARCHAR(255) NOT NULL ,
phone VARCHAR(255) NOT NULL
) ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;
6.6:使用mybatis generator 自动生成代码
配置pom.xml中generator 插件所对应的配置文件 ${basedir}/src/main/resources/generator/generatorConfig.xml
generatorConfig.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>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
<classPathEntry location="C:\Users\rongji\Desktop\springboot\mysql-connector-java-5.1.6.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/mysql" userId="root" password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.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.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="t_user" domainObjectName="Users" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
配置了连接数据库的驱动地址,以及链接数据库的参数,和反向生成文件的地址。
然后第一步:
第二步:建立一个maven运行窗口,输入mybatis-generator:generate -e
命令,点击ok.
然后点击运行:
最后生成的文件结构就如图所示了。
还有最重要的一步:在启动类上面添加mapper接口的扫描。
接下来就可以实现一个简单的接口实现类了:
控制层:
注入mapper显示红色,是不影响使用的,如果影响的话,就查看一下是否在启动类上面注入了mapper的扫描地址。
到此运行成功。自己添加方法只需要添加接口,并且在xml中添加即可。
在mapper中添加自己的方法:
在mapper.xml中添加实现:
控制层访问:
结果也是正确的:
详细介绍博客:https://blog.csdn.net/winter_chen001/article/details/77249029