Spring注解
@Resource : 其实不是Spring中的注解, 而是java中的标准注解, 是JsR-250中的一个规范, Spring对其进行了实现
@Autowired : 默认按照类型注入
spring通过一个 BeanPostProcessor 对 @Autowired 进行解析, 所以要让@Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor 的 Bean.
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
当不能确定Spring容器中一定拥有某个类的Bean时, 可以在需要自动注入该类Bean的地方可以使用
@Autowired(required = false), 这等于告诉Sping : 在找不到匹配Bean是也不报错
@Qualifier 注释指定注入的Bean (@Qualifier("...")
的标注对象是成员变量、方法入参、构造函数入参)
@Service : 用来标注在Spring来实例化Service类,也就是我们所所得IOC
@Repositiry : 用来标注在DAO类或是数据访问层的类中
@Component : 用来标注普通的JavaBean,例如POJO和Model类等,是一个泛化的概念,仅仅表示一个组件(Bean),可以作用在任何层次
@Component("personPojo" )// 把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
@Controller : 通常作用在控制层
通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring 会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring 受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。
@Transactional : 事务注解,使用该注解可以让Spring代替我们接管事务,不用每次都由程序员来提交和回滚事务
@scope
JPA 和 Hibernate 注解
一、@Entity注解
1、指出该Java 类为实体类、将映射到指定的数据库表
2、但是这样映射的数据表的名称就和类名相同
- //持久化类
- @Entity
- public class Person {
- }
二、@Table注解
1、当实体类与其映射的数据表名称不同时需要使用 @Table()来表示
2、与 @Entity标注并列使用、置于实体类声明语句之前
3、也可与声明语句同行
4、@Table标注常用的选项是name、用于指定数据库表的名称
5、@Table标注还有一个两个选项catalog 和 schema 用于设置表所属的数据库目录或模式、通常为数据库名
6、uniqueConstraints 选项用于设置约束条件、通常不须设置
- //指向的数据库的表名
- @Table(name="JPA_PERSON")
- //持久化类
- @Entity
- public class Person {
- }
三、@Id注解
1、@Id标注用于声明一个实体类的属性映射为数据库的主键
2、@Id标注置于属性的getter方法之前
- @Id //表示未主键ID
- public Integer getId() {
- return id;
- }
四、@GeneratedValue注解
1、@GeneratedValue 用于标注主键的生成策略可以通过 strategy 属性指定。
2、默认情况下、JPA自动选择一个最适合底层数据库的主键生成策略
SqlServer 对应 identity,MySQL 对应 autoincrement
1、在javax.persistence.GenerationType中定义了以下几种的策略
1-1、IDENTITY:采用数据库ID自增长的方式来自增主键字段
Oracle 不支持这种方式
1-2、AUTO:JPA自动选择合适的策略
是默认选项
1-3、SEQUENCE:通过序列产生主键、通过 @SequenceGenerator 注解指定序列名
MySql 不支持这种方式
1-4、TABLE:通过表产生主键、由表模拟序列产生主键
该策略更易于数据库移植
- //主键生成的策略GenerationType.IDENTITY(只增)
- //GenerationType.AUTO(根据数据库的情况进行选择策略)
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- @Id//表示未主键ID
- public Integer getId() {
- return id;
- }
五、@Basic注解
1、@Basic注解表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx() 方法、默认即为@Basic注解
其中有两属性
2、fetch:表示该属性的读取策略、有EAGER(抓取)和LAZY(延迟加载)默认EAGER
3、optional:表示是否允许为null、默认为true
- /**
- 如果没有@Basic注解那么数据表的字段名
- 属性名称(默认加了该注解),其实在这里加不加此注解都是可以的
- */
- @Basic(fetch=FetchType.EAGER,optional=false)
- public String getName() {
- return name;
- }
六、@Column注解
1、当实体类的属性与映射数据表的字段名不同的时候就可以使用该注解
2、该注解在在属性声明前可以和@Id注解配合使用
3、@Column注解通常使用name属性、用于设置数据表的的字段名,当然还有其他的属性unique(不能为空)、length(长度) ...等等
4、@Column注解中的columnDefinition属性、表示该字段在数据表中的类型
5、通常情况下ORM框架可以根据属性自动判断数据表中的字段类型
只有个别的人Date这种无法判断数据表字段类型
- @Column(name="E_Meli",length=50,nullable=false)
- public String getMeil() {
- return meil;
- }
七、@Temporal注解
1、在实体类映射到数据表中Date类型类型数据在数据表中默认是datetime类型的
2、要是生日只需要年-月-日数据表依然还是datetime类型的就不方面
3、那么@Temporal注解就可通过DATE(日期), TIME(时间), 和 TIMESTAMP(日期+时间) 三种精度来调整
- //年-月-日
- @Temporal(TemporalType.DATE)
- public Date getBirth() {
- return birth;
- }
- //年-月-日 时-分-秒
- @Temporal(TemporalType.TIMESTAMP)
- public Date getTimes() {
- return times;
- }
![image_1c2dmef6h120316p319n21shn14fp9.png-3.1kB](https://i-blog.csdnimg.cn/blog_migrate/922a12ea1232080d6bc14fcc1d9ca3ad.png)
八、@Transient注解
1、如果一个属性不需要在数据表中映射那么就可以使用@Transient注解、ORM框架默认其注解为@Basic
- @Transient
- public String getTransient(){
- return "getTransient";
- }