13.1 什么是Springboot spring data jpa
13.1.1 Jpa与Hibernate
-
Jpa是Java的Orm规范
-
Hibernate是Jpa的一种实现方式
-
Jpa优缺点
本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装 优点: 1.程序员操作很简单,代码简单 entityManager.persist(employee); 2.直接面向持久对象操作 3.提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate) 一级缓存,二级缓存,查询缓存(空间换速度) 4.数据库移植性很强,很少的修改(通过配置方言搞定) 把各种数据库抽取了一个方言接口 不同数据库实现一个方言接口,如果换了数据库,必须修改方言实现,驱动jar文件,连接数据库信息。 缺点: 1.不能干预sql语句的生成 entityManager.find(User.class, 1L); find方法默认查询t_user表的所有字段 自动生成select user0_.id,user0_.name,user0_.age from t_user user0_ where user0_.id=? 2.一个项目中,如果对sql语句的优化要求比较高,不适合用JPA(不过可以使用JPA对原生sql的支持来解决) 3.如果一张表中有上亿级别的数据量,也不适合用JPA,其实也不适合用jdbc(可以使用数据库读写分离,分库分表方案解决)。
13.1.2 Spring data jpa
-
是什么
是spring data对rdms的支持。 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!
-
spring data
Spring 的一个子项目。用于简化数据访问,支持NoSQL和关系数据存储。 其主要目标是使数据的访问变得方便快捷。 1)SpringData 项目所支持 NoSQL 存储: MongoDB (文档数据库) Neo4j(图形数据库) Redis(键/值存储) Hbase(列族数据库) ElasticSearch ... 2)SpringData 项目所支持的关系数据存储技术: JDBC JPA ...
13.1.3 Springboot Spring data jpa
就是使用springboot的自动配置,再一次减缓spring data jpa应用的开发,我们基本不用写配置了。
13.2 入门步骤分析
1)搭建一个springboot项目
①pom
②配置文件
③入口类
④启动测试
2)Springboot集成Spring data jpa
①pom
②配置
3)写代码测试
①domain
②Repository
Spring Data 的一个核心接口为我们提供了常用的接口
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法 :
public interface Repository<T, ID extends Serializable> { }
1. Repository是一个空接口,即是一个标记接口;
2. 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。
3. 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。
4. 查询方法以find | read | get开头;
5. 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
6.使用@Query注解可以自定义JPQL语句实现更灵活的查询。
CrudRepository 接口提供了最基本的对实体类的添删改查操作
--T save(T entity);//保存单个实体
--Iterable<T> save(Iterable<? extends T> entities);//保存集合
--T findOne(ID id);//根据id查找实体
--boolean exists(ID id);//根据id判断实体是否存在
--Iterable<T> findAll();//查询所有实体,不用或慎用!
--long count();//查询实体数量
--void delete(ID id);//根据Id删除实体
--void delete(T entity);//删除一个实体
--void delete(Iterable<? extends T> entities);//删除一个实体的集合
--void deleteAll();//删除所有实体,不用或慎用!
PagingAndSortingRepository接口
该接口提供了分页与排序功能
--Iterable<T> findAll(Sort sort); //排序
--Page<T> findAll(Pageable pageable); //分页查询(含排序功能)
JpaRepository:查找所有实体,排序、查找所有实体,执行缓存与数据库同步
③Service
④测试
13.3 Springboot spring data jpa入门实现1
13.3.1 准备一个springboot项目
略过
13.3.2 集成Spring data jpa
-
pom
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
-
配置
spring: application: name: springbootdatajpatest datasource: url: jdbc:mysql://localhost:3306/test driver-class-name: com.mysql.jdbc.Driver username: root password: 123456 jpa: database: mysql #jpa操作mysql show-sql: true #把执行sql显示出来 hibernate: naming: physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy #不用管 ddl-auto: update open-in-view: true database-platform: org.hibernate.dialect.MySQL55Dialect #使用的mysql5.5方言
13.3.3 写代码测试
-
Domain
@Entity @Table(name="t_employee") public class Employee { @Id @GeneratedValue private Long id; @Column private String name; public Employee(String name) { this.name = name; } public Employee() { } }
-
Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> { }
-
Service
public interface IEmployeeService { void add(Employee employee); void del(Long id); void update(Employee employee); Employee getById(Long id); List<Employee> getAll(); } @Service public class EmployeeServiceImpl implements IEmployeeService { @Autowired private EmployeeRepository repository; @Override public void add(Employee employee) { repository.save(employee); } @Override public void del(Long id) { repository.deleteById(id); } @Override public void update(Employee employee) { repository.save(employee); } @Override public Employee getById(Long id) { return repository.findById(id).get(); } @Override public List<Employee> getAll() { return repository.findAll(); } }
-
测试
@SpringBootTest(classes = App.class) @RunWith(SpringRunner.class) public class IEmployeeServiceTest { @Autowired private IEmployeeService employeeService; @Test public void add() { employeeService.add(new Employee("zs")); } @Test public void del() { Employee employee = employeeService. getById(1L); System.out.println(employee); employeeService.del(1L); employee = employeeService. getById(1L); System.out.println(employee); } @Test public void update() { Employee employee = employeeService. getById(1L); System.out.println(employee); employee.setName(employee.getName()+"-edit"); employeeService.update(employee); employee = employeeService. getById(1L); System.out.println(employee); } @Test public void getById() { System.out.println(employeeService.getById(1L)); } @Test public void getAll() { System.out.println(employeeService.getAll()); } }
13.4 小结
本章节讲了Springboot怎么集成Spring data jpa