Spring Boot快速入門(四):使用jpa進行資料庫操作
阿新 • • 發佈:2019-01-08
新增依賴
新建專案選擇web,JPA,MySQL三個依賴
對於已存在的專案可以在bulid.gradle加入,spring boot將會幫你自動配置好
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
runtime('mysql:mysql-connector-java')
配置基本資訊
然後在src/main/resources/application.properties下新增基本配置
#資料庫連線地址 spring.datasource.url=jdbc:mysql://localhost:3306/jpa?useSSL=false #資料庫賬號 spring.datasource.username=root #資料庫密碼 spring.datasource.password=123456zxc #資料庫驅動 spring.datasource.driver-class-name=com.mysql.jdbc.Driver #jpa設定 spring.jpa.hibernate.ddl-auto=create #是否在控制檯顯示資料庫語句 spring.jpa.show-sql=true
spring.jpa.properties.hibernate.hbm2ddl.auto
其作用是:自動建立、更新、驗證資料庫表結構。該引數的幾種配置如下:
create
:每次載入hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。create-drop
:每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。update
:最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次執行起來後才會。validate
:每次載入hibernate時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。- none:什麼都不做
至此基本配置完成
建立實體
建立一個User實體,包含id(主鍵)、name(姓名)、age(年齡)屬性,通過ORM框架其會被對映到資料庫表中,由於配置了hibernate.hbm2ddl.auto
,在應用啟動的時候框架會自動去資料庫中建立對應的表。
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity//這是一個和資料庫表相關聯的類
public class User
{
@Id//主鍵
@GeneratedValue//自增長
private Long id;//id
@Column(length = 30)//長度30
private String name;//名稱
@Column(nullable = false)//不可空
private Integer age;//年齡
public User()
{
}
public User(String name, Integer age)
{
this.name = name;
this.age = age;
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getAge()
{
return age;
}
public void setAge(Integer age)
{
this.age = age;
}
}
建立資料訪問介面
建立一個userRepository介面,進行資料庫操作
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long>//JpaRepository<實體型別,主鍵型別>
{
// 通過名稱找到使用者
User findByName(String name);
// 通過名稱和年齡找到使用者
User findByNameAndAge(String name, Integer age);
// 通過名稱模糊查詢
List<User> findByNameLike(String name);
// 使用hql查詢
@Query("from User u where u.name=:name")//:name對應@Param裡的name
User findByHQL(@Param("name") String name);
// 使用sql查詢
@Query(value = "select * from user where name = ?1 and age = ?2", nativeQuery = true)//?1表示第一個引數,?2表示第二個引數
User findBySQL(String name, Integer age);
}
單元測試
在src/test/java/你的包名/你的專案名ApplicationTests編寫對應的單元測試來驗證編寫的內容是否正確
import org.junit.Assert;
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;
@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaLearnApplicationTests
{
// 注入userRepository
@Autowired
private UserRepository userRepository;
@Test
public void contextLoads()
{
// 新增10個測試用例
userRepository.save(new User("QQQ",1));
userRepository.save(new User("WWW",2));
userRepository.save(new User("EEE",3));
userRepository.save(new User("AAA",4));
userRepository.save(new User("SSS",5));
userRepository.save(new User("DDD",6));
userRepository.save(new User("ZZZ",7));
userRepository.save(new User("XXX",8));
userRepository.save(new User("CCC",9));
userRepository.save(new User("QQQ2",10));
// 測試findAll, 查詢所有記錄
Assert.assertEquals(10, userRepository.findAll().size());
// 測試findByName, 查詢姓名為AAA的User
Assert.assertEquals(4, userRepository.findByName("AAA").getAge().longValue());
// 測試findByHQL, 查詢姓名為AAA的User
Assert.assertEquals(4, userRepository.findByHQL("AAA").getAge().longValue());
// 測試findByNameAndAge, 查詢姓名為SSS並且年齡為5的User
Assert.assertEquals("SSS", userRepository.findByNameAndAge("SSS", 5).getName());
// 測試findBySQL, 查詢姓名為SSS並且年齡為5的User
Assert.assertEquals("SSS", userRepository.findBySQL("SSS", 5).getName());
// 測試刪除姓名為AAA的User
userRepository.delete(userRepository.findByName("AAA"));
// 測試findAll, 查詢所有記錄, 驗證上面的刪除是否成功
Assert.assertEquals(9, userRepository.findAll().size());
// 測試findAll, 查詢名字有Q的有幾個
Assert.assertEquals(2,userRepository.findByNameLike("%Q%").size());
}
}
點選執行測試用例