新人小白記錄自己的采坑記錄
springboot整合jpa步驟:
(一)添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
(二)配置文件添加配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.ddl-auto:不同的參數(shù)對(duì)應(yīng)不同的建表更表規(guī)則,開始的時(shí)候選擇create-drop,導(dǎo)致每次重啟項(xiàng)目,原來(lái)的數(shù)據(jù)就消失不見。
create:每次加載都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來(lái)生成新表,哪怕兩次沒有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(shù)據(jù)丟失的一個(gè)重要原因。
create-drop:每次加載時(shí)根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除。
update:最常用的屬性,第一次加載hibernate時(shí)根據(jù)model類會(huì)自動(dòng)建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫(kù)),以后加載hibernate時(shí)根據(jù)model類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被馬上建立起來(lái)的,是要等應(yīng)用第一次運(yùn)行起來(lái)后才會(huì)。
validate:每次加載時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。
(三)創(chuàng)建bean
@Entity
@Table(name="user_test")
public class UserTest {
@Id
@GeneratedValue //自增
private Long id;
@Column(nullable = false) //是否可為空
private String name;
@Column(nullable = false)
private Integer age;
//省略get和set
(四)創(chuàng)建數(shù)據(jù)接口
public interface UserTestDao extends JpaRepository<UserTest,Long> {
UserTest findByName(String name);
List<UserTest> findByNameAndAge(String name, Integer age);
@Query("from UserTest u where u.name=:name")
UserTest findUser(@Param("name") String name);
}
(五)調(diào)用方法
UserTest userTests= userTestDao.findByName(userName);
System.out.println("獲取到的用戶信息是:"+userTests);
報(bào)錯(cuò)如下:result returns more than one elements

(六)原因分析
報(bào)錯(cuò)信息提示結(jié)果返回多個(gè)元素,我們打開數(shù)據(jù)庫(kù)查看數(shù)據(jù)表中的數(shù)據(jù)發(fā)現(xiàn)

表中用戶名為aaaa的用戶有兩個(gè),查詢?cè)撚脩舻臅r(shí)候,返回的數(shù)據(jù)有多個(gè),而我們打印的事一個(gè)userTest,系統(tǒng)不知道選擇打印哪一個(gè),所以導(dǎo)致報(bào)錯(cuò),以此類推,如果查詢表中唯一存在的數(shù)據(jù),是不是正常顯示?通過(guò)測(cè)試發(fā)現(xiàn),查找如idea、ceshi、zhaohj等數(shù)據(jù)時(shí),可以正常打印
(七)解決優(yōu)化
將原來(lái)的
UserTest findByName(String name);
改成
List<UserTest> findByName(String name);
查找優(yōu)化
if (userTests.size() != 0) {
if (userTests.size() > 1) {
System.out.println("獲取到的用戶信息是:" + userTests.get(1));
} else {
System.out.println("獲取到的用戶信息是:" + userTests);
}
} else {
Random random = new Random();
userTestDao.save(new UserTest(userName, random.nextInt(100)));
}
