目录
- SpringBoot
- controller层
- service层
- dao层
- 实体类注解
- 配置
- 事务注解
- 启动类
- Mybatis
- SpringDataJpa-主键生成策略
- 一、SpringDataJpa标准用法
- 二、Hibernate主键策略生成
- 三、通过@GenericGenerator自定义主键生成策略
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 |