JPA入門代碼
添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
編寫配置文件
#數據源配置數據源配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#配置JPA
#設置方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#是否控制檯打印SQL語句
spring.jpa.show-sql=true
#自動生成策略,包括create、create-drop、update、none、validate
spring.jpa.hibernate.ddl-auto=update
#配置對應數據庫
spring.jpa.database=mysql
#設置命名策略
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
創建實體類
/**
* @Entity 指定當前類是實體類
* @Table 指定實體類和表之間的對應關係
* @Id 指定當前字段是主鍵
* @GeneratedValue 指定主鍵的生成方式
* @Column 指定實體類屬性和數據庫表之間的對應關係
* 屬性:
* name:指定數據庫表的列名稱。
* unique:是否唯一
* nullable:是否可以爲空
* inserttable:是否可以插入
* updateable:是否可以更新
* columnDefinition: 定義建表時創建此列的DDL
*/
@Entity
@Table(name = "userinfo")
public class UserInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="userId")
private Integer userId ;
@Column(length = 30)
private String username ;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test01 {
@Test
public void test01(){
System.out.println("hello world");
}
}
編寫dao
import com.ry.jpademo.domain.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserInfoRepository extends JpaRepository<UserInfo,Integer> {
}
測試增刪改查
import com.ry.jpademo.domain.UserInfo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Optional;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserInfoRepositoryTest {
@Autowired
private UserInfoRepository userInfoRepository;
@Test
public void testSave() {
//測試添加
UserInfo userInfo = new UserInfo();
userInfo.setUserName("zhangsan");
userInfo = userInfoRepository.save(userInfo);
System.out.println("測試save()結束" + userInfo);
}
@Test
public void testModify() {
//測試查詢並修改
Optional<UserInfo> userInfoOptional = userInfoRepository.findById(1);
if (userInfoOptional != null) {
UserInfo userInfo = userInfoOptional.get();
userInfo.setUserName("lisi");
userInfoRepository.save(userInfo);
System.out.println("測試結束" + userInfo);
}
}
@Test
public void testFindAll() {
//測試查詢全部
List<UserInfo> userInfos = userInfoRepository.findAll();
System.out.println("測試findAll()結束" + userInfos);
}
@Test
public void testDelete() {
//測試刪除
userInfoRepository.deleteById(1);
System.out.println("測試deleteById()結束");
}
}
擴展查詢
import com.ry.jpademo.domain.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserInfoRepository extends JpaRepository<UserInfo,Integer> {
//擴展查詢
UserInfo findByUserName(String userName);
}
測試
@Test
public void testFindByUserName() {
//測試擴展查詢
UserInfo userInfo=userInfoRepository.findByUserName("zhangsan");
System.out.println("測試findByUserName()結束"+userInfo);
}
JPQL
編輯自定義查詢dao
import com.ry.jpademo.domain.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface UserInfoRepository extends JpaRepository<UserInfo,Integer> {
//擴展查詢
UserInfo findByUserName(String userName);
//dao自定義查詢
@Query("from UserInfo u where u.userName = :userName")
UserInfo findByName(@Param("userName") String userName) ;
}
測試
@Test
public void testfindByName() {
//測試自定義查詢
UserInfo userInfo=userInfoRepository.findByName("zhangsan");
System.out.println("測試findByName()結束"+userInfo);
}
自定義查詢補充
//展示位置參數綁定
@Query(value = "from User u where u.name=?1 and u.password=?2")
User findByNameAndPassword(String name, String password);
//展示名字參數綁定
@Query(value = "from User u where u.name=:name and u.email=:email")
User findByNameAndEmail(@Param("name")String name, @Param("email")String email);
//展示like模糊查詢
@Query(value = "from User u where u.name like %:nameLike%")
List<User> findByNameLike(@Param("nameLike")String nameLike);
//展示時間間隔查詢
@Query(value = "from User u where u.createDate between :start and :end")
List<User> findByCreateDateBetween(@Param("start")Date start, @Param("end")Date end);
//展示傳入集合參數查詢
@Query(value = "from User u where u.name in :nameList")
List<User> findByNameIn(@Param("nameList")Collection<String> nameList);
//展示傳入Bean進行查詢(SPEL表達式查詢)
@Query(value="from User u where u.name=:#{#usr.name} and u.password=:#{#usr.password}")
User findByNameAndPassword(@Param("usr")User usr);
分頁查詢(無條件)
@Test
public void testfindAllByPage() {
//測試分頁查詢
PageRequest pageable = PageRequest.of(1, 2);
Page<UserInfo> page = userInfoRepository.findAll(pageable);
System.out.println("總頁數:" + page.getTotalPages());
System.out.println("總記錄數:" + page.getTotalElements());
System.out.println("查詢結果:" + page.getContent());
System.out.println("當前頁數:" + (page.getNumber() + 1));
System.out.println("當前頁記錄數:" + page.getNumberOfElements());
System.out.println("每頁記錄數:" + page.getSize());
}
分頁查詢(自定義無條件)
編輯dao
import com.ry.jpademo.domain.UserInfo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface UserInfoRepository extends JpaRepository<UserInfo, Integer> {
//自定義分頁查詢
@Query(value = "select * from UserInfo", nativeQuery = true)
Page<UserInfo> findAllResult(Pageable pageable);
}
測試
@Test
public void testfindAllByPage2() {
//自定義分頁查詢
//注意 Pageable pageable = PageRequest.of(0,2) ;參數0是第一頁,2是size
Pageable pageable = PageRequest.of(0,2) ;
Page<UserInfo> page = userInfoRepository.findAllResult(pageable) ;
System.out.println("總頁數:" + page.getTotalPages());
System.out.println("總記錄數:" + page.getTotalElements());
System.out.println("查詢結果:" + page.getContent());
System.out.println("當前頁數:" + (page.getNumber() + 1));
System.out.println("當前頁記錄數:" + page.getNumberOfElements());
System.out.println("每頁記錄數:" + page.getSize());
}
分頁查詢(有條件)
//有條件的分頁查詢
@Query(value = "from UserInfo u where u.userName like %:userNameLike%")
Page<UserInfo> findByEmailLike(Pageable pageable, @Param("userNameLike") String userNameLike);