Daobab ORM wersja 1.3

1

Witajcie,

Udało się wystawić kolejną wersję Daobaba.

Ważniejsze nowości:

  • dużo poprawek w generatorze, który można uruchomić dużo łatwiej a który miał też wcześniej problem z pewnymi typami baz danych.
  • wprowadziłem MetaDane, które są targetem, a więc możliwe jest wykonanie na nich kwerend SQLowych. Dzięki MetaDanym można np porównać schematy, dokonać analizy struktury bazy danych itp.
  • AccessProtector pozwala na zarządzanie bezpieczeństwem w dostępie do poszczególnych rodzajów danych. Daobab pozwala na wystawienie targetu (bazy danych, kolekcji itp) za pośrednictwem jednego endpointu RESTowego. Jeśli jednak chcesz zablokować dostęp do pewnych danych wrażliwych, lub zwyczajnie wystawić tylko wybrane typy danych (tabele, kolumny), możesz to w bardzo łatwy sposób zrobić za pomocą tego narzędzia. AccessProtector można wykorzystać też wewnętrznie - jeśli w samej aplikacji chcesz zablokować dostęp do pewnych danych z poziomu SQL (Daobab umożliwia wykonywanie kwerend SQL na kolekcjach znajdujących się w pamięci)
  • wbudowane statystyki, które możesz dostosować do swoich potrzeb np gromadzić informacje tylko o błędach, czy o dłuższych wykonanych kwerend. Te struktury również można przeglądać kwerendami
  • obsługa kompozytów jako zbiorów kolumn w tym kompozytowych PrimaryKey
  • ulepszyłem wykonywanie kwerend na kolekcjach. Same kolekcje inicjują się też dużo szybciej.
  • wdrożyłem obsługę ByteBufferów Off-Heap. Bardzo wydajne rozwiązanie w przypadku bardzo dużych kolekcji. Tego typu struktury są poza Javowym Heapem, aczkolwiek korzystają z pamięci, którą system przydziela procesowi. Dla GC, ta pamięć jest niewidoczna... nie zarządza nią. Dlatego użycie tych struktur dla większych kolekcji pozwala bardzo przyspieszyć aplikację. Target ten jest indeksowany. Kwerendy wykonywanie na nim bywają znacznie szybsze od prostego filtrowania w streamie. Aczkolwiek kilka rzeczy zostało jeszcze do dopisania w następnej wersji.
  • Plates a więc inaczej mówiąc projekcje, czyli robocze sety kolumn niekoniecznie należących do jednej tabeli, mogą również być same w sobie targetem, na którym można wykonywać kwerendy.
  • dużo wewnętrznej przebudowy. Usunąłem kasy związane z niezależnym budowaniem kwerend. Od tej chwili kwerendy możliwe są do zbudowania wyłącznie z obiektu targetu. Jest to związane z tym, że każdy target może budować query w inny sposób. Nawet poszczególne typy bazy danych, mogą nie wspierać pewnych wyrażeń SQL, lub mogą nie wpierać SQL w ogóle.
  • poza tym dużo mniejszych dodatków np budowanie insert-selectów, select duali czy innych bardziej skomplikowanych kwerend.

Od tej wersji, kody źródłowe są dostępne na GitHubie, gdzie również znajdziesz ponad 110 przykładów w działającej aplikacji z podpiętą H2jką.
Zachęcam do obserwowania projektu na GitHubie oraz odwiedzin strony http://www.daobab.io, gdzie znajdziesz do mnie kontakt jeśli ktoś potrzebujesz jakieś szyte na miarę rozwiązanie.

Jeśli podoba Ci się moja praca, proszę o sharing informacji o tej bibliotece. Dziękuję!

http://www.daobab.io/release-notes.html

0

@KamilAdam: Poprawiłem. Dziękuje za info.

3

Powiedz mi dlaczego masz ładny landing page z własną domeną ale nie masz tego na MavenCentral? Nikt nie będzie dodawał do projektu jakich lewy repozytoriów. Maven Central zapewnia pewien poziom jakości (binarki + źródła jar + javadoc jar) oraz bezpieczeństwa (automatyczne skanowanie każdej paczki). Ja niedawno publikowałem swoją paczkę, nie zajmuje to więcej niż jeden dzień żeby postawić choć jest upierdliwe.

Dwa: dlaczego ma to tylko 1 gwiazdę na GitHubie. Mogłeś chociaż kolegów z pracy poprosić żeby pogwiazdkowali? To się nazywa marketing.

Trzy: Grzech kardynalny - nie ma licencji. Bez licencji w repo, nikt tego kodu nie użyje na komercyjnym projekcie.

Poza tym po 15 min wygląda jak klon: https://github.com/querydsl/querydsl, jaką to ma przewagę na QueryDSL i jOOQ?

Natomiast muszę pogratulować, bo zrobienie tego od zera z pewnością wymagało sporo pracy i wysiłku. Myślę że nie zrobisz źle jak to zapostujesz na reddit.com/r/java.

PS. Polecam dodać build do GitHuba (GitHub actions) oraz mierzenie pokrycia kodu (coś mi mówi że nie masz więcej niż 50%).

1

@0xmarcin: Dzięki za hint z Redditem. Spróbuję tam coś wrzucić. To z pewnoscia dobry pomysł.

Co do Maven, to wszystko tam musi być w pełni opensourcowe, a ten projekt w pełni open sourcowy nie jest. Znajdują się tam natomiast stare wersje tej biblioteki.
Szczerze mówiąc nie wiem jak w GitHubie dodać akurat ten typ licencji... o ile pamiętam można tam wybrać licencje wyłącznie jedną z podanych.

Co do tych bibliotek, to różnice są spore. Z grubsza, w mojej ocenie przewagą Daobaba jest pełną obiektowość i bardzo duża zgodność z SQLem. QueryDSL tutaj zupełnie odpada... poza tym to chyba dziedziczy wszystko co złe z JPA.

Musze kiedyś zrobić jakieś porównanie, bo wszyscy mnie o to pytają... tylko ja nie chciałbym aby np autor JOOQ poczuł się tym urażony, ponieważ bardzo doceniam to co zrobił i uważam że w pewnych obszarach Daobab może sporo odstawać.

No dobra pokuszę się o małe porównanie. To np jakiś przykład który znalazłem na stronie JOOQ

JOOQ:

BookRecord book = new BookRecord();
book.setAuthorId(1);
book.setPublishedIn(1970);
book.setLanguageId(1);

Result<BookRecord> books1 =
DSL.using(configuration)
   .selectFrom(BOOK)
   .where(condition(book))
   .fetch();
   
Result<BookRecord> books2 = DSL.using(configuration).fetchByExample(book);

Daobab:

var b=tabBook;
List<Book> books1=db.select(b).where(and()
	equals(b.colAuthorId(),1)
	equals(b.colPublishedIn(),1970)
	equals(b.colLanguageId(),1))
.findMany();

SQL:

select * from book b
	where b.authorid=1 and b.publishedIn=1970 and b.langugeid=1;

A teraz przykład z QueryDSL, który wziąłem ze StackOverflow:

QueryDSL:

String nickname = "nick";

QAccount account = QAccount.account;
QAccountProfile accountProfile = QAccountProfile.accountProfile;
QCommunity community = QCommunity.community;

JPQLQuery query = new JPAQuery(entityManager);

BooleanBuilder predicate = new BooleanBuilder();
predicate.and(accountProfile.nickname.eq(nickname));

query.from(community)
     .join(community.account, account)
     .join(account.accountProfile, accountProfile)
     .where(predicate);

repository.findAll(query, pageable);

Daobab:

db.select(tabCommunity)
.join(tabAccount,tabCommunity.colAccount())
.join(tabProfile,tabAccount.colProfile(),and().equals(tabProfile.colNickName(),"nick"))
.findOne();

SQL:

select * from community
 join community on community.account=account.account
 join profile on profile.profile=account.profile and profile.nickname='nick';

Są to różnice tylko w składni, ale pokazują jak bardzo chciałem aby developer w Javie widział w kodzie co tak naprawdę idzie do bazy danych i aby mógł pisać SQL obiektowo a nie uczyć się kolejnego query-jezyka.

Trzeba też pamiętać, że Daobab to tylko składnia i obiektowość SQL, ale również kwerendy na kolekcjach, zdalne wykonywanie kwerend i wiele więcej.

0
Klaudiusz Wojtkowiak napisał(a):

Szczerze mówiąc nie wiem jak w GitHubie dodać akurat ten typ licencji... o ile pamiętam można tam wybrać licencje wyłącznie jedną z podanych.

Robisz plik o nazwie LICENSE i wklejasz tam treść licencji :|

BTW to ja dałem pierwszą gwiazdkę temu projektowi. To znaczy że nie lubisz własnego projektu :|

0

OK. Dziękuję za każda gwiazdkę:)

https://github.com/daobab-projects/daobab-core

1

Mysle, ze dobrze, ze powstal Daobab jako kolejna alternatywa, widac, ze juz troche roboty to kosztowalo. Zobaczymy, jesli sie to rozreklamuje bardziej to powinno miec szanse sie przyjac. Ja sprobuje w wolnym czasie to odpalic i sie pobawic, aby sprawdzic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1