이렇게 우아 한 자바 ORM 못 봤 죠?

7868 단어 자바orm
『8195』자바 의 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 에 관 한 더 많은 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기