3.1 Łączenie Hibernate i baz danych
Dowiedzieliśmy się, jak połączyć Hibernate z naszą aplikacją za pomocą Mavena oraz jak mapować tabele na klasy za pomocą adnotacji. I teraz pojawia się kolejne pytanie - w jaki sposób odczytujemy obiekty z bazy danych lub je tam zapisujemy?
Nie tak szybko. Przede wszystkim musisz zająć się jeszcze trzema sprawami:
- Konfigurowanie połączenia z bazą danych
- Konfigurowanie Hibernacji
- Praca z EntityManagerem
Hibernate całkowicie ukrywa pracę z bazą danych przed Twoją aplikacją, jednak aby uniknąć wszelkich ekscesów, musi być odpowiednio skonfigurowany. Nie możesz pominąć tego etapu – w przeciwnym razie skąd Hibernate będzie wiedział, do której bazy danych zapisać obiekty?
Hibernate można skonfigurować i podać informacje o bazie danych na trzy sposoby
- Użyj pliku właściwości
- Użyj pliku hibernate.cfg.xml
- Użyj metod komponentu bean konfiguracji
I choć najbardziej podoba mi się ten ostatni, na pewno spotkacie się ze wszystkimi trzema, więc tutaj przeanalizujemy wszystkie trzy.
3.2 Autoryzacja w bazie danych
Zacznijmy od najważniejszego - połączeń z bazami danych. Aby to zrobić, musisz podać dane, aby Hibernate mógł zalogować się do żądanej bazy danych.
Konfiguracja pliku właściwości |
---|
hibernacja.właściwości |
|
Te same ustawienia można ustawić w postaci pliku xml:
Konfiguracja oparta na XML |
---|
hibernate.cfg.xml |
|
W obu przykładach widzimy te same ustawienia z tymi samymi wartościami. Po prostu pierwszy przykład przedstawia je jako plik właściwości , a drugi jako plik xml .
Te ustawienia są podzielone na trzy grupy:
- Określ typ DBMS
- Określ dialekt (typ DBMS), na przykład Oracle 9.0
- Podaj nazwę sterownika JDBC do pracy z tym DBMS
- Określ dane do autoryzacji w bazie danych
- Adres bazy danych
- nazwa użytkownika
- hasło
- Konfigurowanie silnika Hibernate
hibernate.show_sql
- Hibernate zduplikuje w konsoli wszystkie żądania, które wykonujehbm2ddl.auto
- Hibernate w razie potrzeby zmieni strukturę bazy danych
Istnieje trzeci sposób konfiguracji ustawień - poprzez pojemniki. Zwykle jest używany w połączeniu ze Springiem, więc przyjrzymy się mu, kiedy nauczymy się SpringFramework.
3.3 Pobierz SessionFactory
Następnym krokiem jest pobranie obiektu SessionFactory. Można to zrobić na kilka sposobów:
Pierwszym sposobem jest użycie pliku hibernate.properties .
Aby to zrobić, wystarczy napisać następujący kod:
SessionFactory sessionFactory = new Configuration().buildSessionFactory();
Jeśli plik hibernate.properties nie zostanie znaleziony w bieżącym katalogu projektu, zostanie zgłoszony wyjątek.
Drugim sposobem jest konfiguracja za pomocą pliku hibernate.cfg.xml .
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Jeśli napiszesz taki kod, to plik hibernate.cfg.xml
. Jeśli taki plik nie zostanie znaleziony, metoda buildSessionFactory()
zgłosi wyjątek.
Trzecim sposobem jest ręczne ustawienie pliku konfiguracyjnego .
Czasami podczas procesu programowania konieczne staje się przejście do bazy testowej lub zmiana innych ustawień pracy z bazą, w tym celu można ręcznie ustawić plik konfiguracyjny:
SessionFactory sessionFactory = new Configuration().configure("hibernate-dev.cfg.xml").buildSessionFactory();
Metoda czwarta - używamy niestandardowego pliku hibernate.properties:
ClassLoader classLoader = Thread.currentThread().getClassLoader();
Properties properties = new Properties();
properties.load(classLoader.getResourceAsStream("hibernate-dev.properties"));
SessionFactory sessionFactory = new Configuration()
.addProperties(properties)
.buildSessionFactory();
I wreszcie, możesz po prostu wszyć wszystkie niezbędne parametry bezpośrednio do kodu:
Properties properties = new Properties();
properties.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
properties.put(Environment.URL, "jdbc:mysql://localhost:3306/supershop");
properties.put(Environment.USER, "root");
properties.put(Environment.PASS, "password");
SessionFactory sessionFactory = new Configuration()
.setProperties(properties)
.buildSessionFactory();
3.4 Określ, gdzie szukać klas jednostek
Ale to nie wszystko. Kiedy konfigurujemy obiekt SessionFactory w Hibernate, ten SessionFactory sprawdza, czy wszystkie wymagane tabele z wymaganymi typami kolumn istnieją w bazie danych.
Aby obiekt SessionFactory mógł to zrobić, musi otrzymać listę klas jednostek, które musi zmapować do bazy danych.
Listę klas jednostek można przekazać na trzy sposoby:
Metoda pierwsza. W hibernate.cfg.xml
dodaj linię taką jak:
<mapping class="class-qualified-name" />
Przykład:
<mapping class="com.codegym.data.User" />
<mapping class="com.codegym.data.Employee" />
<mapping class="com.codegym.data.Task" />
Metoda druga. Wywołaj metodę na obiekcie ConfigurationaddAnnotatedClass()
. Przykład:
SessionFactory sessionFactory = new Configuration()
.configure()
.addAnnotatedClass(com.codegym.data.User.class)
.buildSessionFactory();
Jeśli jest wiele klas, możesz dodać je w całych pakietach:
SessionFactory sessionFactory = new Configuration()
.configure()
.addPackage("com.codegym.data")
.buildSessionFactory();
3.5 Ostatni przykład
Teraz, gdy nauczyliśmy się konfigurować obiekt SessionFactory, napiszmy kod, który będzie z niego korzystał.
Będzie się składał z trzech metod:
- Konfigurowanie hibernacji
- Metoda pobierająca wszystkich pracowników z bazy danych
- Metoda zapisująca nowego pracownika do bazy danych
Ten szablon kodu wyglądałby mniej więcej tak:
class EmployeeManager {
private SessionFactory sessionFactory;
public void class init() {
this.sessionFactory = new Configuration()
.configure()
.buildSessionFactory();
}
public List<Employee> getAllEmployes() {
try (Session session = sessionFactory.openSession()) {
Query<Employee> query = session.createQuery("from Employee", Employee.class);
return query.list();
}
}
public void addEmployee(Employee employee ) {
try (Session session = sessionFactory.openSession()) {
Transaction transaction = session.beginTransaction();
session.save(employee);
transaction.commit();
}
}
}
Przed wykonaniem zapytania do bazy danych należy utworzyć osobną sesję. Jeśli żądania są powiązane, można je wykonać w tej samej sesji. Jeśli żądania nie są ze sobą powiązane (i może upłynąć kilka minut między nimi), muszą utworzyć własne sesje.
Jeśli chcesz odczytać dane z bazy danych lub wykonać złożone zapytanie, musisz najpierw utworzyć obiekt Query i użyć go do wykonania zapytania.
Ponadto każde zapytanie do bazy danych jest wykonywane we własnej transakcji. Musisz go otworzyć, wykonać niezbędne operacje, a następnie zamknąć (zatwierdzić).
W kolejnych wykładach przeanalizujemy bardziej szczegółowo, jak to wszystko działa.
GO TO FULL VERSION