SpringBoot常用注解汇总

SpringBoot

controller层

1、@Controller
	@Controller 用来响应页面,表示当前的类为控制器。

2、@RestController
	@RestController 是@ResponseBody和@Controller的结合
	表明当前类是控制器且返回的是一组数据,不是页面
  @ResponseBody
      表示该方法的返回结果直接写入HTTP response body中
      一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析
      为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。

3、@Autowired
	这个注解的作用是将其他的类,接口引入,类似于之前的类的初始化等,用这个注解,类中或接口的方法就可以直接调用了。

4、@RequestMapping
	当前台界面调用Controller处理数据时候告诉控制器怎么操作
	作用:URL映射。
      RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
    该注解有六个属性:
          params:指定request中必须包含某些参数值是,才让该方法处理。
          headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
          value:指定请求的实际地址,指定的地址可以是URI Template 模式
          method:指定请求的method类型, GET、POST、PUT、DELETE等
          consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html;
          produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

5、@GetMapping
	@RequestMapping(method = RequestMethod.GET)的简写
	作用:对应查询,表明是一个查询URL映射

6、@PostMapping
	@RequestMapping(method = RequestMethod.POST)的简写
	作用:对应增加,表明是一个增加URL映射

7、@PutMapping
	@RequestMapping(method = RequestMethod.PUT)的简写
	作用:对应更新,表明是一个更新URL映射

8、@DeleteMapping
	@RequestMapping(method = RequestMethod.DELETE)的简写
	
9、@RequestBody和@RequestParam
  两个注解都是用于方法中接收参数使用的,两者也有一定的区别。
  @RequestBody这个一般处理的是在ajax请求中声明contentType: “application/json; charset=utf-8”时候。也就是json数据或者xml(我没用过这个,用的是json)
  @RequestParam这个一般就是在ajax里面没有声明contentType的时候,为默认的。。。urlencode格式时,用这个。
  @RequestBody可以直接将页面中的参数封装成实体类中的数据传输给后天

service层

1.@service
		用于标注业务层组件
2.@Component
		泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

dao层

1.@Repository
		是用来注解接口,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常

实体类注解

@Entity实体类注解
@Table(name ="数据库表名"),这个注解也注释在实体类上,对应数据库中相应的表。
@Id、@Column注解用于标注实体类中的字段,pk字段标注为@Id,其余@Column。

SpringJPA主键生成策略
  数据库使用Oracle,常用的就是UUID和整形自增。
  UUID能达到全局唯一,而且不受数据库限制,比如Oracle的自增就要用序列来做。但是存储控件需求会更多,另外性能上不及整形。
  整形自增MySQL中只要设置一个整形列即可,Oracle中需要建立一个SEQUENCE。

public enum GenerationType {
      TABLE,
      SEQUENCE,
      IDENTITY,
      AUTO;
      
      private GenerationType() {
     }
}
GenerationType源码
从源码中可以看出JPA提供的四种标准主键策略TABLE,SEQUENCE,IDENTITY,AUTO

TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。
IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
AUTO:主键由程序控制,也是GenerationType的默认值。

不写GeneratedValue注解时即为GenerationType.AUTO 这时主键生成是根据数据库hibernate_sequence里的next_val来生成但我想用自已规则来生成自己的ID查了半天的资料终于解决这个问题。


建议oracle可采用UUID,需求场景需要也可使用整型自增
mysql采用整形,业务中可便于排序,把握先后
UUID:
@Id
@GeneratedValue(generator = "faceset_generator")
@GenericGenerator(name = "faceset_generator", strategy = "uuid")

主键自增为1,并且在MySQL时,不用序列,直接指定GenerationType.IDENTITY即可。
mysql整型自增:
@Id
@GenericGenerator(strategy = "GenerationType.IDENTITY")

SpringDataJpa-主键生成策略详解:参考文章最后:SpringDataJpa-主键生成策略

配置

1.@Configuration,@Bean
		可理解为用spring的时候xml里面的<beans>标签,用@Configuration注解该类,等价 与XML中配置beans
		@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名
		例如:
		@Configuration    
		public class ExampleConfiguration {    
        @Value("com.mysql.jdbc.Driver")    
        private String driverClassName;    

        @Value("jdbc://xxxx.xx.xxx/xx")    
        private String driverUrl;    

        @Value("${root}")    
        private String driverUsername;    

        @Value("123456")    
        private String driverPassword;    

        @Bean(name = "dataSource")    
        public DataSource dataSource() {    
            BasicDataSource dataSource = new BasicDataSource();    
            dataSource.setDriverClassName(driverClassName);    
            dataSource.setUrl(driverUrl);    
            dataSource.setUsername(driverUsername);    
            dataSource.setPassword(driverPassword);    
            return dataSource;    
        }    

        @Bean    
        public PlatformTransactionManager transactionManager() {    
            return new DataSourceTransactionManager(dataSource());    
        }    
	    
	}  
	
注:在项目中
@Autowired
private DataSource dataSource;
的时候,这个dataSource就是我们在ExampleConfiguration中配的DataSource。

事务注解

在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式

  编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
  声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务,通过@Transactional就可以进行事务操作,更快捷而且简单。推荐使用

启动类

@SpringBootApplication:
  启动注解,@SpringBootApplication是一个复合注解,包括@ComponentScan,	和@SpringBootConfiguration,@EnableAutoConfiguration
    @SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
    @EnableAutoConfiguration的作用启动自动的配置,@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置。在下面博客会具体分析这个注解,快速入门的demo实际没有用到该注解。
    @ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。

@ServletComponentScan:
	在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

@MapperScan("com.Vm.server") :
	@MapperScan注解只会扫描包中的接口,不会扫描类,扫描指定包中的接口

@EnableScheduling: 
	spring自带的定时服务
	public class ScheduledTasks {
   @Scheduled(fixedRate = 1000 * 30) //每30秒执行一次
    public void reportCurrentTime(){
    System.out.println ("Scheduling Tasks Examples: The time is now " + dateFormat 			().format (new Date ()));
	  }
}

Mybatis

//Mapper中的namespace用于绑定Dao接口的,即面向接口编程。
//namespace:一般是dao接口所在的路径+接口名称

<mapper namespace="com.VmService.dao.IBlackDao">


//resultMap属性:type为java实体类;id为此resultMap的标识。
//id和result标签是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。

<resultMap id="BlackBean" type="com.VmService.model.BlackBean">
    <id column="ID" property="id"/>
    <id column="IM" property="im"/>
</resultMap>

//进行SQL语句查找
<select id="selectAllBlackList" resultMap="BlackBean">
    SELECT
		id as id,
		im as im,
	FROM
		t_blacklist t1 
	ORDER BY
		id DESC
</select>

SpringDataJpa-主键生成策略

一、SpringDataJpa标准用法

spring data jpa 的标准主键生成策略主要有四种,分别是:

public enum GenerationType {
    TABLE, //使用一个额外的数据库表来保存主键
    SEQUENCE,//使用序列的方式,且其底层数据库要支持序列,一般有postgres、Oracle等
    IDENTITY,//主键由数据库生成,一般为自增型主键,支持的有MySql和Sql Server
    AUTO//由程序来决定主键规则
}

主键的生成规则主要由注解 @GeneratedValue 来说明,其源码如下:

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue {
    GenerationType strategy() default AUTO;
    String generator() default "";
}
@Id  
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")  
@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")  

使用的具体例子为:
假设有一个表示人脸图片集合的类为FaceSet,其主键为facesetToken,则表示如下

@Entity(name = "face_set")
public class FaceSet{
}
  • Sequence
    @SequenceGenerator 中的 sequenceName 为序列的名称,需要与@GeneratedValue 中的generator对应
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="faceset_generator")
  @SequenceGenerator(name="faceset_generator", sequenceName="faceset_seq")
  @Column(name = "faceset_token", unique = true)
  private String facesetToken;
  • Auto
    如果不指定具体的生成规则,则默认为AUTO,即下列两种情况等价
@Id  
@GeneratedValue(strategy = GenerationType.AUTO) 
private String facesetToken;
@Id  
private String facesetToken;

二、Hibernate主键策略生成

hibernate-5.0.12.Final版本的默认工厂中有14种生成策略,具体可见org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory

    public DefaultIdentifierGeneratorFactory() {
        register( "uuid2", UUIDGenerator.class );
        register( "guid", GUIDGenerator.class );            // can be done with UUIDGenerator + strategy
        register( "uuid", UUIDHexGenerator.class );         // "deprecated" for new use
        register( "uuid.hex", UUIDHexGenerator.class );     // uuid.hex is deprecated
        register( "assigned", Assigned.class );
        register( "identity", IdentityGenerator.class );
        register( "select", SelectGenerator.class );
        register( "sequence", SequenceStyleGenerator.class );
        register( "seqhilo", SequenceHiLoGenerator.class );
        register( "increment", IncrementGenerator.class );
        register( "foreign", ForeignGenerator.class );
        register( "sequence-identity", SequenceIdentityGenerator.class );
        register( "enhanced-sequence", SequenceStyleGenerator.class );
        register( "enhanced-table", TableGenerator.class );
    }

    public void register(String strategy, Class generatorClass) {
        LOG.debugf( "Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName() );
        final Class previous = generatorStrategyToClassNameMap.put( strategy, generatorClass );
        if ( previous != null ) {
            LOG.debugf( "    - overriding [%s]", previous.getName() );
        }
    }

对几种比较常用的类型进行说明:

  • uuid
    采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。
    当使用strategy为uuid时,使用的时hibernate自己定义的UUID生成算法,此策略已过时,其具体实现参照org.hibernate.id. UUIDHexGenerator, 生成的字符串如402880876359adeb016359ae27190000
    当使用strategy为uuid2时,此为此版本推荐使用的uuid生成算法,其默认采用标准的生成策略StandardRandomStrategy,实现为使用jdk自带的uuid生成方法,生成的字符串如
    4af17c8e-8317-43e9-aff9-12d5590a71c6
@Id
@GeneratedValue(generator = "faceset_generator")
@GenericGenerator(name = "faceset_generator", strategy = "uuid")
  • assigned
    插入主键时,由程序来指定。相当于JPA中的AUTO。
@Id
@GeneratedValue(generator = "faceset_generator")
@GenericGenerator(name = "faceset_generator", strategy = "assigned")
  • sequence
@Id
@GeneratedValue(generator = "faceset_generator")  
@GenericGenerator(name = "faceset_generator", strategy = "sequence",   
         parameters = { @Parameter(name = "sequence", value = "faceset_seq") }) 
  • guid
    采用数据库底层的guid算法机制,对应MYSQL的uuid()函数,SQL Server的newid()函数,ORACLE的rawtohex(sys_guid())函数等

三、通过@GenericGenerator自定义主键生成策略

常用数据库支持生成规则如下:

数据库 支持的策略
Postgres GenerationType.TABLE GenerationType.AUTO GenerationType.IDENTITY GenerationType.SEQUENCE
Oracle GenerationType.TABLE GenerationType.AUTO GenerationType.SEQUENCE 不支持GenerationType.IDENTITY
Mysql GenerationType.TABLE GenerationType.AUTO GenerationType.IDENTITY 不支持GenerationType.SEQUENCE
原文地址:https://www.cnblogs.com/linuxtop/p/12627957.html