springdata

1.springdata:
  是spring的一个子项目,用于简化数据库访问,支持NoSQL和关系数据库存储,使数据库访问变得更加快捷.

  是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套 JPA 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。

  源码分析:通过反射对象上的注解属性来动态生成sql语句,然后还是基于jdbc来执行sql.

2.springdata对NoSQL存储:
  1)MongoDB(文档数据库)
  2)Neo4j(图形数据库)
  3)Redis(键/值存储)
  4)Hbase(列族数据库)

3.对JPA出现的前景概述:
  在持久化存储中,数据访问对象(常说为dao(Data Access Objects)层通过都需要提供对单一域对象的CRUD操作,查询,排序和分页等方法,
而SpringDataJPA则提供了这一层面的统一接口,以及对持久化存储的基本方法的自动实现。

4.jpa和springdataJPA的概述:
首先JPA(JAVA Persistence API)是当年的SUN官方提出的java持久化规范.它为JAVA开发人员提供了一种对象/关联映射工具来管理java应用中的关系数据
其次Spring Data JPA是spring基于ORM框架,JPA规范的基础上封装的一套JPA应用框架,它能使开发人员用极简的代码实现对数据的访问和操作.

5.springdataJPA的常用API接口:
  1)Repository接口为顶级接口,其中没有提供任何的抽象方法
  2)CurdRepository接口,提供了基本的增删改查(CURD)方法
  3)PagingAndSortingRepository接口,提供了对分页和排序支持
  4)QueryByExampleExecutor接口,提供了QBE(Query By Example:通过例子查询,即实例查询语言)查询方式
  5)JpaRepository接口,继承了以上的接口,并重写了方法,也可在里面定义自己的方法
注意:自定义一个接口,继承以上任意一个接口,即可获得对应javabean的接口实现类,默认提供了增删改查方法.

6.环境配置
1)pom.xml:
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
2)application.properties:
#显示sql
spring.jpa.show-sql = true
#日志打印等级
logging.level.org.springframework.data=DEBUG
#根据javaBean自动建表.
spring.jpa.hibernate.ddl-auto=update

7.具体操作步聚:
1)先建表:
2)然后在javabean中加注解
@Entity
public class User implements Serializable {
  private static final long serialVersionUID = 1L;
  @Id
  private Long id;
  @Column(name = "name")
  private String name;
  @Column(name = "address")
  String address;
  //get/set/tostring/有参无参构造器
}

3)自定义接口:
public interface IMyUserDao extends CrudRepository<User, Long>{

}
//就是这样的空方法体就可以了。
4)通过spring和springdatajpa的结合,jdk自动代理出接口的实现类,且自动注入进来
@Autowired
private IMyUserDao userDao;

@Test
public void contextLoads() {
  User user = new User();
  user.setAddress("南12昌");
  user.setName("23小明");
  user.setId(12L);
  System.out.println("userDao:"+userDao.save(user));
  //userDao.delete(user);
}


spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

8.关于JpaRepository自定义接口的使用
  1)自定义接口,在里面增加自己的方法
  //?1为占位符,参数自动代入,
  public interface UserRepository extends JpaRepository<User,Long> {
    @Query("select u from #{#entityName} u where u.lastname = ?1")
    List<User> findByLastname(String lastname);
  }
  2)测试使用:
  @Autowired
  private IMyUserDao userDao;
  @Test
  public void test_findByAge() throws Exception {
    List<User> list = userDao.findByAge(20);
    list.stream().forEach(System.out::println);
  }
  3)给自定义接口添加方法注意点:
    1)自定义方法名如果满足规则时,springDataJpa会自动帮你实现
    2)自己随意申明方法,则需自己提供sql语句/HQL语句
      1)sql:操作表
      2)HQL:操作javaBean对象.

9.关于springdataJPA注解的说明:

注: @Entity 实体注解 写在类名上,表示这是一个jpa实体,会自动对应数据的表
@Id 主键注解,写在属性上,表示这是属性为表中的主键列
@Column 列注解,写在属性上,表示这个属性对应数据库中的什么列
@Table(name="t_user") public class User{} 表示这个User是一个jpa的实体,对应数据库的表为t_user

10)JPA的实体关系
1)单向关联:
public class User{
  private Integer id;
  private String name;
}
public class Car{
  private Integer id;
  private User user;
}
2)双向关联:
public class User{
  private Integer id;
  private String name;
  private Car car;
}
public class Car{
  private Integer id;
  private User user;
}

11.对JPA的补充:
  1)按照规则自定义方法:参考文档:https://docs.spring.io/spring-data/jpa/docs/2.1.x/reference/html/#jpa.querymethods.query-creati
    直接在文档中搜 : Supported keywords inside method names
    比如:
      eg:获取gender = 男的前10个用户
      User findFirst10ByGender(String gender)
  2)随意申明方法:(如果没有事务支持注解,不能执行更新和删除操作)
    声明的方法上需要添加 @Query注解,里面可以是sql实现,或者HQL实现
    如涉及到删除和修改在需要加上 @Modifying注解
    如需事务支持需要加上 @Transactional 注解
  3)HQL语句:
    面向javaBean的查询语句,
      在HQL中所有出现的都是类/类中的属性
      HQL:select u.name from User u
      查询User对象中的name属性
        eg:通过id删除User实体对应表的数据
  @Transactional
  @Modifying
  @Query("delete from User u where u.id= ?1")
  int deleteByUserId(Long id);
    User : 为当前项目中的javaBean
    u.id : 为项目中javaBean的某个属性
    ?1 : 从方法中取第一个参数值设置到该位置。
12)JPA对hibernate的支持
1)在springboot配置文件中设置Hibernate的方言:
  spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
2)
数据库 方言
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect

posted @ 2020-03-22 18:01  whhhd  阅读(742)  评论(0编辑  收藏  举报