이렇게 우아 한 자바 ORM 못 봤 죠?
1.ORM 예제
1. Insert
public CompletableFuture<Void> insert() {
var obj = new sys.entities.Demo("MyName"); //
obj.Age = 100; //
return obj.saveAsync();
}
2. Update단일 실체 업데이트(홈 키 가 있어 야 함)
public CompletableFuture<Void> update(sys.entities.Demo obj) {
obj.Age = 200;
return obj.saveAsync();
}
조건 에 따라 업데이트(오 작 동 방지 조건 을 지정 해 야 합 니 다)
public CompletableFuture<?> update() {
var cmd = new SqlUpdateCommand<sys.entities.Demo>();
cmd.update(e -> e.City = "Wuxi"); //
cmd.update(e -> e.Age = e.Age + 1); //
cmd.where(e -> e.Name == "Johne"); //
var outs = cmd.output(e -> e.Age); //
return cmd.execAsync().thenApply(rows -> {
System.out.println(" : " + rows);
System.out.println(" : " + outs.get(0));
return "Done.";
});
}
3. Delete단일 실체 삭제(홈 키 가 있어 야 함)
public CompletableFuture<Void> update(sys.entities.Demo obj) {
obj.markDeleted(); //
return obj.saveAsync(); //
}
조건 에 따라 삭제(오 작 동 방지 조건 을 지정 해 야 합 니 다)
public CompletableFuture<?> delete() {
var cmd = new SqlDeleteCommand<sys.entities.Demo>();
cmd.where(e -> e.Age < 0 || e.Age > 200);
return cmd.execAsync();
}
4. Transaction『8195』저 자 는 암시 적 인 사 무 를 싫어 하기 때문에 사무 명령 은 반드시 명시 적 으로 지정 해 야 합 니 다.
public CompletableFuture<?> transaction() {
var obj1 = new sys.entities.Demo("Demo1");
obj1.Age = 11;
var obj2 = new sys.entities.Demo("Demo2");
obj2.Age = 22;
return DataStore.DemoDB.beginTransaction().thenCompose(txn -> { //
return obj1.saveAsync(txn) // obj1
.thenCompose(r -> obj2.saveAsync(txn)) // obj2
.thenCompose(r -> txn.commitAsync()); //
}).thenApply(r -> "Done");
}
5.Sql 조회조건
public CompletableFuture<?> query(String key) {
var q = new SqlQuery<sys.entities.Demo>();
q.where(e -> e.Age > 10 && e.Age < 80);
if (key != null)
q.andWhere(e -> e.Name.contains(key)); //
return q.toListAsync(); // List<sys.entities.Demo>
}
페이지 별 조회
public CompletableFuture<?> query(int pageSize, int pageIndex) {
var q = new SqlQuery<sys.entities.Demo>();
return q.skip(pageSize * pageIndex)
.take(pageSize)
.toListAsync();
}
결 과 는 익명 클래스 에 매 핑 됩 니 다.
public CompletableFuture<?> query() {
var q = new SqlQuery<sys.entities.Demo>();
return q.toListAsync(e -> new Object() { // List< >
public final String Name = e.Name; // =
public final int Age = e.Age + 10;
public final String Father = e.Parent.Name;
}).thenApply(appbox.data.JsonResult::new);
}
결 과 는 계 승 된 익명 클래스 에 매 핑 됩 니 다.
public CompletableFuture<?> query() {
var q = new SqlQuery<sys.entities.Demo>();
q.where(e -> e.Parent.Name == "Rick");
return q.toListAsync(e -> new sys.entities.Demo() { // List<? extens Demo>
public final String Father = e.Parent.Name;
});
}
결과 가 트 리 구조 목록 에 매 핑 됨
public CompletableFuture<?> tree() {
var q = new SqlQuery<sys.entities.Demo>();
q.where(t -> t.Name == "Rick");
return q.toTreeAsync(t -> t.Childs); // EntitySet( )
}
EntityRef(일대일 참조 실체 구성원)자동 Join
public CompletableFuture<?> query() {
var q = new SqlQuery<sys.entities.Customer>();
q.where(cus -> cus.City.Name == "Wuxi");
return q.toListAsync();
}
Sql:
Select t.* From "Customer" t Left Join "City" j1 On j1."Code"=t."CityCode"
수 동 지정 Join
public CompletableFuture<?> join() {
var q = new SqlQuery<sys.entities.Customer>();
var j = new SqlQueryJoin<sys.entities.City>();
q.leftJoin(j, (cus, city) -> cus.CityCode == city.Code);
q.where(j, (cus, city) -> city.Name == "Wuxi");
return q.toListAsync();
}
하위 조회
public CompletableFuture<?> subQuery() {
var sq = new SqlQuery<sys.entities.Demo>();
sq.where(s -> s.ParentName == "Rick");
var q = new SqlQuery<sys.entities.Demo>();
q.where(t -> DbFunc.in(t.Name, sq.toSubQuery(s -> s.Name)));
return q.toListAsync();
}
GroupBy
public CompletableFuture<?> groupBy() {
var q = new SqlQuery<sys.entities.Demo>();
q.groupBy(t -> t.ParentName) //
.having(t -> DbFunc.sum(t.Age) > 10);
return q.toListAsync(t -> new Object() {
public final String group = t.ParentName == null ? " " : t.ParentName;
public final int totals = DbFunc.sum(t.Age);
}).thenApply(appbox.data.JsonResult::new);
}
2.실현 원리사실 상기 예시 코드 는 최종 적 으로 실행 되 는 코드 가 아니다.저 자 는 Eclipse jdt 를 이용 하여 상기 코드 를 컴 파일 하여 서비스 모델 을 발표 할 때 최종 실행 코드 로 분석 하고 구체 적 인 과정 은 다음 과 같다.
1.jdt 분석 서비스 가상 코드 생 성 AST 추상 문법 트 리;
2.AST 트 리 를 옮 겨 다 니 며 실체 대상 의 읽 기와 쓰기 속성 을 getXXX(),setXXX()로 바 꿉 니 다.
var name = obj.Name; //
obj.Name = "Rick"; //
다음으로 변경:
var name = obj.getName();
obj.setName("Rick");
3.AST 트 리 를 옮 겨 다 니 며 관련 방법 을 조회 하 는 매개 변 수 를 실행 식 으로 변환 합 니 다.
public CompletableFuture<?> query(String key) {
var q = new SqlQuery<sys.entities.Employee>();
q.where(e -> e.Manager.Name + "a" == key + "b");
return q.toListAsync();
}
다음으로 변환:
public CompletableFuture<?> query(String key) {
var q = new appbox.store.query.SqlQuery<>(-7018111290459553788L, SYS_Employee.class);
q.where(e -> e.m("Manager").m("Name").plus("a").eq(key + "b"));
return q.toListAsync();
}
4.서비스 모델 에 사 용 된 실체 모델 에 따라 해당 실체의 운행 시 코드 를 생 성 한다.5.마지막 으로 포장 서비스 모델 의 바이트 코드 를 컴 파일 합 니 다.
이상 은 소스 코드 의 ServiceCodeGenerator 및 Entity CodeGenerator 류 를 참고 하 시기 바 랍 니 다.
3.성능 과 소결
저 자 는 간단 한 조회 서 비 스 를 썼 습 니 다.테스트 설정 은 MacBook 호스트(wrk 압력 측정+데이터베이스)->4 핵 I7 가상 컴퓨터(서버)입 니 다.테스트 결 과 는 다음 과 같 습 니 다.qps 는 1 만 에 달 할 수 있 고 실체 맵 변환 과 직렬 화 전송 등 모든 비용 을 포함 합 니 다.참고 로 프레임 워 크 는 전체 비동기 이기 때문에 전통 적 인 JDBC 구동 을 사용 하지 않 고 jasync-sql(바 텀 은 Netty)을 사용 하여 데이터 베 이 스 를 구동 합 니 다.
wrk -c200 -t2 -d20s -s post_bin.lua http://10.211.55.8:8000/api
Running 20s test @ http://10.211.55.8:8000/api
2 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 18.97ms 5.84ms 89.15ms 81.55%
Req/Sec 5.32k 581.92 6.48k 65.00%
211812 requests in 20.02s, 36.76MB read
Requests/sec: 10578.90
Transfer/sec: 1.84MB
지금까지 이렇게 우아 한 자바 ORM 이 었 습 니 다.못 보 셨 죠?자바 orm 에 관 한 더 많은 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.