JavaRush /Blog Java /Random-MS /Pengenalan kepada Maven, Spring, MySQL, Hibernate dan apl...
Макс
Tahap

Pengenalan kepada Maven, Spring, MySQL, Hibernate dan aplikasi CRUD pertama (bahagian 1)

Diterbitkan dalam kumpulan
Selamat petang. Dalam artikel ini saya ingin berkongsi pertemuan pertama saya dengan perkara seperti Maven, Spring, Hibernate, MySQL dan Tomcat dalam proses mencipta aplikasi CRUD yang mudah. Ini adalah bahagian pertama daripada 4. Artikel ini ditujukan terutamanya untuk mereka yang telah menyelesaikan 30-40 tahap di sini, tetapi masih belum menerokai Java tulen dan baru bermula (atau akan bermula) untuk memasuki dunia terbuka dengan semua teknologi, rangka kerja dan perkataan asing yang lain ini. Pengenalan kepada Maven, Spring, MySQL, Hibernate dan aplikasi CRUD pertama (bahagian 1) - 1

Kandungan:

pengenalan

Saya mula membiasakan diri dengan teknologi dan rangka kerja yang baru kepada saya dengan mengkaji pelbagai contoh di mana ia digunakan, kerana biasanya saya memahami sesuatu yang paling baik apabila saya melihatnya dalam tindakan menggunakan contoh aplikasi yang lengkap. Lazimnya, contoh sedemikian ialah aplikasi CRUD ( C reate, Read , U pdate, D elete), Internet penuh dengan contoh sedemikian yang mempunyai tahap kerumitan yang berbeza-beza. Masalahnya ialah mereka biasanya tidak menerangkan secara terperinci bagaimana, apa dan mengapa dilakukan di sana, mengapa pergantungan itu ditambah, mengapa kelas itu dan itu diperlukan, dsb. Dalam kebanyakan kes, mereka mengambil aplikasi yang telah siap sepenuhnya, dengan fail POM akhir, dengan versi akhir kelas, dan hanya menjalankan setiap satu, tanpa memfokuskan pada perkara kecil yang mungkin kelihatan jelas kepada orang yang berpengalaman. Saya telah melihat banyak contoh sedemikian dan ia biasanya jelas bagaimana semuanya berfungsi, tetapi bagaimana ia datang kepada ini tidak sepenuhnya jelas. Oleh itu, saya memutuskan bahawa contoh sedemikian akan berguna, bukan dari kedudukan pembangun yang berpengalaman, tetapi dari kedudukan seorang pemula yang tidak pernah berurusan dengan Spring, Hibernate dan lain-lain.
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 2
Saya akan cuba menerangkan dengan terperinci yang mungkin (sejauh pemahaman saya membenarkan saya) keseluruhan laluan saya untuk mencipta aplikasi CRUD, bermula dengan sesuatu pada tahap Hello World yang paling mudah. Pertama sekali, saya melakukan ini untuk diri saya sendiri, kerana apabila anda cuba menerangkan, memberitahu, menerangkan sesuatu, ia lebih baik diserap dan teratur dalam kepala anda. Tetapi jika ini berguna kepada seseorang dan membantu mereka memikirkan sesuatu, saya akan sangat gembira. Dalam contoh ini, mari cuba buat aplikasi CRUD mudah menggunakan Maven , Tomcat , Spring , Hibernate dan MySQL . Langkah awal seperti memasang Maven , MySQL , menggunakan versi Ultimate idea, dsb. Saya rasa tidak perlu diterangkan secara terperinci, tidak sepatutnya ada masalah dengan ini. Perlu diingat bahawa dalam contoh ini, konfigurasi akan dikonfigurasikan menggunakan kelas Java (dipanggil JavaConfig) tanpa menggunakan xml.

Mencipta Projek

Jadi, memandangkan saya seorang pemula, kami tidak akan menggunakan sebarang arketaip yang tidak jelas. Spring initializr masih kedengaran terlalu menakutkan. Oleh itu, kami akan mencipta projek Maven mudah yang paling biasa. Saya tidak mempunyai nama domain, jadi dalam groupid saya hanya akan menulis testgroup, dan dalam artifactid saya akan menulis nama, sebagai contoh, filmography(ini akan menjadi senarai filem). Kami mencipta projek dan memilih Enable auto-importapabila idea mencadangkannya. Terima kasih kepada ini, setiap kali kami membuat sebarang perubahan pada fail POM (Model Objek Projek, fail ini menerangkan keseluruhan struktur projek Maven), semuanya akan digunakan secara automatik pada projek itu. Perpustakaan akan diambil dari repositori tempatan kami jika kami sudah memilikinya, atau jika kami menggunakan beberapa kebergantungan baharu yang belum pernah kami tangani sebelum ini, Maven hanya akan memuat turunnya melalui Internet dari repositori pusat. Maven juga mempunyai fungsi untuk memuat turun sumber dan dokumentasi (Muat Turun Sumber dan/atau Dokumentasi). Ia juga sangat mudah, jika ada sesuatu yang tidak jelas dengan beberapa kelas atau kaedah, anda boleh pergi ke kod sumber dan melihat cara semuanya berfungsi di dalamnya. Mari tambahkan beberapa butiran. Ini akan menjadi aplikasi web dan kami akan menggunakan Tomcat . Untuk menggunakan aplikasi ke Tomcat, anda perlu memindahkannya ke sana dalam bentuk arkib perang (Sumber Aplikasi Web, format khas untuk aplikasi web). Untuk melakukan ini, tambahkan baris berikut pada fail POM supaya aplikasi disusun ke dalam arkib perang:
<packaging>war</packaging>
Nah, anda juga memerlukan direktori khas untuk sumber web, dalam kes kami akan ada halaman jsp dan beberapa sumber web. Mari buat maindirektori webapp. Ia harus dipanggil betul-betul dan terletak dengan maincara yang sama seperti java, resourceskerana ini ialah struktur direktori Maven standard. Sebaik sahaja kami telah memasang pakej wardan dengan itu menentukan bahawa ini adalah projek web, direktori webappakan ditandakan secara automatik sebagai sumber aplikasi Web (akan terdapat titik biru padanya) dan semua yang berkaitan dengan web akan dicari dalam folder ini. Dan seketika. Secara lalai, Maven menggunakan bahasa versi 1.5, tetapi saya mahu menggunakan, contohnya, versi 1.8 - Java 8 (Anda boleh mengambil 10, atau 11, tetapi masih tiada rancangan untuk menggunakan sebarang ciri dari sana, jadi biarkan ia 8 ). Ini boleh diselesaikan dengan mudah, kami menulis dalam Google sesuatu seperti "Maven java 8" dan melihat perkara yang perlu ditambahkan pada fail POM supaya Maven menyusun kelas kami untuk versi yang diperlukan. Akibatnya, kami mempunyai yang berikut: Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 3

Sambungan MVC musim bunga

Anda perlu bermula di suatu tempat. Menurut rancangan itu, kami akan menyambungkan pangkalan data dan menggunakan Hibernate, tetapi ini semua terdengar agak menakutkan buat masa ini. Kita perlu melakukan sesuatu yang lebih mudah dahulu. Spring MVC, ini sudah lebih baik, kami telah biasa dengan corak MVC untuk masa yang lama, ia digunakan dalam separuh daripada tugas besar kursus. Dari sini kita akan mula menari. Untuk mencipta aplikasi web dengan Spring MVC, kami juga memerlukan Servlet-API, i.e. perkara itu dengan bantuan interaksi permintaan-tindak balas akan berlaku. Mari cuba sambungkan ini. Kami pergi ke Google, cari kebergantungan yang diperlukan dalam repositori Maven dan tambahkannya pada fail pom.xml. Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 4Dalam bahagian Perpustakaan Luaran anda boleh melihat bahawa bukan sahaja spring-webmvc telah dimuatkan , tetapi juga sekumpulan perkara lain. Itu. kami tidak perlu menambahkan kebergantungan untuk teras spring , context , beans , dsb. yang kami perlukan, semua yang kami perlukan telah dikeluarkan bersama spring-webmvc .

Kita perlu membuat penafian kecil. Ia biasanya disyorkan untuk masih menambah kebergantungan secara berasingan untuk setiap pustaka yang digunakan, walaupun ia telah digabungkan dengan yang telah ditambahkan, kerana ini boleh membantu mengelakkan beberapa masalah dan gangguan.

Contoh mudah. Katakan kami menambah kebergantungan yang menggunakan beberapa API, dan pada masa yang sama ia akan menarik beberapa jenis pelaksanaan untuk API ini. Dan kemudian kami menambah satu lagi kebergantungan yang menggunakan API yang sama dan juga menarik beberapa pelaksanaannya untuk ini, tetapi kali ini ia berbeza. Oleh itu, kita akan mempunyai 2 pelaksanaan berbeza API yang sama. Dan jika kita sendiri ingin menggunakan beberapa kaedah API ini di suatu tempat, maka masalah akan timbul, kerana sistem tidak akan tahu pelaksanaan yang mana untuk digunakan, ia akan memilih secara rawak, mungkin bukan yang kita harapkan. Dan jika anda secara eksplisit menyatakan pergantungan untuk salah satu pelaksanaan, maka keutamaan akan diberikan kepadanya.

Walau bagaimanapun, ini bukanlah syor yang begitu ketat; ia digunakan terutamanya untuk projek besar di mana banyak perpustakaan berbeza daripada syarikat yang berbeza digunakan. Kami tidak akan melakukannya di sini, supaya tidak memuatkan fail POM terlalu banyak; tiada masalah dijangka. Tetapi bagaimanapun, ia masih bernilai mengingati perkara ini.

Satu nota lagi. Apakah maksud providedbergantung javax.servlet-api? Skop ialah skop kebergantungan, providedyang bermaksud bahawa kebergantungan akan tersedia pada peringkat menyusun dan menguji aplikasi, tetapi ia tidak akan diarkibkan. Hakikatnya ialah untuk menggunakan aplikasi kami akan menggunakan bekas servlet, Tomcat, dan ia sudah mempunyai perpustakaan sedemikian di dalamnya, jadi tidak perlu memindahkannya ke sana dan membebankan arkib dengan beban yang tidak perlu. Melihat ke hadapan, atas sebab yang sama kita akan lakukan tanpa kaedah biasa main, kerana ia sudah wujud di dalam Tomcat.

Mencipta Halaman dan Pengawal

Mari cuba memasak sesuatu yang mudah sekarang. Mula-mula, mari kita buat webappdirektori tambahan, sebagai contoh pages, di mana pandangan kita akan disimpan, i.e. jsp, dan buat beberapa halaman. Kami memerlukan halaman yang pada masa hadapan senarai filem akan dipaparkan, sebagai contoh films.jsp, dan mungkin kami boleh membuat halaman berasingan untuk diedit, biarlah editPage.jsp. Kami tidak akan mengisinya dengan perkara yang serius buat masa ini; hanya untuk ujian, kami akan membuat pautan pada satu halaman ke halaman yang lain. Sekarang kita memerlukan kelas yang akan memproses permintaan, i.e. pengawal. Mari tambah pakej baru controllerdan buat kelas di dalamnya FilmController(secara umum, tidak perlu membungkus segala-galanya dalam pakej yang berbeza, aplikasi ini akan menjadi sangat kecil dan mudah, tetapi dalam projek biasa boleh terdapat banyak pengawal, kelas konfigurasi, model , dsb., jadi walaupun bermula dengan projek kecil, adalah lebih baik untuk segera membiasakan diri melakukan segala-galanya dengan teratur dan tersusun supaya tidak berlaku sebarang kekacauan). Dalam kelas ini kami akan mencipta kaedah yang akan mengembalikan pandangan kami sebagai tindak balas kepada permintaan.
package testgroup.filmography.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class FilmController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        return modelAndView;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public ModelAndView editPage() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        return modelAndView;
    }
}
Apa gunanya? Spring MVC mempunyai perkara yang dipanggil DispatcherServlet. Ini adalah seperti pengawal utama, semua permintaan masuk melaluinya dan kemudian menghantarnya kepada pengawal tertentu. Anotasi @Controllerhanya memberitahu Spring MVC bahawa kelas ini ialah pengawal (baik, logik secara umum), penghantar akan menyemak anotasi @RequestMappinguntuk memanggil kaedah yang sesuai. Anotasi @RequestMappingmembolehkan anda menetapkan alamat untuk kaedah pengawal, yang mana ia akan tersedia dalam klien (pelayar). Ia juga boleh digunakan pada kelas pengawal untuk menetapkan, boleh dikatakan, alamat akar untuk semua kaedah. allFilms()Parameter untuk kaedah valueditetapkan kepada " /", jadi ia akan dipanggil serta-merta apabila gabungan http://host:port/ dimasukkan dalam penyemak imbas (iaitu, secara lalai ia adalah http://localhost:8080/ atau http ://127.0 .0.1:8080/ ). Parameter methodmenentukan jenis permintaan yang disokong (GET, POST, PUT, dll.). Oleh kerana di sini kami hanya menerima data, GET digunakan. Kemudian, apabila kaedah untuk menambah dan menyunting muncul, permintaan POST sudah ada. (Dengan cara ini, bukannya anotasi @RequestMappingyang menunjukkan kaedah, anda boleh menggunakan anotasi @GetMapping, @PostMappingdsb. @GetMappingsecara bersamaan @RequestMapping(method = RequestMethod.GET)). Dalam kaedah kami, kami mencipta objek ModelAndViewdan menetapkan nama pandangan yang perlu dikembalikan.

Konfigurasi

Mari kita teruskan untuk menyediakan konfigurasi. configMari buat kelas dalam pakej WebConfig. Ia akan mempunyai hanya satu kaedah yang mengembalikan objek jenis ViewResolver, ini adalah antara muka yang diperlukan untuk mencari perwakilan mengikut nama.
package testgroup.filmography.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "testgroup.filmography")
public class WebConfig {

    @Bean
    ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}
@Configurationmemberitahu Spring bahawa kelas ini ialah kelas konfigurasi dan mengandungi takrifan dan kebergantungan beankomponen. Kacang ialah objek yang diuruskan oleh Spring. Anotasi digunakan untuk mentakrifkan kacang @Bean. @EnableWebMvcmembolehkan anda mengimport konfigurasi Spring MVC daripada fail WebMvcConfigurationSupport. Anda juga boleh melaksanakan, sebagai contoh, antara muka WebMvcConfigureryang mempunyai banyak kaedah, dan menyesuaikan segala-galanya mengikut keinginan anda, tetapi kami tidak perlu melakukannya lagi, tetapan standard sudah memadai. @ComponentScanmemberitahu Spring di mana untuk mencari komponen yang harus diuruskannya, i.e. kelas yang ditandakan dengan anotasi @Componentatau terbitannya seperti @Controller, @Repository, @Service. Anotasi ini mentakrifkan kacang kelas secara automatik. Dalam kaedah tersebut, viewResolver()kami mencipta pelaksanaannya dan menentukan tempat tepat untuk mencari perwakilan dalam webapp. Oleh itu, apabila dalam kaedah pengawal kami menetapkan nama " films" paparan akan ditemui sebagai " /pages/films.jsp" Jadi, kami mempunyai kelas konfigurasi, tetapi buat masa ini ia hanyalah sejenis kelas berasingan, ia tidak menjejaskan aplikasi kami dalam apa cara sekalipun . Kita perlu mendaftarkan konfigurasi ini dalam konteks Spring. Untuk ini anda memerlukan kelas AbstractAnnotationConfigDispatcherServletInitializer. Dalam pakej, configkami mencipta penggantinya, katakan AppInitializer , dan melaksanakan kaedahnya.
package testgroup.filmography.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
Kaedah terakhir mendaftarkan alamat dan terdapat 2 lagi kaedah untuk mendaftar kelas konfigurasi. Konfigurasi web, di mana ViewResolver's dan seumpamanya ditakrifkan, diletakkan dalam getServletConfigClasses(). Adalah lebih baik untuk membaca tentang semua ini dalam dokumentasi dan pelbagai panduan, tetapi dalam kes kami, anda tidak perlu menyelidiki perkara ini lagi, kami, WebConfigpada dasarnya, boleh RootClassesditakrifkan dalam kedua-duanya, anda juga boleh menentukan kedua-duanya sekaligus, ia masih akan berfungsi . Satu perkara lagi. Mungkin terdapat masalah dengan pengekodan apabila, apabila menghantar nilai dengan aksara Rusia dari borang, hasilnya akan menjadi coretan. Untuk menyelesaikan masalah ini, kami akan menambah penapis yang akan mempraproses permintaan. Kami pergi ke kelas AppInitializer dan mengatasi kaedah getServletFilters, di mana kami menunjukkan pengekodan yang diingini, ia, sudah tentu, harus sama seperti di tempat lain, seperti pada halaman dan dalam pangkalan data:
protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] {characterEncodingFilter};
    }
Nah, semuanya nampaknya telah disediakan, anda boleh cuba menjalankannya dan lihat apa yang berlaku. Jalankan -> Jalankan -> Edit Konfigurasi -> Tambah Konfigurasi Baharu -> Pelayan Tomcat -> Tempatan Seterusnya, anda perlu memilih artifak untuk digunakan. Idea itu sendiri akan memberi petunjuk Amaran: Tiada artifak ditandakan untuk digunakan . Klik butang betulkan dan pilih ...: perang meledak . Atau anda boleh pergi ke Deployment -> add -> Artifact -> ...: war exploded . Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 5Dan anda juga perlu pergi ke Deployment dan tetapkan medan konteks Applecation (ini akan menjadi sebahagian daripada alamat url di mana aplikasi akan tersedia dalam penyemak imbas) kepada " /". Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 6Kemudian aplikasi kami akan tersedia serta-merta di http://localhost:8080/ (tetapi anda juga boleh menentukan sesuatu di sana, contohnya " /filmography", dan kemudian anda hanya perlu menambah ini pada semua alamat, contohnya, tidak akan ada " http://localhost:8080/edit" , tetapi ia akan menjadi "http://localhost:8080/filmography/edit" ). Klik Jalankan dan tunggu sehingga ia bermula. Inilah yang saya dapat: Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 7Semuanya nampak baik-baik saja, tetapi ada satu kaveat. Hakikatnya ialah halaman kami kini boleh diakses secara umum dan boleh diakses terus dengan menulis laluan dalam bar alamat. Kami memasukkan http://localhost:8080/pages/films.jsp dan kini kami telah menerima halaman kami tanpa pengetahuan pengawal. Entah bagaimana ini tidak begitu betul, jadi kami akan mencipta webappdirektori khas WEB-INF. Apa yang ada di dalamnya akan disembunyikan daripada orang ramai dan hanya boleh diakses melalui pengawal. Kami meletakkan direktori dengan pandangan kami ( pages) dalam WEB-INF, dan ViewResolverdengan itu menambahnya pada awalan:
viewResolver.setPrefix("/WEB-INF/pages/");
Kini kami mendapat halaman kami di http://localhost:8080 , tetapi jika kami mencuba terus ke http://localhost:8080/WEB-INF/pages/films.jsp, kami mendapat ralat 404. Baiklah, kami mempunyai aplikasi web paling mudah, Hello World seperti yang mereka katakan. Struktur projek pada masa ini kelihatan seperti ini:
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 8

Model

Kami sudah mempunyai pandangan dan pengawal, tetapi dalam MVC juga terdapat huruf ke-3, jadi untuk melengkapkan gambar kami juga akan menambah model. Dalam pakej, modelmari buat kelas Film, sebagai contoh, dengan medan berikut: int id, String title(tajuk), int year(tahun keluaran), String genre(genre) dan boolean watched(iaitu adakah anda sudah menonton filem ini atau tidak).
package testgroup.filmography.model;

public class Film {
    private int id;
    private String title;
    private int year;
    private String genre;
    private boolean watched;
// + Getters and setters
}
Tiada apa-apa yang istimewa, hanya kelas biasa, medan peribadi, getter dan setter. Objek kelas sedemikian juga dipanggil POJO(Objek Java Lama Biasa), baik, i.e. "objek java mudah". Mari kita cuba mencipta objek sedemikian dan memaparkannya pada halaman. Buat masa ini, kami tidak akan terlalu bimbang tentang cara mencipta dan memulakannya. Untuk mencubanya, mari kita buat secara bodoh terus dalam pengawal, contohnya, seperti ini:
public class FilmController {
    private static Film film;

    static {
        film = new Film();
        film.setTitle("Inception");
        film.setYear(2010);
        film.setGenre("sci-fi");
        film.setWatched(true);
    }
Dan tambahkan objek ini kepada kami ModelAndViewmenggunakan kaedah addObject:
@RequestMapping(method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        modelAndView.addObject("film", film);
        return modelAndView;
    }
Sekarang kita boleh memaparkan objek ini pada halaman kita. Sebagai films.jspganti Hello World kami akan menulis ${film}dan objek yang sepadan dengan nama atribut " film" akan digantikan di sini. Mari cuba jalankannya dan lihat apa yang berlaku (untuk keluaran jelas objek, kelas Filmtelah ditakrifkan semula toString()):
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 9

Model-View-Controller

Pada peringkat ini, kami nampaknya sudah mempunyai aplikasi Spring MVC sepenuhnya. Sebelum meneruskan, adalah baik untuk melihat segala-galanya sekali lagi dan memikirkan cara semuanya berfungsi. Di Internet anda boleh menemui banyak gambar dan gambar rajah tentang ini, saya suka yang ini:
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 10
Apabila kami menulis permintaan dalam baris penyemak imbas, ia diterima Dispatcher Servlet, kemudian ia mencari pengawal yang sesuai untuk memproses permintaan ini menggunakan HandlerMapping(ini adalah antara muka untuk memilih pengawal, semak pengawal yang tersedia yang mempunyai kaedah yang menerima alamat sedemikian) , memanggil kaedah yang sesuai dan Controllermengembalikan maklumat tentang paparan, kemudian penghantar mencari paparan yang dikehendaki mengikut nama menggunakan ViewResolver'a, selepas itu data model dipindahkan ke paparan ini dan kami mendapat halaman kami sebagai output. Sesuatu seperti ini. Bersambung... Memperkenalkan Maven, Spring, MySQL, Hibernate dan aplikasi CRUD pertama (bahagian 1) Memperkenalkan Maven, Spring, MySQL, Hibernate dan aplikasi CRUD pertama (bahagian 2) Memperkenalkan Maven, Spring, MySQL, Hibernate dan aplikasi CRUD pertama (bahagian 3) Pengenalan kepada Maven, Spring, MySQL, Hibernate dan aplikasi CRUD pertama (bahagian 4)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION