Springboot学习过程
https://blog.csdn.net/zxzzxzzxz123/article/details/69941910
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
SpringBoot 提倡零配置,即无xml配置,但是在实际项目中,可能有一些特殊要求你必须使用xml配置,这时我们就可以通过Spring提供的@ImportResource来加载xml配置,例如:
有时候有这样子的情景,我们想把配置文件的信息,读取并自动封装成实体类,这样子,我们在代码里面使用就轻松方便多了,这时候,我们就可以使用@ConfigurationProperties,它可以把同类的配置信息自动封装成实体类.
在配置文件里面,我定义了一个user对象:
然后新建了一个用户对象,和配置文件里的相对应。
@Component 加上会进行扫描。
@ConfigurationProperties(prefix = "user")
Prefix代表前缀,配置文件中我定义的是user.name,所以前缀为user的会映射到对象中,前缀后面的名称会作为映射的属性。
@RestController是一个组合注解,是@Controller和@ResponsBody的组合。
@RestContRoller返回的是json数据。
在类上面写了,方法上面就不用写@ResponsBody了
这两句话是一样的意思:
用于接收前台传递过来的参数。
往往我们在处理事务的时候,比如典型的银行转账问题,A方必须账户少了一千的同事,B的账户才能增加一千。要么全成功,要么全失败。
我们经常需要把生产环境和测试环境的配置进行区分开,application-dev是测试环境的,
Application-prod是生产环境。使用Spring-profiles-active决定使用哪个配置文件。
每次修改了文件就重新部署启动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打上勾即可。
首先,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
安装成功之后就可以了:
搜maven:
修改成自己的maven库地址,默认是保存到c盘去了。
首先是添加依赖,按照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方法省略了。
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的选择各个的意思:
这里使用的是jpa,pom里面也导入了hibernate,pom里面也配置了。
Hibernate实现了jpa规范,所以以下使用的就是底层hibernate查询的,基本的操作通过接口继承了JPARepository都已经实现了。请看:
因为这里用到了JPA,就比较容易实现:jpa需要添加依赖:
然后在application.yml中可以配置相关配置:
然后使用JPA进行查询:
然后进行请求和查看结果:
到此一个简单的查询就完成了。
到这,出现了一个疑问,如果我自己业务复杂的话,需要自己写sql语句是怎么实现的呢,
这里我实现了简单的查询操作:
如果不遵循jpa规范的话是不会调用jpa进行查询的,会按照自己写的sql语句进行查询。
在接口上面夹一个@Query,参数通过@Param,比较简单。
这个是通过hibernate的hql语句进行查询的。
进行原生sql查询:
执行一个插入操作,jpa是有封装好的,自己写一个,涉及到了几个注解。
@Modifying,代表的是这是一个修改操作,和查询区分开。注意这里要添加@Transactional,开启事务,不然报错。
再来思考一下分页是怎么实现的:如图所示:
第一步,除了继承JpaRepository这个接口之外还需要继承JpaSpecificationExecutor这个接口。因为JpaRepository里面没有实现分页的方法:
JpaSpecificationExecutor:
然后根据这个方法的参数类型和返回值类型进行传递。
然后新建了一个service注入userRepository,实现分页:
到此差不多稍微复杂一点的也能实现了。
restFul是一种规范,是一种设计风格。
有看出来有什么不同吗,之前的操作都没有问题,但是我们每次请求的地址都再做描述,比如查询的时候用了query,新增的时候用了save,其实没必要,Restful之后,get就是进行查询,post请求就是亲增请求。没必要再进行描述。
Java Persistence API:用于对象持久化的 API
Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层
与JDBC类似,JPA统一了java应用程序访问ORM框架的规范。
以前我们的应用程序直接使用ORM框架,如hibernate,mybatis。但是不同的框架使用方法不一样,而JPA让我们以同样的方式访问不同的ORM框架。常用的框架是hibernate。
JPA与hibernate的关系
JPA是一个规范,不是框架
hibernate是JPA的实现
先看一下最终项目目录:
Users:
UsersMapper接口:自动生成,自己的方法再加。
UsersMapper.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.0modelVersion>
<groupId>com.examplegroupId>
<artifactId>demoartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>demoname>
<description>Demo project for Spring Bootdescription>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.0.RELEASEversion>
<relativePath/>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-coreartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
<groupId>aopalliancegroupId>
<artifactId>aopallianceartifactId>
<version>1.0version>
dependency>
<dependency>
<groupId>com.oraclegroupId>
<artifactId>ojdbc6artifactId>
<version>11.2.0.3version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.0.11version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatypegroupId>
<artifactId>jackson-datatype-jodaartifactId>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.modulegroupId>
<artifactId>jackson-module-parameter-namesartifactId>
dependency>
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelper-spring-boot-starterartifactId>
<version>1.2.3version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>1.3.1version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.0version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<fork>truefork>
<addResources>trueaddResources>
configuration>
plugin>
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<configuration> <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xmlconfigurationFile>
<overwrite>trueoverwrite>
<verbose>trueverbose>
configuration>
plugin>
plugins>
build>
project>
其中包含Mybatis的依赖以及数据库连接池,分页等工具依赖的引入。
比较重要是配置mybatis的自动生成代码插件。
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的相关配置。
//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;
配置pom.xml中generator 插件所对应的配置文件 ${basedir}/src/main/resources/generator/generatorConfig.xml
generatorConfig.xml配置如下:
xml version="1.0" encoding="UTF-8"?>
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"/>
<property name="suppressAllComments" value="true"/>
commentGenerator>
<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>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
javaClientGenerator>
<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