一.JPA
特點:JPA可以根據方法名自動匹配sql語句.
JPA是一個標准
Hibernate是JPA的一個實現,宗旨是盡量少寫sql語句.
使用JPA
1.application.properties配置:
在springBoot工程下的application.properties配置文件中的相關配置:
#配置數據庫鏈接 spring.datasource.url=jdbc:mysql://數據庫信息?useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=test spring.datasource.password=****** #配置數據庫初始化的模式,會自動讀取resources文件下面的data.sql文件(自定義)進行執行 #還會讀取schema.sql文件 #schema.sql一般會寫建表語句 #data.sql里面會寫數據庫插入的語句 spring.datasource.initialization-mode=always #關於JPA的配置 #執行sql語句的時候,是否在控制台打印 spring.jpa.show-sql=true #none 關閉根據實體類創建表的功能 #create 如果表不存在,則根據實體類的配置創建表 #update 如果實體類的配置更改了,與表對應不上,那么會更新表的結構 #create-drop 工程啟動的時候先刪除表在創建表。 spring.jpa.hibernate.ddl-auto=none
2.創建實體類
JPA會根據配置的實體類自動創建相應的表.
package com.example.demo.entity;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity
//上面這兩個注解是lombok里面的
//使用JPA需要配置實體類與表的對應關系
@Table(name = "dep") //配置實體類對應的表的名字是什么
public class Dep {
//主鍵列需要配置ID注解
@Id
//配置注解自增長的方式
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long uuid;
//name : 自定義表名
//unique : 是否唯一
//nullable : 是否為空.
@Column(name = "dep_name" ,unique = true,nullable = false)
private String name;
//默認情況下。實體類的駝峰式的屬性會自動映射到列的下划線形式
private String depTele;
//建立表的之間的關聯.
//OneToOne :一對一
//OneToMany :一對多
//ManyToMany : 多對對
@ManyToMany(fetch = FetchType.EAGER)
//創建外鍵
@JoinTable(name = "role_menu",joinColumns = @JoinColumn(name = "role_id"),
inverseJoinColumns = @JoinColumn(name = "menu_id"))
private Set<MenuEntity> menus;
}
3.創建接口
創建一個接口,繼承於JpaRepository<class,Long>
該接口有很多對數據庫操作的方法,不需要實現,用的時候只需要利用多態調用父接口的方法就能對數據庫進行操作.
比如:findById()方法,根據id查詢所有.
1.這里面也可以自定義一些方法,不過方法名要符合規則.
2.可以利用@Query注解為自定義的方法配置自己的sql語句.
3.可以定義一個方法,由實現類來重寫方法,在實現類里面重寫更復雜的sql
package com.example.demo.repository;
import com.example.demo.entity.Dep;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface DepRepository extends JpaRepository<Dep,Long> {
//JPA可以根據方法名自動生成SQL語句
List<Dep> findAllByNameContaining(String name);
//為方法配置自定義的sql
@Query(value = "select * from dep where name like concat('%', :name,'%')",nativeQuery = true)
List<Dep> findByname(@Param("name") String name);
//定義一個方法,有實現類來重寫該方法,重寫sql語句,
List<Dep> findAllTest();
}
接口的實現類.
不需要在類上寫implements實現上面的接口,JPA會根據類名的命名規則自動匹配實現類.
注入一個EntityManager對象,該對象會根據sql語句和實體類對數據操作.
//JPA會根據類名的規則,自動將該類的作為對應接口的實現類
@Repository
public class DepRepositoryImpl {
@Resource
private EntityManager entityManager;
public List<Dep> findAllTest(){
String sql = "select * from dep";
Query query = this.entityManager.createNativeQuery(sql, Dep.class);
List list = query.getResultList();
return list;
}
}
4.直接在Service層調用接口方法對數據庫進行操作.
//注入接口對象
@Resource
private DepRepository depRepository;
Optional<Dep> optional = this.depRepository.findById(uuid);
//獲取到的optional是一個代理對象
//這個代理對象是與數據庫綁定的
//當改變這個代理對象的屬性的值時,會自動改變數據庫中的值
if (optional.isPresent()){
//把代理對象轉為實體類對象
Dep dep = optional.get();
return dep;
}
二.lombok
lombok主要是對創建的實體類的一些簡化,
一些常用的lombok注解:
@Data : 給實體類配置get和set,tostring方法
@AllgrgsConstructor ;配置一個全參的構造方法
@NoArgsConstrutor : 添加一個空的構造方法
@Builder :創建建造者模式來創建對象.
@Getter : 創建get方式
@Setter ; 創建set方法
@Slf4j :創建日志對象.
package com.example.demo.entity;
import lombok.*;
@Data //真加getter&setter,toString,equals,hashcode
//@Getter //只真加getter方法 其他同理
@AllArgsConstructor //添加一個全參數的構造方法
@NoArgsConstructor //添加一個無參數的構造方法
@Builder //真加一個建造者模式來創建對象
public class Emp {
private Long uuid;
private String name;
private String email;
private String tele;
}
