在使用SpringData JPA組件時(shí),我們一般都是定義實(shí)體厘线,定義倉(cāng)庫(kù)接口磷箕,然后就可以增刪改查了朝群。
但是在實(shí)際業(yè)務(wù)中胯甩,很多數(shù)據(jù)表的名稱(chēng)并不是固定的往产,比如我們的軌跡表呵萨,就是每天一張溺蕉,類(lèi)似:track_20210601伶丐。
這時(shí)如果在實(shí)體的@Table注解中再寫(xiě)明數(shù)據(jù)表名稱(chēng)就不現(xiàn)實(shí),需要一個(gè)途徑去處理此類(lèi)問(wèn)題疯特,因?yàn)槲覀兊臉I(yè)務(wù)涉及這種情況的表就兩個(gè)哗魂,所以這里記錄一種實(shí)現(xiàn)這個(gè)業(yè)務(wù)的簡(jiǎn)單方法。
具體如以下代碼所示:
package com.jns.jpanamingstrategy;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.Transactional;
import java.util.List;
@SpringBootTest
class JpaNamingStrategyApplicationTests {
@PersistenceContext
private EntityManager entityManager;
// SQL模板
String insertRecordTmp = "insert into %s(`id`,`name`)values(%d, '%s')";
String selectRecordTmp = "select `id`,`name` from %s";
String updateRecordTmp = "update %s set `name`='%s' where `id`=%d";
String deleteRecordTmp = "delete from %s where `id`=%d";
String findTableTmp = "select count(TABLE_NAME) from information_schema.`TABLES` where TABLE_SCHEMA='%s' AND TABLE_NAME='%s'";
@Test
// 啟用事務(wù) 這個(gè)注解必須加
@Transactional
void contextLoads() {
// 數(shù)據(jù)表名稱(chēng)
String tableName = "student_01";
// 判斷數(shù)據(jù)表是否存在
if (!findSameNameTable("test", tableName)) {
create(tableName);
insert(tableName, 1, "kaven");
insert(tableName, 2, "john");
insert(tableName, 3, "lily");
} else {
System.out.println(tableName + " 已經(jīng)存在漓雅!");
}
System.out.println("驗(yàn)證插入");
select(tableName);
update(tableName, 1, "han mei mei");
System.out.println("驗(yàn)證更新");
select(tableName);
delete(tableName, 3);
System.out.println("驗(yàn)證刪除");
select(tableName);
}
public void create(String tableName) {
String createTable = "create table " + tableName + "(`id` int primary key , `name` varchar(50))";
Query query = entityManager.createNativeQuery(createTable);
query.executeUpdate();
}
public void insert(String tableName, int id, String name) {
String sql = String.format(insertRecordTmp, tableName, id, name);
Query query = entityManager.createNativeQuery(sql);
query.executeUpdate();
}
public void select(String tableName) {
String sql = String.format(selectRecordTmp, tableName);
Query query = entityManager.createNativeQuery(sql);
// Object[] 為每一條數(shù)據(jù)每列的值录别,順序?yàn)閿?shù)據(jù)表列順序,索引0開(kāi)始
List<Object[]> l = query.getResultList();
for (Object[] o : l) {
System.out.println(o[0] + " " + o[1]);
}
}
public void update(String tableName, int id, String name) {
String sql = String.format(updateRecordTmp, tableName, name, id);
Query query = entityManager.createNativeQuery(sql);
query.executeUpdate();
}
public void delete(String tableName, int id) {
String sql = String.format(deleteRecordTmp, tableName, id);
Query query = entityManager.createNativeQuery(sql);
query.executeUpdate();
}
public boolean findSameNameTable(String TABLE_SCHEMA, String TABLE_NAME) {
boolean same = false;
String sql = String.format(findTableTmp, TABLE_SCHEMA, TABLE_NAME);
Query query = entityManager.createNativeQuery(sql);
List<Object> l = query.getResultList();
if (Integer.parseInt(String.valueOf(l.get(0))) > 0) {
same = true;
}
return same;
}
}
有一個(gè)地方需要注意邻吞,就是查詢(xún)的時(shí)候组题,關(guān)于字段的返回,具體說(shuō)明如下:
1625807923(1).png
就是當(dāng)查詢(xún)語(yǔ)句只有一個(gè)字段時(shí)抱冷,就直接返回該字段的值了崔列,不會(huì)再是Object[]數(shù)組了。