@RestController
/*@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,
但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面*/
@GetMapping("/{id}")
//GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
//可以在@RequestMapping注解中用{}来表明它的变量部分
//在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,
// 并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们,还可以有多个,用不同的{}来取值就好.
@RequestMapping("/user")//有没有这个'/'都无所谓的
@MapperScan("com.gaolei.user.mapper")
/*之前是,直接在Mapper类上面添加注解@Mapper,这种方式要求每一个mapper类都需要添加此注解,麻烦。通过使用@MapperScan可以指定要扫描的Mapper类的包的路径*/
@Table(name = "tb_user")
//声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe),
// name 用来命名 当前实体类 对应的数据库 表的名字
@Data//免去写getter以及setter,以及tostring,equals等方法,非常实用,但是要安装lombok插件
@Id//主键字段
@GeneratedValue(strategy = GenerationType.IDENTITY)//主键自动生成策略
type-aliases-package 别名扫描包
@Bean
/*Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。
产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
默认bean的名称就是其方法名。*/
User user=restTemplate.getForObject(url,User.class);
//发送GET请求,将HTTP response转换成一个指定的object对象
/*
* 参数1: String类型 或 URI类型的请求地址
* 参数2: 指定返回的实体类型,class对象
* 参数3: uri参数,可以是变长数组或map
* 返回值:responseType指定的Object类型
*/
@EnableDiscoveryClient//能够让注册中心能够发现,扫描到该服务,支持多种微服务注册中心
@SpringCloudApplication//此注解是springcloud标准服务注解,一个顶多个用,写着一个,启动器就不用写其他的注解了
@HystrixCommand(fallbackMethod = "queryByIdFallback")//开启熔断处理和线程降级,有错就调用括号里面的方法,错误处理的方法,参数和返回值必须和注解的方法一致
@DefaultProperties(defaultFallback = "queryByIdFallback")//默认属性,所有方法熔断都会调用括号里面的方法,加在类上面,方法上依旧要加HystrixCommand注解,只是不用写括号里面的方法名了,通用的错误处理方法,不能有参数.
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")//设置为2秒钟熔断
})//开启熔断处理和线程降级,有错就调用括号里面的方法
@Component//把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
spa是单页面应用.webpack是前端打包工具.
</dependencyManagement>这个标签只会绑定版本,并不会真正的导入<dependencies>才会真正导入,这个一定要记住
@RequestMapping如果没有指定请求方式,将接收Get,Post,Head,Options等所有的请求方式
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。
注解了@Controller的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
@ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上
@ExceptionHandler:用于全局处理控制器里的异常。
一个枚举类举例:
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ExceptionEnums {
PRICE_CANNOT_BE_NULL(400,"价格不能为空");
private int code;
private String msg;
}
@RequestParam
GET和POST请求传的参数会自动转换赋值到@RequestParam 所注解的变量上
ResponseEntity<>这是一个范型类,里面可以传递任意参数,它用来返回rest风格的请求.想返回啥类型都用它来包装一下.返回值的话如下所示:
return ResponseEntity.status(HttpStatus.OK).body(真正的类型);
当然可以简写,return ResponseEntity.ok(类型);//这是返回成功,其他还是按照上面的方法写.
//通用Mapper的select方法,里面传一个对象参数.将对象里的非空字段作为查询的对象参数.
用springboot+springcloud+通用Mapper,所有的单表Mapper操作,不需要写mapper的配置文件,只需要写一个mapper接口即可.
构造函数的声明不可以带范型
/**
* 新增品牌
* @param brand
* @param cids
* @return
*/
@PostMapping
//这里直接写brand是因为springmvc会直接把前端传来的数据和brand对象的参数对应,而cids则需要填充,因为没有对应的,当然
//和前端参数名字一样的话也可以省略掉@RequestParam注解.总之springmvc的参数封装很智能
public ResponseEntity<Void> saveBrand(Brand brand, @RequestParam("cids")List<Long> cids){
brandService.saveBrand(brand,cids);
return ResponseEntity.status(HttpStatus.CREATED).build();//没返回值直接build就好
}
//在mybatis的mapper里,有一种用注解写SQL语句的方式,直接在方法上面添加注解,@Insert或者其他的注解,里面写SQL语句即可.然后方法的参数用@Param来注解,这样在SQL语句里就可以取到参数了.举个例子(一条插入语句):
public interface BrandMapper extends Mapper<Brand> {
@Insert("INSERT INTO tb_category_brand (category_id, brand_id) VALUES (#{cid},#{bid}) ")
int insertCategoryBrand(@Param("cid") Long cid,@Param("bid") Long bid);
}
@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@Column(name = "`numeric`")//这个注解是给通用mapper看的,告诉通用mapper,在生成查询语句的时候,不要使用变量的名字,而使用括号里的名字.
关于@PathVariable和@RequestParam的区别如下:
地址① http://localhost:8989/SSSP/emps?pageNo=2
地址② http://localhost:8989/SSSP/emp/7
如果想获取地址①中的 pageNo的值 ‘2’ ,则使用 ?@RequestParam ,
如果想获取地址②中的 emp/7 中的 ‘7 ’ ? 则使用?@PathVariable
@KeySql//Java 方式生成主键,可以和发号器一类的服务配合使用
@Transient是希望该属性不会在数据表中产生字段,但又可以在程序中使用它。于是,我们决定这么写。
/*
我总结的查询数据库数据(单表)的大致方法就是,首先有分页用分页助手加分页,没分页,下一步,加过滤条件,用反射创一个pojo的example
类,然后example创建过滤条件criteria,往criteria里加过滤条件,之后mapper调用selectByExample方法,把example对象传进去.
会得到一个pojo的list,整个过程结束.
*/
关于@RequestBody:
1、@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。
2、通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。
例如说以下情况:
$.ajax({
url:"/login",
type:"POST",
data:'{"userName":"admin","pwd","admin123"}',
content-type:"application/json charset=utf-8",
success:function(data){
alert("request success ! ");
}
});
@requestMapping("/login")
public void login(@requestBody String userName,@requestBody String pwd){
System.out.println(userName+" :"+pwd);
}
这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,但是呢假如我有一个User类,拥有如下字段:
String userName;
String pwd;
那么上述参数可以改为以下形式:@requestBody User user 这种形式会将JSON字符串中的值赋予user中对应的属性上
需要注意的是,JSON字符串中的key必须对应user中的属性名,否则是请求不过去的。
默认是使用getmapping的,postmapping要发送表单才可以.然后用requestmapping好像通用.
关于前端传到后端的参数封装问题,很简单.就是你只要后端的那个类有这个属性,那么就可以自动封装到这个类的属性上,不一定要所有的属性都全才行,有就可以.很方便,只要能够转换成功,格式正确,就完全没有问题.
@RunWith注解的作用:在使用所有注释前必须使用@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境 [Spring框架]在org.springframework.test.annotation 包中提供
Feign是Netflix开发的声明式、模板化的HTTP客户端,?Feign可以帮助我们更快捷、优雅地调用HTTP?API。
在Spring?Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring?Cloud对Feign进行了增强,使Feign支持了Spring?MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
Spring Cloud Feign是基于Netflix feign实现,整合了Spring?Cloud?Ribbon和Spring?Cloud?Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
Spring?Cloud?Feign帮助我们定义和实现依赖服务接口的定义。在Spring?Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring?Cloud?Ribbon时自行封装服务调用客户端的开发量。
Spring?Cloud?Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring?MVC的注解。
feign可以实现微服务之间的远程调用.利用feign,微服务1就可以调用微服务2.很方便
Sku是小分类,Spu是大分类.
RabbitMQ的默认账号和密码都是guest,自己新增的是账号密码leyou
十次方虚拟机的账号是root,密码是itcast. MySQL的账号和密码都是root. IP地址是 192.168.179.132
@Configuration 的注解类表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源。@Bean 注解告诉 Spring,一个带有 @Bean 的注解方法将返回一个对象,该对象应该被注册为在 Spring 应用程序上下文中的 bean。
controller必须要跟启动类在一个包里面,要不然扫描不到的.
@Entity 表明该类 (UserEntity) 为一个实体类,它默认对应数据库中的表名是user_entity。这里也可以写成
@Entity(name = "xwj_user")
或者
@Entity
@Table(name = "xwj_user", schema = "test")
查看@Entity注解,发现其只有一个属性name,表示其所对应的数据库中的表名
@Table 当实体类与其映射的数据库表名不同名时需要使用 @Table注解说明,该标注与 @Entity 注解并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。
@Table注解的常用选项是 name,用于指明数据库的表名
@Table注解还有两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名
如果缺省@Table注解,则class字段名即表中的字段名,所以需要@Column注解来改变class中字段名与db中表的字段名的映射规则
@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下:
1)name:映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入;
2)unique:是否唯一;
3)nullable:是否允许为空;
4)length:对于字符型列,length属性指定列的最大字符长度;
5)insertable:是否允许插入;
6)updatetable:是否允许更新;
7)columnDefinition:定义建表时创建此列的DDL;
8)secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字
如果是主键id,还会用到@Id注解
@Id注释指定表的主键,它可以有多种生成方式:
1)TABLE:容器指定用底层的数据表确保唯一;
2)SEQUENCE:使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID);
3)IDENTITY:使用数据库的IDENTITY列莱保证唯一;
4)AUTO:由容器挑选一个合适的方式来保证唯一;
5)NONE:容器不负责主键的生成,由程序来完成。
如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller。
@Transactional
在出现异常的情况下,保证数据的一致性;数据提交操作回滚至异常发生前的状态
IDEA打开rundashboard的方法:找到.idea文件夹,找不到就是隐藏了,
打开workspace.xml文件之后,找到component为RunDashboard的节点处,然后在component标签里添加
<option name="configurationTypes">
<set>
<option value="SpringBootApplicationConfigurationType" />
</set>
</option>
swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目实现了springMVC框架的无缝集成功能,方便生成restful风格的接口文档,
同时,swagger-ui还可以测试spring restful风格的接口功能
@EnableScheduling开启定时任务
slf4j只是一套标准,通俗来讲,就是定义了一系列接口,它并不提供任何的具体实现。所以,我们使用这套接口进行开发,可以任意的切换底层的实现框架。
比如,一开始项目用的是log4j的实现,后来发现log4j的性能太差了,想换成logback,由于我们代码中都是面向slf4j接口的,这样我们只要吧log4j的依赖换成logback就可以了。
@Autowired注解会让spring自动帮你生成,你就不用new了,不然要自己new一个,而且spring可以保证我们用的都是同一个.而且也不用写这个变量的set和get
对于XPATH的@来说,不加中括号就是选取属性的值,加中括号就是选取有该属性的标签
SpringData JPA 在保存和删除前都会自动进行判断的,不用管存在不存在.
PagingAndSortingRepository 可以进行分页和排序
使用springdatajpa的@Query查询的时候要注意,select后面加的不是表名,而是对象名
JPQL语法:省略掉 select *
直接从from开始写起,而且,不要写表名,要写对应的实体类名.
jpql 不可以写select * 可以写其他的select count 等等..
只需要编写dao层接口,不需要写接口的实现类.
普通crud,继承JpaRepository即可.
复杂的查询,比如分页之类的,继承JpaSpecificationExecutor即可
默认的findONE方法可以根据ID查询一个,立即加载,而getone则是延迟加载.
save操作也能进行更新,只要保证你传进去的对象有ID就好,他会自动给你更新.但是会把其他的置为null,所以慎用~~
对于多个占位符参数赋值(也就是 ? )的时候,默认情况下,占位符的位置需要和方法参数中的位置保持一致.
可以这么写 ?2 取方法参数里的第二个参数.
进行数据库更新的时候,一个是要加上@Transictional注解(增删改都要加这个),,还要加上一个@Rollback(value = "false") 禁止回滚.
你要是想写sql语句,你就在查询语句后面加一个 nativequery = true, 这样就可以直接写sql语句了.
dao要继承JpaSpecificationExecutor开可以, 以上是一个使用specification的详细步骤,首先写一个匿名内部类,从root里面获取要查询的属性,在cb里构造查询.多个条件拼接的话可以用and, 用or.最后把匿名内部类传入到dao里的方法即可.
同时还需要注意 equals和其他方法有点不同:
排序的话,这样使用:
关于分页:
更多的关于springdatajpa的消息请看视频或者疯狂springboot2那本书.
配置一对多关系:
多对一类似.
级联删除,在主表上配置:
关于多对多:
多对多中,被动的一方放弃维护权
写一个这个就行了.
级联添加:(也就是另一个表的内容,他会自动帮你添加)
在springboot中使用logback点我总结就是1.添加依赖2.在资源文件夹新建一个logback.xml,写上相应的配置.3.在需要添加日志的地方.添加日志.
就是在test模块,写一个类,比如这样
@RunWith(SpringRunner.class)//这两个注解是重点
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test//还有这个注解
public void addUser() throws Exception {
Assert.assertEquals(Integer.valueOf(1),userService.addUser("zhihao.miao"));
Assert.assertEquals(Integer.valueOf(0),userService.addUser(null));
}
}
1. 在pom.xml文件中添加
出现build success即为打包完成
此时在此文件夹下运行:java -jar demo-0.0.1-SNAPSHOT.jar命令完成项目部署
1.乐优商城,.项目介绍和面试建议在最后一个视频.
前台页面的打开方法:
live-server --port=9002
在controller前加一个@CrossOrigin
这样整个Controller下的所有方法都支持跨域访问。
创建一个自定义类继承WebSecurity-ConfigurerAdapter,并在该类中使用@EnableWebSecurity注解,就可以通过重写config方法来配置所需要的安全配置。
原文:https://www.cnblogs.com/shiguangqingqingchui/p/11922743.html