一 JPA配置和簡單使用


1.引入pom依賴

<!--springboot-JPA-->
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql連接-->
<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
</dependency>

2.配置數據源

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/joe?serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true

2.1 driver-class-name(驅動類)
根據mysql版本不同不一樣,有的是com.mysql.cj.jdbc.Driver,有的是com.mysql.jdbc.Driver,不會報錯,但是會有提示信息。
提示:Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver'.
2.2 time zone 異常
異常:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
解決:在datasource-url后拼接參數 serverTimezone=UTC

3.生成數據庫表實體類domain

@Data
@Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;

    @Column(name = "user_name")
    private String userName;

    private Long age;

    private String gender;

    private String address;
}

3.1 實體類建議用工具生成,因為jpa要求實體類中的字段都必須在數據庫中找到對應列,即類屬性只能比表字段少不能多,否則會報異常:
org.springframework.dao.InvalidDataAccessResourceUsageException

如何生成 IDEA自動生成JPA實體

3.2 數據庫所有的表必須要有主鍵,jpa要求所有的表都必須有主鍵列,實體類必須有@Id標注,可以是聯合主鍵,但是不能沒有,沒有的話會報異常:
org.hibernate.AnnotationException: No identifier specified for entity: com.joe.jpa.domain.User
聯合主鍵如何使用 JPA聯合主鍵

4.編寫dao層

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}

1.jpa已經給我們提供了單表的增刪改查操作,只需要在dao接口上實現 JpaRepository<T, ID>接口,就可以通過接口里的方法完成crud操作。
其中JpaRepository里的泛型,T是表的實體類,ID是表的主鍵對應的實體類屬性數據類型,我這里是<User, Integer>。

5.測試類

即使自定義的UserRepository沒有編寫任何代碼,注入后一樣可以能使用 save(),findXXX(),delete(),count()等方法,並且測試有效,其實是JPA內部 CrudRepository 提供, SimpleJpaRepository 實現的,而 JpaRepository 是CrudRepository的子類,我們又實現了 JpaRepository所以就可以直接用。

詳細類圖在 JpaRepository 中 右鍵>Diagrams>show Diagrams...>java class Diagrams 可以查看。 圖文步驟:IDEA查看類繼承關系

5.1 保存

save(S var1)

@Test
public void testSave() {

    User user = new User();
    user.setUserName("張三");
    user.setAge(23);
    user.setGender("男");
    userRepository.save(user);
    log.info("保存成功,主鍵:{}", user.getUserId());

}

5.2 查詢

查詢全部

List<T> findAll();

    @Test
    public void testFindAll() {

        List<User> userList = userRepository.findAll();
        log.info("查詢所有:{}", userList);
    }

主鍵查詢
Optional<T> findById(ID var1);

List<T> findAllById(Iterable<ID> var1);

    @Test
    public void testFindById() {
        //主鍵查詢-查詢一個
        Optional<User> userOptional = userRepository.findById(2);
        if (userOptional.isPresent()) {
            log.info("根據主鍵查詢:{}", userOptional.get());
        }

        //主鍵查詢-查詢多個
        List<Integer> userIdList = Arrays.asList(new Integer[]{2, 3});
        List<User> userListByIds = userRepository.findAllById(userIdList);
        log.info("根據多個主鍵查詢:{}", userListByIds);
    }

5.3 更新

save(S var1)

    @Test
    public void testUpdate() {
        User user = new User();
        user.setUserId(2);
        user.setUserName("李十四");
        userRepository.save(user);
        log.info("保存成功");
    } 

添加和更新操作都是save(T t)方法,邏輯是根據主鍵判斷的,如果數據庫中有數據能匹配到參數中的主鍵,就更新匹配到的數據,否則就新添加。

5.4 刪除

void delete(T var1)
void deleteById(ID var1);
void deleteAll();

@Test
public void testDelete(){
    //刪除名字是張三的記錄
    User user = new User();
    user.setUserName("張三");
    userRepository.delete(user);
    
    //刪除主鍵是2的記錄(李四)
    Integer userId = 2;
    userRepository.deleteById(userId);
}

5.5計數

long count();

@Test
public void testCount() {
    long count = userRepository.count();
    System.out.println(count);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM