Spring boot基础文档_第1页
Spring boot基础文档_第2页
Spring boot基础文档_第3页
Spring boot基础文档_第4页
Spring boot基础文档_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在IDEA环境下创建一个Spring boot程序一、点击New Project后,选择Spring Initializr。如下图所示,此时,如果右侧你的JDK自动出现了,那可以省很多事。如果没有自动出现,则需要你点击New,去选择你JAVA的安装目录。(为什么需要这样?因为Spring的运行需要JAVA,所以IDE需要知道你的JAVA安装目录。)二、进入下一步后,会让你设置一下你工程的名字等基本信息。三、然后这个界面比较重要,它的作用是在开始的时候,自动下载一些jar包。你勾选一个,他就会自动下载。请按照需求勾选。四、填写工程名五、OK,现在Intellij就自动为我们创建好一个Springboot的程序了哦如下图所示:Spring boot写一个Hello world现在开始写第一个Hello World看下图:上图中的com.example是一个包名,为了代码可读性高,我们会使用MVC的开发模式,在com.example这个包下面,再新建几个包,分别用来写不同的代码。需要新建的包如下:1. controller包:用来写控制器代码,控制器对应不同的请求,是网络请求的第一层。2. model包:里面每个class可以对应一个数据表,当你写好class,并且运行工程时,Springboot和Hibernate会自动为你在数据库里创建表。3. repository包:这里封装了所有对数据表的增删改查操作。以后你需要操作数据库,其实就是使用这里的接口。4. service包:比如把登录、注册等一个完整的逻辑,封装为一个service,供controller调用,可以极大地简化开发,同时代码也具有更高的可读性。下面,让我们来建立这四个包吧在com.example这个包上右键,然后new一个包出来。如图所示:我这里创建好包名后,目录结构是这样的:好了,到这一步,我们终于可以开始写代码啦在本文里,我们将不会用到service、model、repository,只会用到controller来写一个简单的Hello World。让我们开始写吧:首先,在controller这个包上点击右键,新建一个class,名字就叫nana,如下图所示:建立好文件后,我们在这个文件里输入以下的代码:【注意,如果没有严格按照前面的教程来,你的包名可能和我的不一样,所以这个代码复制过去后,请自己检查一遍!】packagecom.example.controller;importorg.springframework.boot.autoconfigure.EnableAutoConfiguration;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RestController;/*Createdbylongge93on16/4/14.*/RestControllerEnableAutoConfigurationpublicclassnanaRequestMapping(value=/,method=RequestMethod.GET)publicStringindex()returnHelloWorld;然后我们来运行以下我们的工程,运行方法如下图所示:如上图所示,点击那个三角形,就可以运行我们的工程了。不过,所有写代码的过程都是不顺利的虽然我们点了运行,但是下面的控制台里却提示我们运行失败了,从上图的下面看出,是hibernate出错了。为什么呢?因为我们在Maven里包含了MySQL的jar包,但是却没有配置数据库连接需要的账号和密码等信息。所以hibernate会报错因为我们这篇文章里,只是为了输出hello world,用不着数据库。所以我们先去pom文件里注释掉数据库相关的jar包应该就OK了。我注释完后,我的pom文件是这样的,请仔细检查:4.0.0com.exampledemo0.0.1-SNAPSHOTjardemoDemoprojectforSpringBootorg.springframework.bootspring-boot-starter-parent1.3.3.RELEASEUTF-81.8org.springframework.bootspring-boot-starter-aop!-!-org.springframework.boot-!-spring-boot-starter-data-jpa-!-!-!-org.springframework.boot-!-spring-boot-starter-jdbc-!-!-!-org.springframework.boot-!-spring-boot-starter-redis-!-org.springframework.sessionspring-sessionorg.springframework.bootspring-boot-starter-thymeleaforg.springframework.bootspring-boot-starter-web!-!-mysql-!-mysql-connector-java-!-runtime-!-org.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin此时,依然报错:Cannot determine embedded database driver class for database type NONE解决办法:注释掉pom文件中jap和session,在完成以后,pom配置如下4.0.0com.exampledemo0.0.1-SNAPSHOTjardemoDemoprojectforSpringBootorg.springframework.bootspring-boot-starter-parent1.3.3.RELEASEUTF-8UTF-81.8 org.springframework.bootspring-boot-starter-aoporg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-starter-thymeleaforg.springframework.bootspring-boot-maven-plugin然后我们再点击那个三角形运行,你会发现运行成功啦如下图所示:因为Springboot其实已经自带Tomcat了,所以当我们把这个工程跑起来后,其实就相当于跑起来一个网站。现在让我们去网页里看看我们的Hello World有没有正常工作吧在浏览器里,打开http:/localhost:8080,你会发现输出了Hello World来源:/Article/5cafb22d-351b-13b5-01e4-c260f480debf.htmlSpring boot在Spring mvc下接入微信 在我们搭建好Spring boot环境后,可以很容易的使用Spring mvc,不需要复杂的配置,只需要做一些基本的注解就行了。这一章讲述如何在Spring mvc下去接入微信。一、接入微信需要一个公网IP,这里我们使用的是ngrock内网穿透工具。 运行-cmd,进入ngrock解压目录,输入命令ngrok -subdomainyxpeng-config=ngrok.cfg8080 其中yxpeng是可以自己配置的子域名,8080端口通常设置为你的项目运行的端口,因为我这边默认的是8080,所以我设置成了8080.二、与用servlet接入微信一样的,我们需要接受到微信后台通过get请求传过来的几个参数。 首先,写了一个model,其中封装了这四个参数。packagecom.example.model;/* * 微信接入校验信息model * Created by Administrator on 2016/11/8 0008. */public class CheckModel private String signature; private Long timestamp; private Long nonce; private String echostr; public String getSignature() return signature; public void setSignature(String signature) this.signature = signature; public Long getTimestamp() return timestamp; public void setTimestamp(Long timestamp) this.timestamp = timestamp; public Long getNonce() return nonce; public void setNonce(Long nonce) this.nonce = nonce; public String getEchostr() return echostr; public void setEchostr(String echostr) this.echostr = echostr; 创建一个controller类,其中添加一个validate方法,用来接收这个model并进行处理package com.example.controller;import com.example.model.webModel.User;import com.example.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;/* * Created by Administrator on 2016/11/9 0009. */RestControllerRequestMapping(/user)EnableAutoConfigurationpublic class UserController Autowired private UserService userService; RequestMapping(/check/name) public ResponseBody String addUser(PathVariable(name) String name) User user = new User(); user.setUserName(name); user.setPassword(123); user.setRealName(喻学鹏); userService.saveUser(user); return user.getUserName(); RequestMapping(/find/name) public ResponseBody String findUserByName(PathVariable(name) String name) User u = null; u = userService.findByUserName(name); if(u != null) return u.getRealName(); else return 未找到; 在tokenService中,分离出这四个参数,然后对token,timestamp和nonce这三个参数进行字典排序,然后进行SHA1加密,将密文与signature对比,如果相同就返回echostr.package com.example.service;import com.example.model.CheckModel;import com.example.util.EncoderHandler;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import java.util.Arrays;/* * Created by Administrator on 2016/11/8 0008. */Servicepublic class TokenService /* * 微信接入数据验证 * param wxToken * param tokenModel * return */ Transactional public String validate(String wxToken, CheckModel tokenModel) String signature = tokenModel.getSignature(); Long timestamp = tokenModel.getTimestamp(); Long nonce =tokenModel.getNonce(); String echostr = tokenModel.getEchostr(); if(signature!=null×tamp!=null&nonce!=null) String str = wxToken, timestamp+, nonce+; Arrays.sort(str); / 字典序排序 String bigStr = str0 + str1 + str2; / SHA1加密 String digest = EncoderHandler.encode(SHA1, bigStr).toLowerCase(); / 确认请求来至微信 if (digest.equals(signature) /最好此处将echostr存起来,以后每次校验消息来源都需要用到 return echostr; return error; 三、登录微信公众平台开发-基本配置填写好URL和token后,点击提交,微信后台就会想填写好的URL发送GET请求。如果校验无误,就会提示接入成功。JpaRepository来源:/blog/2088265什么是Repository?2.1 Repository(资源库):通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调。这个叫法就类似于我们通常所说的DAO,在这里,我们就按照这一习惯把数据访问层叫RepositorySpring Data给我们提供几个Repository,基础的Repository提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别CrudRepository: 继承Repository,实现了一组CRUD相关的方法PagingAndSortingRepository: 继承CrudRepository,实现了一组分页排序相关的方法JpaRepository: 继承PagingAndSortingRepository,实现一组JPA规范相关的方法JpaSpecificationExecutor: 比较特殊,不属于Repository体系,实现一组JPA Criteria查询相关的方法我们自己定义的XxxxRepository需要继承JpaRepository,这样我们的XxxxRepository接口就具备了通用的数据访问控制层的能力。2.2 JpaRepository 所提供的基本功能2.2.1 CrudRepository:这个接口提供了最基本的对实体类的添删改查操作T save(T entity);/保存单个实体 Iterable save(Iterable entities);/保存集合 T findOne(ID id);/根据id查找实体 boolean exists(ID id);/根据id判断实体是否存在 Iterable findAll();/查询所有实体,不用或慎用! long count();/查询实体数量 void delete(ID id);/根据Id删除实体 void delete(T entity);/删除一个实体void delete(Iterable entities);/删除一个实体的集合 void deleteAll();/删除所有实体,不用或慎用!2.2.2 PagingAndSortingRepository这个接口提供了分页与排序功能Iterable findAll(Sort sort);/排序 Page findAll(Pageable pageable);/分页查询(含排序功能)2.2.3 JpaRepository这个接口提供了JPA的相关功能List findAll();/查找所有实体 List findAll(Sort sort);/排序 查找所有实体 List save(Iterable entities);/保存集合 void flush();/执行缓存与数据库同步 T saveAndFlush(T entity);/强制执行持久化void deleteInBatch(Iterable entities);/删除一个实体集合3.Spring data 查询3.1 简单条件查询:查询某一个实体类或者集合按照Spring data 定义的规则,查询方法以find|read|get开头涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写其余字母小写为规定。例如:定义一个Entity实体类class Userprivate String firstname;private String lastname;使用And条件连接时,应这样写:findByLastnameAndFirstname(String lastname,String firstname);条件的属性名称与个数要与参数的位置与个数一一对应3.2 使用JPA NamedQueries (标准规范实现)这种查询是标准的JPA规范所定义的,直接声明在Entity实体类上,调用时采用在接口中定义与命名查询对应的method,由Spring Data根据方法名自动完成命名查询的寻找。(1)在Entity实体类上使用NamedQuery注解直接声明命名查询。EntityNamedQuery(name = User.findByEmailAddress, query = select u from User u where u.emailAddress = ?1)public class User 注:定义多个时使用下面的注解NamedQueries(value = NamedQuery(name = User.QUERY_FIND_BY_LOGIN, query = select u from User u where u. + User.PROP_LOGIN + = :username), NamedQuery(name = getUsernamePasswordToken, query = select new com.aceona.weibo.vo.TokenBO(u.username,u.password) from User u where u. + User.PROP_LOGIN + = :username)(2)在interface中定义与(1)对应的方法public interface UserRepository extends JpaRepository List findByLastname(String lastname); User findByEmailAddress(String emailAddress);3.3 使用Query自定义查询(Spring Data提供的)这种查询可以声明在Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring data的特有实现。例如:public interface UserRepository extends JpaRepository Query(select u from User u where u.emailAddress = ?1) User findByEmailAddress(String emailAddress);3.4 Query与 Modifying 执行更新操作这两个annotation一起声明,可定义个性化更新操作,例如只涉及某些字段更新时最为常用,示例如下:ModifyingQuery(update User u set u.firstname = ?1 where u.lastname = ?2)int setFixedFirstnameFor(String firstname, String lastname);3.5 索引参数与命名参数(1)索引参数如下所示,索引值从1开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致ModifyingQuery(update User u set u.firstname = ?1 where u.lastname = ?2)int setFixedFirstnameFor(String firstname, String lastname);(2)命名参数(推荐使用这种方式)可以定义好参数名,赋值时采用Param(参数名),而不用管顺序。如下所示:public interface UserRepository extends JpaRepository Query(select u from User u where u.firstname = :firstname or u.lastname = :lastname) User findByLastnameOrFirstname(Param(lastname) String lastname, Param(firstname) String firstname);4. Transactionality(事务)4.1 操作单个对象的事务Spring Data提供了默认的事务处理方式,即所有的查询均声明为只读事务,对于持久化,更新与删除对象声明为有事务。参见org.springframework.data.jpa.repository.support.SimpleJpaRepositoryorg.springframework.stereotype.RepositoryTransactional(readOnly = true)public class SimpleJpaRepository implements JpaRepository, JpaSpecificationExecutor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论