SpringBoot整合SpringData JPA :
先来了解下什么是jpa:是hibernate的抽象是他的一个子集:(jdbc--->mysql)包括映射元数据:
jPA中的API:
Persistence 类是用于获取 EntityManagerFactory 实例。该类包含一个名为 createEntityManagerFactory 的 静态方法 。createEntityManagerFactory 方法有如下两个重载版本。 带有一个参数的方法以 JPA 配置文件 persistence.xml 中的持久化单元名为参数
EntityManagerFactory 接口主要用来创建 EntityManager 实例。该接口约定了如下4个方法:
EntityManager 是完成持久化操作的核心对象。实体作为普通 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。
EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理。它可以用来管理和更新 Entity Bean, 根椐主键查找 Entity Bean, 还可以通过JPQL语句查询实体。
EntityTransaction 接口用来管理资源层实体管理器的事务操作。通过调用实体管理器的getTransaction方法 获得其实例
JPQL: JPQL语言,即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。 JPQL语言的语句可以是 select 语句、update 语句或delete语句,它们都通过 Query 接口封装执行
Query接口:
调用EntityManager的createQuery,create NamedQuery 及 createNativeQuery 方法可以获得查询对象,
语句:
查询所有实体的 JPQL 查询字串很简单,例如:
select o from Order o 或 select o from Order as o
Query query = entityManager.createQuery( "select o from Order o");
List orders = query.getResultList();
Iterator iterator = orders.iterator();
while( iterator.hasNext() ) {
// 处理Order
}
JPQL也支持包含参数的查询,例如:
select o from Orders o where o.id = :myId
select o from Orders o where o.id = :myId and o.customer = :customerName
注意:参数名前必须冠以冒号(:),执行查询前须使用Query.setParameter(name, value)方法给参数赋值。
也可以不使用参数名而使用参数的序号,例如:
select o from Order o where o.id = ?1 and o.customer = ?2
其中 ?1 代表第一个参数,?2 代表第一个参数。在执行查询之前需要使用重载方法Query.setParameter(pos, value) 提供参数值。
Query query = entityManager.createQuery( "select o from Orders o where o.id = ?1 and o.customer = ?2" );
query.setParameter( 1, 2 );
query.setParameter( 2, "John" );
List orders = query.getResultList();
group by字句
Query.getSingleResult()得到查询结果。例如:
Query query = entityManager.createQuery(
"select max(o.id) from Orders o");
Object result = query.getSingleResult();
Long max = (Long)result;
having子句:
例如,以下语句用于查询订购总数大于100的商家所售商品及数量:
select o.seller, o.goodId, sum(o.amount) from V_Orders o group by
o.seller, o.goodId having sum(o.amount) > 100
having子句与where子句一样都可以使用参数。
update语句用于执行更新主要对于单个实体类的批量更新:
update Customers c set c.status = '未偿付' where c.balance < 10000
delete语句:
JPQL中提供了内置的函数:
注解:
@Table(name="jpa_customer")//用来让实体与数据表不同命名
主键:
@Id用于映射主键的在get()之上
@GeneratedValue:用于生成主键生成策略
name="IDENTITY"采用数据库ID自增方式
name=GeneratorType.Table
@Column(name="xxx")这个属性对应的字段为xxx
(length=20,nullable=false,unique="true")
@Basic:如果没加都是这个注解,就是字段名与属性名相同
@Transient指定不需要映射到数据表中的属性
@Temporal(TemporalType.DATE)//指定属性必须是年月日还是具体到秒
@Temporal(TemporalType.TIMESTAMP)
有关jpa的会单独写篇文章介绍这里只是简单的介绍一下:
springboot整合流程:
1、引入spring-boot-starter-data-jpa
2、配置文件打印SQL语句
3、创建Entity标注JPA注解
4、创建Repository接口继承JpaRepository
5、测试方法
JPA:ORM(Object Relational Mapping);
1)、编写一个实体类(bean)和数据表进行映射,并且配置好映射关系;
package com.kayleoi.springbootjpa.entity;
import javax.persistence.*;
/**
* @Author kay三石
* @date:2019/6/29
*/
//使用JPA注解配置映射关系
@Entity //告诉JPA这是一个实体类(和数据表映射的类)
@Table(name = "tbl_user") //@Table来指定和哪个数据表对应;如果省略默认表名就是user;
public class User {
@Id //这是一个主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
private Integer id;
@Column(name = "last_name",length = 50) //这是和数据表对应的一个列
private String lastName;
@Column //省略默认列名就是属性名
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2)、编写一个Dao接口来操作实体类对应的数据表(Repository)
package com.kayleoi.springbootjpa.repository;
import com.kayleoi.springbootjpa.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @Author kay三石
* @date:2019/6/29
*/
//继承JpaRepository来完成对数据库的操作
public interface UserRepository extends JpaRepository {
}
3)、基本的配置JpaProperties。application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/jpa
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update #更新或者创建数据表结构
show-sql: true #控制台显示SQL
4.测试:
package com.kayleoi.springbootjpa.controller;
import com.kayleoi.springbootjpa.entity.User;
import com.kayleoi.springbootjpa.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author kay三石
* @date:2019/6/29
*/
@RestController
public class UserController {
@Autowired
UserRepository userRepository;
@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") Integer id){
User user = userRepository.getOne(id);
return user;
}
@GetMapping("/user")
public User insertUser(User user){
User save = userRepository.save(user);
return save;
}
}
//其他的方法
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.data.jpa.repository;
import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@NoRepositoryBean
public interface JpaRepository extends PagingAndSortingRepository, QueryByExampleExecutor {
List findAll();
List findAll(Sort var1);
List findAllById(Iterable var1);
List saveAll(Iterable var1);
void flush();
S saveAndFlush(S var1);
void deleteInBatch(Iterable var1);
void deleteAllInBatch();
T getOne(ID var1);
List findAll(Example var1);
List findAll(Example var1, Sort var2);
}
pom.xml:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
com.kayleoi
spring-boot-data-jpa
0.0.1-SNAPSHOT
spring-boot-jpa
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
到这里jpa的整合也就结束了,这里这是个demo而已。如果达到孰能生巧的结果还是必须在项目中的最终的体现,等具体的项目中遇到了我会把所有使用jpa的操作再详细的讲解,毕竟有时实战和demo还是不太一样的。