springboot基础文档.docx
《springboot基础文档.docx》由会员分享,可在线阅读,更多相关《springboot基础文档.docx(25页珍藏版)》请在冰豆网上搜索。
![springboot基础文档.docx](https://file1.bdocx.com/fileroot1/2023-2/24/731370b5-7f8e-46ef-878a-0c9799599c85/731370b5-7f8e-46ef-878a-0c9799599c851.gif)
springboot基础文档
在IDEA环境下创建一个Springboot程序
一、点击NewProject后,选择SpringInitializr。
如下图所示,此时,如果右侧你的JDK自动出现了,那可以省很多事。
如果没有自动出现,则需要你点击New,去选择你JAVA的安装目录。
(为什么需要这样因为Spring的运行需要JAVA,所以IDE需要知道你的JAVA安装目录。
)
二、进入下一步后,会让你设置一下你工程的名字等基本信息。
三、然后这个界面比较重要,它的作用是在开始的时候,自动下载一些jar包。
你勾选一个,他就会自动下载。
请按照需求勾选。
四、填写工程名
五、OK,现在Intellij就自动为我们创建好一个Springboot的程序了哦~如下图所示:
Springboot写一个Helloworld
现在开始写第一个HelloWorld~看下图:
上图中的是一个包名,为了代码可读性高,我们会使用MVC的开发模式,在这个包下面,再新建几个包,分别用来写不同的代码。
需要新建的包如下:
1.controller包:
用来写控制器代码,控制器对应不同的请求,是网络请求的第一层。
2.model包:
里面每个class可以对应一个数据表,当你写好class,并且运行工程时,Springboot和Hibernate会自动为你在数据库里创建表。
3.repository包:
这里封装了所有对数据表的增删改查操作。
以后你需要操作数据库,其实就是使用这里的接口。
4.service包:
比如把登录、注册等一个完整的逻辑,封装为一个service,供controller调用,可以极大地简化开发,同时代码也具有更高的可读性。
下面,让我们来建立这四个包吧~在这个包上右键,然后new一个包出来。
如图所示:
我这里创建好包名后,目录结构是这样的:
好了,到这一步,我们终于可以开始写代码啦~~~在本文里,我们将不会用到service、model、repository,只会用到controller来写一个简单的HelloWorld。
让我们开始写吧:
首先,在controller这个包上点击右键,新建一个class,名字就叫nana,如下图所示:
建立好文件后,我们在这个文件里输入以下的代码:
【注意,如果没有严格按照前面的教程来,你的包名可能和我的不一样,所以这个代码复制过去后,请自己检查一遍!
】
package * Created by longge93 on 16/4/14.
*/
@RestController
@EnableAutoConfiguration
public class nana {
@RequestMapping(value="/",method =
public String index(){
return "Hello World~";
}
}
然后我们来运行以下我们的工程,运行方法如下图所示:
如上图所示,点击那个三角形,就可以运行我们的工程了。
不过,所有写代码的过程都是不顺利的~~虽然我们点了运行,但是下面的控制台里却提示我们运行失败了,从上图的下面看出,是hibernate出错了。
为什么呢因为我们在Maven里包含了MySQL的jar包,但是却没有配置数据库连接需要的账号和密码等信息。
所以hibernate会报错~~因为我们这篇文章里,只是为了输出helloworld,用不着数据库。
所以我们先去pom文件里注释掉数据库相关的jar包应该就OK了。
我注释完后,我的pom文件是这样的,请仔细检查:
xsi=""
xsi:
schemaLocation=" ">
demo
jar
demo
Demo project for Spring Boot
spring-boot-starter-parent
-- lookup parent from repository -->
< <>>
spring-boot-starter-aop
---->
-- --spring-boot-starter-data-jpa-->
---->
---->
-- --spring-boot-starter-jdbc-->
---->
---->
-- --spring-boot-starter-redis-->
---->
spring-session
spring-boot-starter-thymeleaf
spring-boot-starter-web
---->
--mysql-->
--mysql-connector-java-->
--runtime-->
---->
spring-boot-starter-test
test
spring-boot-maven-plugin
此时,依然报错:
CannotdetermineembeddeddatabasedriverclassfordatabasetypeNONE
解决办法:
注释掉pom文件中jap和session,在完成以后,pom配置如下
xsi=""
xsi:
schemaLocation=" ">
demo
jar
demo
Demo project for Spring Boot
spring-boot-starter-parent
-- lookup parent from repository -->
<<<>>
spring-boot-starter-aop
spring-boot-starter-web
spring-boot-starter-test
test
spring-boot-starter-thymeleaf
spring-boot-maven-plugin
然后我们再点击那个三角形运行,你会发现运行成功啦~~如下图所示:
因为Springboot其实已经自带Tomcat了,所以当我们把这个工程跑起来后,其实就相当于跑起来一个网站。
现在让我们去网页里看看我们的HelloWorld有没有正常工作吧~
在浏览器里,打开,你会发现输出了HelloWorld~~
来源:
boot在Springmvc下接入微信
在我们搭建好Springboot环境后,可以很容易的使用Springmvc,不需要复杂的配置,只需要做一些基本的注解就行了。
这一章讲述如何在Springmvc下去接入微信。
一、接入微信需要一个公网IP,这里我们使用的是ngrock内网穿透工具。
运行--》cmd,进入ngrock解压目录,输入命令ngrok-subdomain yxpeng -config= 8080
其中yxpeng是可以自己配置的子域名,8080端口通常设置为你的项目运行的端口,因为我这边默认的是8080,所以我设置成了8080.
二、与用servlet接入微信一样的,我们需要接受到微信后台通过get请求传过来的几个参数。
首先,写了一个model,其中封装了这四个参数。
package
/**
*微信接入校验信息model
*CreatedbyAdministratoron2016/11/80008.
*/
publicclassCheckModel{
privateStringsignature;
privateLongtimestamp;
privateLongnonce;
privateStringechostr;
publicStringgetSignature(){
returnsignature;
}
publicvoidsetSignature(Stringsignature){
=signature;
}
publicLonggetTimestamp(){
returntimestamp;
}
publicvoidsetTimestamp(Longtimestamp){
=timestamp;
}
publicLonggetNonce(){
returnnonce;
}
publicvoidsetNonce(Longnonce){
=nonce;
}
publicStringgetEchostr(){
returnechostr;
}
publicvoidsetEchostr(Stringechostr){
=echostr;
}
}
创建一个controller类,其中添加一个validate方法,用来接收这个model并进行处理
package
import
import
import
import
import
import
import
import
/**
*CreatedbyAdministratoron2016/11/90009.
*/
@RestController
@RequestMapping("/user")
@EnableAutoConfiguration
publicclassUserController{
@Autowired
privateUserServiceuserService;
@RequestMapping("/check/{name}")
public@ResponseBodyStringaddUser(@PathVariable("name")Stringname){
Useruser=newUser();
(name);
("123");
("喻学鹏");
(user);
return();
}
@RequestMapping("/find/{name}")
public@ResponseBodyStringfindUserByName(@PathVariable("name")Stringname){
Useru=null;
u=(name);
if(u!
=null){
return();
}else{
return"未找到";
}
}
}
在tokenService中,分离出这四个参数,然后对token,timestamp和nonce这三个参数进行字典排序,然后进行SHA1加密,将密文与signature对比,如果相同就返回echostr.
package
import
import
import
import
import
/**
*CreatedbyAdministratoron2016/11/80008.
*/
@Service
publicclassTokenService{
/**
*微信接入数据验证
*@paramwxToken
*@paramtokenModel
*@return
*/
@Transactional
publicStringvalidate(StringwxToken,CheckModeltokenModel){
Stringsignature=();
Longtimestamp=();
Longnonce=();
Stringechostr=();
if(signature!
=null&×tamp!
=null&nonce!
=null){
String[]str={wxToken,timestamp+"",nonce+""};
(str);oLowerCase();
+
+"=:
username"),
@NamedQuery(name="getUsernamePasswordToken",
query="selectnewfromUseruwhereu."+
+"=:
username")})
(2)在interface中定义与
(1)对应的方法
publicinterfaceUserRepositoryextendsJpaRepository{
ListfindByLastname(Stringlastname);
UserfindByEmailAddress(StringemailAddress);
}
使用@Query自定义查询(SpringData提供的)
这种查询可以声明在Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Springdata的特有实现。
例如:
publicinterfaceUserRepositoryextendsJpaRepository{
@Query("selectufromUseruwhere=1")
UserfindByEmailAddress(StringemailAddress);
}
@Query与@Modifying执行更新操作
这两个annotation一起声明,可定义个性化更新操作,例如只涉及某些字段更新时最为常用,示例如下:
@Modifying
@Query("updateUseruset=1where=2")
intsetFixedFirstnameFor(Stringfirstname,Stringlastname);
索引参数与命名参数
(1)索引参数如下所示,索引值从1开始,查询中”X”个数需要与方法定义的参数个数相一致,并且顺序也要一致
@Modifying
@Query("updateUseruset=1where=2")
intsetFixedFirstnameFor(Stringfirstname,Stringlastname);
(2)命名参数(推荐使用这种方式)
可以定义好参数名,赋值时采用@Param("参数名"),而不用管顺序。
如下所示:
publicinterfaceUserRepositoryextendsJpaRepository{
@Query("selectufromUseruwhere=:
firstnameor=:
lastname")
UserfindByLastnameOrFirstname(@Param("lastname")Stringlastname,
@Param("firstname")Stringfirstname);
}
4.Transactionality(事务)
操作单个对象的事务
SpringData提供了默认的事务处理方式,即所有的查询均声明为只读事务,对于持久化,更新与删除对象声明为有事务。
参见ID>
@
@Transactional(readOnly=true)
publicclassSimpleJpaRepositoryimplementsJpaRepository,
JpaSpecificationExecutor{
……
@Transactional
publicvoiddelete(IDid){
delete(findOne(id));
}
……
}
对于自定义的方法,如需改变springdata提供的事务默认方式,可以在方法上注解@Transactional声明
涉及多个Repository的事务处理
进行多个Repository操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在Service层实现对多个Repository的调用,并在相应的方法上声明事务。
例如:
@Service(“userManagement”)
classUserManagementImplimplementsUserManagement{
privatefinalUserRepositoryuserRepository;
privatefinalRoleRepositoryroleRepository;
@Autowired
publicUserManagementImpl(UserRepositoryuserRepository,
RoleRepositoryroleRepository){
=userRepository;
=roleRepository;
}
@Transactional
publicvoidaddRoleToAllUsers(StringroleName){