<!--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>
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
html
@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
java
如何生成 IDEA自動生成JPA實體
mysql
3.2 數據庫全部的表必需要有主鍵,jpa要求全部的表都必須有主鍵列,實體類必須有@Id標註,能夠是聯合主鍵,可是不能沒有,沒有的話會報異常:
org.hibernate.AnnotationException: No identifier specified for entity: com.joe.jpa.domain.User
聯合主鍵如何使用 JPA聯合主鍵
spring
@Repository public interface UserRepository extends JpaRepository<User, Integer> { }
1.jpa已經給咱們提供了單表的增刪改查操做,只須要在dao接口上實現 JpaRepository<T, ID>接口,就能夠經過接口裏的方法完成crud操做。
其中JpaRepository裏的泛型,T是表的實體類,ID是表的主鍵對應的實體類屬性數據類型,我這裏是<User, Integer>。sql
即便自定義的UserRepository沒有編寫任何代碼,注入後同樣能夠能使用 save(),findXXX(),delete(),count()等方法,而且測試有效,實際上是JPA內部 CrudRepository 提供, SimpleJpaRepository 實現的,而 JpaRepository 是CrudRepository的子類,咱們又實現了 JpaRepository因此就能夠直接用。
詳細類圖在 JpaRepository 中 右鍵>Diagrams>show Diagrams...>java class Diagrams
能夠查看。 圖文步驟:IDEA查看類繼承關係
數據庫
save(S var1)
springboot
@Test public void testSave() { User user = new User(); user.setUserName("張三"); user.setAge(23); user.setGender("男"); userRepository.save(user); log.info("保存成功,主鍵:{}", user.getUserId()); }
查詢所有dom
List<T> findAll();
ide
@Test public void testFindAll() { List<User> userList = userRepository.findAll(); log.info("查詢全部:{}", userList); }
主鍵查詢
Optional<T> findById(ID var1);
List<T> findAllById(Iterable<ID> var1);
spring-boot
@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); }
save(S var1)
@Test public void testUpdate() { User user = new User(); user.setUserId(2); user.setUserName("李十四"); userRepository.save(user); log.info("保存成功"); }
添加和更新操做都是save(T t)方法,邏輯是根據主鍵判斷的,若是數據庫中有數據能匹配到參數中的主鍵,就更新匹配到的數據,不然就新添加。
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); }
long count();
@Test public void testCount() { long count = userRepository.count(); System.out.println(count); }