JavaRush /Java Blog /Random-ID /Penaklukan Sepatu Musim Semi
Surplus
Level 37
Москва

Penaklukan Sepatu Musim Semi

Dipublikasikan di grup Random-ID
Selamat siang, pembaca yang budiman! Dan senang bertemu dengan Anda, meskipun nama yang sombong adalah alasan utama untuk membahas topik sederhana tentang perkenalan pertama dengan pengembangan Spring Boot. Saya ingin berbagi pengalaman saya menyelesaikan tugas pengantar magang di portal JavaRush, menyajikan gambaran dari sisi seorang mahasiswa teknik biasa yang ingin menguji kekuatan dari akumulasi pengetahuannya. Sepatu Musim Semi Penaklukan - 1Saya sama sekali tidak menyangkal kemungkinan adanya kekasaran dalam kode atau metode berpikir yang terlampir, dan saya menerima kritik yang membangun, karena berkat “benjolan dan lebam” dimungkinkan untuk berkembang ke arah profesional. Selain itu, saya sama sekali tidak berpura-pura menjadi "obat mujarab" dalam menyelesaikan kondisi tertentu dan dengan sengaja menghilangkan bagian-bagian tertentu dari program, meninggalkan pentingnya masuk ke topik yang relatif kompleks tanpa konsekuensi sedikit pun bagi sistem saraf. Memang benar, gegabah untuk menyangkal hal yang sudah jelas: itu sulit bagi saya dan sama sekali tidak ada yang jelas sampai saat tertentu. Dan jika Anda mengalami perasaan serupa sejak pertemuan pertama dengan tugas tersebut, maka “Selamat datang!” Mari kita menulis aplikasi web di Spring Boot menggunakan analogi sederhana dari tes masuk magang menggunakan mesin template Thymeleafdan querykueri ke server MySQL lokal untuk memfilter rangkaian informasi yang masuk. Jadi mari kita mulai!

sepatu bot musim semi. Hewan apa itu dan bagaimana cara memasaknya?

Singkatnya dan ringkas, ini adalah alat luar biasa dari Pivotel untuk menghemat waktu berharga dalam proses pembuatan aplikasi, menghilangkan kebutuhan untuk menghubungkan perpustakaan pihak ketiga secara langsung, menulis kanvas pemetaan dan servlet yang mengesankan. Cukup menggunakan pembuat Spring Initializr , yang diintegrasikan ke dalam IntelliJ IDEA Ultimate Edition (File - New - Project... - Spring Initializr) atau terletak di layanan web start.spring.io , menentukan paket yang akan disertakan dari berbagai macam penawaran.
Sepatu Musim Semi Penaklukan - 2
Mengikuti spesifikasi teknis yang dikemukakan, kami akan menggunakan set pria, standar untuk membuat aplikasi web sederhana menggunakan database MySQL :
  • WEB adalah komponen utama untuk mengembangkan aplikasi web, termasuk server lokal Apache Tomcat di alamat standar localhost:8080 dan kerangka universal Spring MVC.

  • DevTools - digunakan untuk memulai ulang aplikasi dengan cepat di JVM panas ketika perubahan terdeteksi dalam kode atau templat yang dikompilasi; Selain itu, ini membebaskan Thymeleaf dari membersihkan cache jika mesin yang dipilih disertakan dalam proyek.

  • JPA adalah teknologi yang diperlukan untuk bekerja dengan database dan menyediakan pemetaan objek-relasional objek Java, menyediakan API ( Hibernate dalam kasus kami) untuk mengelola, menyimpan, dan mengambil entitas.

  • Thymeleaf (Mustache, AngularJS, Vaadin dan seterusnya) - mesin template untuk visualisasi aplikasi; Berkat keakraban saya dengan prinsip-prinsip html, saya memilih Thymeleaf, yang mendorong bahasa ini menjadi landasan dunia.

  • MySQL - menghubungkan driver Konektivitas Basis Data Java untuk menjalankan kueri SQL terhadap basis data.
Setelah pemilihan akhir komponen dan pembuatan, kami mendapatkan arsitektur aplikasi web biasa dengan direktori yang siap untuk diisi lebih lanjut. Fragmen untuk berinteraksi dengan bagian visual, baik itu gaya grafis CSS, halaman HTML standar, atau fungsionalitas JavaScript, harus ditempatkan di "sumber daya", dan oleh karena itu, komponen back-end dimaksudkan untuk ditempatkan di "java". Kita juga harus memperhatikan file pom.xml di rentang root, yang menyimpan struktur proyek dan ketergantungan antar komponen. Jika Anda ingin memperluas fungsionalitas dengan paket tambahan atau menghapus hal-hal yang tidak perlu, maka Anda harus melakukan manipulasi antar tag <dependencies></dependencies>menggunakan metode serupa.
Sepatu Musim Semi Penaklukan - 3

Langkah pertama menuju masa depan yang cerah

Selanjutnya muncul pertanyaan yang cukup menarik dan cukup logis: “Apa yang harus dilakukan sekarang? Bagaimana cara kerjanya? Program ini dibangun berdasarkan prinsip Model-View-Controller: program ini mengatur pembacaan entitas dari database yang terhubung (Model) dan ditampilkan di antarmuka pengguna dengan kontrol (View); komunikasi antar komponen dan pelaksanaan tindakan sesuai dengan permintaan yang dikirimkan dilakukan berkat Pengendali. Penciptaan elemen-elemen kunci itulah yang berfungsi sebagai titik acuan untuk pengembangan berkelanjutan. Untuk menghindari lereng licin dan menjaga rasa hormat dari rekan kerja Anda, Anda harus menempatkan komponen di direktori yang sesuai (misalnya, letakkan file Controller di folder controllers di cabang "java") dan simpan dengan hati-hati. ketertiban di tempat kerja.

Esensi adalah bagian kecil dalam mekanisme besar

Atau dengan kata lain Model kita sesuai dengan kondisi yang ditetapkan dalam permasalahan. Berangkat dari topik diskusi dan kembali ke proyek pengantar, kami dapat dengan yakin menyatakan bahwa ada perbedaan minimal antara tugas dan berpegang pada konsep rata-rata dalam tinjauan lebih lanjut. Katakanlah, catatan di buku catatan, antara lain:
  • Nomor identifikasi untuk menentukan lokasi pada arus umum;
  • Pesan teks dengan sejumlah karakter tertentu;
  • Tanggal pengguna menambahkannya ke daftar umum;
  • Variabel Boolean untuk menentukan “Selesai atau belum selesai” (“Baca atau tidak baca”).
Oleh karena itu, mari buat kelas Note di direktori bernama "entitas" dan tambahkan kolom yang sesuai:
@Entity
public class Note {

   @Id
   @GeneratedValue
   private int id;
   private String message;
   private Date date;
   private boolean done;

   public Note() {
   }

   public Note(String message) {
       this.message = message;
       this.date = new Date();
       this.done = false;
   }
}
Penyimpangan lain dari topik diskusi untuk pemahaman yang lebih baik tentang apa yang terjadi dari sudut pandang teoritis. Koneksi antar komponen di Spring ditentukan oleh anotasi - penunjuk khusus di depan objek, yang masing-masing memainkan peran tertentu dalam mekanisme dan dimulai dengan simbol “@”. Anotasi @Entity menunjukkan ke Spring Boot bahwa data kelas berikutnya adalah milik "Entity", dan @Id dan @GeneratedValue menentukan bidang yang dipilih sebagai pengidentifikasi dengan pembuatan iterator otomatis saat memproses serangkaian informasi. Saya sengaja menghilangkan penambahan Getter dan Setter standar untuk meningkatkan kekompakan format visual. Selanjutnya, dengan mempertimbangkan penggunaan database untuk menyimpan catatan, kita melanjutkan ke langkah berikutnya dalam pengembangan aplikasi: kita akan membuat antarmuka NoteRepository di direktori "repositori", elemen penghubung dalam rantai pertukaran, dan mewarisi sebagian besar repositori yang cocok untuk pekerjaan lebih lanjut, menunjukkan entitas yang disimpan dan iterator bilangan bulat untuk diakses.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
Sebenarnya, itu saja. Singkat dan padat. Sekarang Spring Boot akan menggunakan komponen yang dibuat untuk mengatur interaksi dengan database. Terdapat relatif banyak jenis repositori lama dengan potensi tindakan yang berbeda-beda. JpaRepository berada di peringkat teratas dan memiliki potensi paling besar, termasuk CrudRepository dan PageAndSortingRepository di bawahnya. Kami tidak akan melangkah lebih jauh dan menyimpang dari topik, karena beberapa seluk-beluknya dapat ditemukan di situs web Pivotel dalam dokumentasi teknis. Sekarang, setelah mengimplementasikan gambar data dan menentukan metode komunikasi di sisi aplikasi, Anda perlu memperhatikan pembuatan database MySQL di lingkungan eksternal yang sesuai "MySQL Workbench", yang sudah diinstal sebelumnya pada platform desktop dalam perakitan dari pengembang resmi dengan paket tambahan untuk membuat server lokal:
Sepatu Musim Semi Penaklukan - 4
Selanjutnya, mengikuti instruksi lingkungan setelah mengklik ikon dengan server lokal saat ini di jendela utama, kita membuat diagram tabel sesuai dengan bidang entitas kita (Catatan) dan mengisinya dengan data yang sesuai. Penting untuk mengklarifikasi secara terpisah seluk-beluk dialek MySQL, yang sangat memerlukan perhatian agar berhasil mencapai hasil yang diinginkan:
  • Tidak ada tipe Boolean yang terpisah. Setiap tindakan pemrosesan permintaan akan mengkonversi “benar” atau “salah” ke nilai bit “1” atau “0”, masing-masing;
  • Tanggal disimpan seluruhnya dalam tipe Timestamp. Jika Anda menggunakan Tanggal, yang sudah familiar pada intinya, Anda harus membatasi diri Anda hanya pada posisi di kalender.
Menaklukkan Sepatu Musim Semi - 5
Setelah langkah persiapan selesai, kami menunjukkan "MySQL Workbench" untuk mengirim data ke server lokal dengan mengklik ikon "petir" pada toolbar. Sekarang, jika penambahan informasi telah diselesaikan dengan benar, kita dapat dengan yakin kembali ke IDE asli kita untuk melanjutkan pengembangan dengan menambahkan konfigurasi database saat ini ke application.properties (biasanya terletak di direktori “resources”):
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
Dan terakhir mengikat entitas Note ke MySQL menggunakan anotasi. @Table menunjukkan penggunaan tabel dengan nama dan skema yang dipilih, dan @Column menunjukkan bahwa variabel termasuk dalam bidang tertentu.
@Entity
@Table(name = "test", schema = "test", catalog = "")
public class Note {

   @Id
   @GeneratedValue
   private int id;
   @Column(name = "message")
   private String message;
   @Column(name = "date")
   private Date date;
   @Column(name = "done")
   private boolean done;

   public Note() {
   }

   public Note(String message) {
       this.message = message;
       this.date = new Date();
       this.done = false;
   }
}

Tampilan atau antarmuka pengguna

Sayangnya, kita dapat dengan aman mengatakan hal berikut: “Visualisasi aplikasi akan menjadi batu sandungan utama tanpa pengetahuan teoretis atau praktis sedikit pun.” Sejujurnya, komponen front-end menghabiskan banyak sekali pekerjaan dan membuat saya gelisah dalam jangka waktu yang lama. Namun berkat kesederhanaan Thymeleaf yang luar biasa, kompromi yang cocok dapat ditemukan setelah serangkaian kekalahan yang mempesona. Pembahasan lebih lanjut akan membahas seluk-beluk penggunaan mesin yang dipilih, meskipun konsep umumnya menganut posisi serupa. Teknik utamanya adalah kemampuan untuk menggunakan HTML paling murni dan merakit tampilan akhir dari masing-masing fragmen untuk menghindari pengulangan berulang pada bagian yang identik. Anggaplah arsitektur UI terdiri dari halaman utama yang terdiri dari bilah navigasi dengan kontrol (menambahkan entri baru, kembali ke halaman utama) dan tabel dinamis untuk menampilkan entitas yang diurutkan berdasarkan waktu penambahan catatan dalam urutan menaik (ASC) atau arah penurunan (DESC). Mari kita ambil sebagai standar tampilan semua catatan dalam urutan menaik. Menurut kebijakan hierarki mesin templat yang dipilih, elemen visualisasi komponen harus ditempatkan di cabang “templat” di direktori “sumber daya”. Oleh karena itu, manipulasi lebih lanjut dengan komponen mempertimbangkan kondisi yang diajukan. Mari kita buat halaman utama dengan nama “index” (atau nama lain sesuai preferensi pribadi) pada template html5. Misalnya:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/head :: head"></head>
<body>
<div class="container">
   <div th:replace="fragments/header :: header"></div>
   <div th:if="${not #lists.isEmpty(notes)}">
       <div th:replace="operations/list :: notebook"></div>
   </div>
   <div th:replace="fragments/footer :: footer"></div>
</div>
</body>
</html>
Jadi, mari kita uraikan komponen utama aplikasi akhir. Thymeleaf menggunakan sintaks terpisah untuk menunjukkan penggunaan prosedur dan dimulai dengan kata kunci “th:”, tautan ke perpustakaan yang harus disertakan dalam tag <html> pembuka.
<div th:if="${not #lists.isEmpty(notes)}">
Operasi "jika" sama sekali tidak berbeda dari cara biasa melakukan sesuatu dan memeriksa atribut "catatan" yang masuk untuk mengetahui keberadaan objek untuk tampilan lebih lanjut. Perlu disebutkan secara terpisah tumpang tindih topik dengan penggunaan Pengontrol, dengan mempertimbangkan penggunaannya untuk mengatur interaksi model dan visualisasi. Banyak momen samar yang terbentuk di masa depan, kembalilah jika Anda mau.
<head th:replace="operations/list :: notebook"></head>
Operasi "ganti" menunjukkan penggantian "rintisan" atau blok aktif dengan fragmen yang dipilih dari halaman saat ini atau halaman terpisah - kasus terakhir diamati dengan jelas dalam contoh. Kami menyalin fragmen bernama “notebook” dari “list.html” dari direktori “operations” ke dalam <div></div> dari file “index”, sepenuhnya menggantikan konten di tujuan akhir. Yang keluar memiliki konten berikut:
<!DOCTYPE html>
<!--suppress ALL -->
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">

<div th:fragment="notebook">
   <table class="table table-bordered table-hover horizontal-align">
       <thead>
       <tr>
           <th style="width: 5%">#</th>
           <th style="width: 60%">Message</th>
           <th class="dropdown" style="width: 20%">Date
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}"><i class="fa fa-chevron-circle-up"></i></a>
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'DESC')}"><i class="fa fa-chevron-circle-down"></i></a>
           </th>
           <th style="width: 5%">Done</th>
           <th style="width: 5%">Edit</th>
           <th style="width: 5%">Delete</th>
       </tr>
       </thead>
       <tbody>
       <tr th:each="note : ${notes}">
           <td th:text="${note.id}" style="text-align: center">#</td>
           <td th:text="${note.message}">Message</td>
           <td th:text="${#dates.format(note.date, 'EEE, d MMM yyyy HH:mm')}" style="text-align: center">Date</td>
           <td style="text-align: center">
               <i th:if="${note.done} == true" class="fa fa-plus-square-o" style="font-size:20px;color:#337ab7"></i>
               <i th:if="${note.done} == false" class="fa fa-minus-square-o" style="font-size:20px;color:#337ab7"></i>
           </td>
           <td style="text-align: center"><a th:href="@{'/edit/{id}'(id=${note.id})}"><i class="fa fa-edit" style="font-size:20px"></i></a></td>
           <td style="text-align: center"><a th:href="@{'/delete/{id}'(id=${note.id})}"><i class="fa fa-trash" style="font-size:20px"></i></a></td>
       </tr>
       </tbody>
   </table>
</div>
</html>
Mari kita kembali ke tinjauan konstruktif dan menelusuri fungsi Thymeleaf yang digunakan secara berurutan, menghilangkan sintaks HTML standar atau gaya grafis yang digunakan, dan berfokus secara khusus pada pemahaman mekanisme mesin templat.
<div th:fragment="notebook">
Operasi "fragmen" menentukan nama fragmen dan memungkinkan penggunaan konten blok untuk perintah "ganti". Lebih-lebih lagi! Berbagai kegunaan dalam satu halaman sama sekali tidak dikecualikan, sekali lagi mengedepankan analogi dengan prosedur atau fungsi dalam bahasa pemrograman.
<a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}">
Panggilan ke anotasi @PostMapping digunakan di Kontroler dengan pemetaan “/sort/{sortDate}”, dengan {sortDate} adalah atribut arah pengurutan keluar. Hal serupa dapat dilihat di blok berikut, yang menambahkan perubahan dinamis bergantung pada posisi elemen yang dipilih pengguna dalam loop iterasi:
<a th:href="@{'/edit/{id}'(id=${note.id})}">
<tr th:each="note : ${notes}">
Menghitung nilai sangat mirip dengan penggunaan blok for dalam sintaks Java: variabel “note” mengambil elemen saat ini dari array atribut input ${notes}—sebuah array entitas—dan digunakan untuk mengubah nilai nanti. Sejujurnya, kami dapat mendedikasikan artikel terpisah untuk mencantumkan berbagai kemampuan Thymeleaf dengan contoh penerapan praktis - mesin template sangat sederhana dan tidak memerlukan pembelajaran sama sekali tentang sintaks tambahan yang mengesankan. Fungsi-fungsi yang dijelaskan di atas diuraikan dalam dokumentasi teknis di situs resmi pengembang dan sangat penting dalam mengatur komunikasi dengan back-end. Oleh karena itu, Anda dapat dengan percaya diri melanjutkan ke bagian berikutnya dan terakhir. Tentunya dengan melampirkan sisa komponen visualisasi pada link ke aplikasi yang sudah selesai di akhir artikel.

Pengendali, administrator di sebuah perusahaan kecil

“Landasan dalam arsitektur aplikasi web” - mungkin tidak ada cara untuk menemukan deskripsi yang lebih akurat tentang pentingnya komponen Pengontrol dalam mengatur kerja program: sebagian besar operasi dilakukan secara tepat oleh elemen penghubung antara model dan tampilan. Berkat mekanisme tindakan Spring Boot, Anda dapat dengan percaya diri menggunakan metode pemetaan dan permintaan GET/POST tanpa masalah sedikit pun, dan secara otomatis menghubungkan repositori data. Mari kita buat kelas NoteController dalam file terpisah di direktori “controllers”, sekali lagi mengacu pada penggunaan anotasi yang sesuai:
@Controller
public class NoteController {

   private NoteService service;

   @Autowired
   public void setNoteService(NoteService service) {
       this.service = service;
   }

   @GetMapping("/")
   public String list(Model model) {
       return "index";
   }
}
Perhatian yang cermat mungkin melihat perubahan penting dalam desain arsitektur aplikasi yang terkait dengan penambahan layanan untuk mengisolasi logika bisnis dari bekerja dengan layanan manajemen database. Tindakan yang telah selesai diperlukan untuk meningkatkan keserbagunaan produk jadi dan memberikan cakupan luas untuk mengubah fungsionalitas antarmuka pengguna tanpa memerlukan perubahan metode komunikasi dengan database. Representasi standar sama sekali tidak menonjol dari representasi serupa: antarmuka terletak di direktori terpisah dan diimplementasikan oleh kelas dengan anotasi @Service untuk deteksi Spring Boot:
public interface NoteService {
   Note getNoteById(Integer id);
   void saveNote(Note note);
   void updateNote(Integer id, String message, boolean done);
   void deleteNote(Integer id);
   List<Note> findAll();
}

@Service
public class NoteServiceImpl implements NoteService{

   private NoteRepository repository;

   @Autowired
   public void setProductRepository(NoteRepository repository) {
       this.repository = repository;
   }

   @Override
   public Note getNoteById(Integer id) {
       return repository.findOne(id);
   }

   @Override
   public void saveNote(Note note) {
       repository.save(note);
   }

   @Override
   public void updateNote(Integer id, String message, boolean done) {
       Note updated = repository.findOne(id);
       updated.setDone(done);
       updated.setMessage(message);
       repository.save(updated);
   }

   @Override
   public void deleteNote(Integer id) {
       repository.delete(id);
   }

   @Override
   public List<Note> findAll() {
       return repository.findAll();
   }
}
Mari kita kembali meninjau pengontrol dan melihat seluk-beluk pengorganisasian pekerjaan menggunakan metode Spring Boot. Anotasi @Autowired menunjukkan kebutuhan untuk secara otomatis mengikat layanan ke variabel tertentu dari tipe yang sesuai dan membuat koneksi dengan database. Perhatian lebih harus diberikan pada cara tampilan berkomunikasi, yang ditunjukkan oleh anotasi @GetMapping("/"), yang mengembalikan halaman bernama “index” saat menerima panggilan ke localhost:8080. Anda dapat menggunakan pendekatan yang berbeda, menentukan deskripsi yang diperluas @RequestMapping(value = "/", method = RequestMethod.GET) atau mengganti tipe pengembalian dengan ModelAndView yang sudah jadi. Namun, berdasarkan pengalaman penerapan praktis saat ini, saya tidak melihat adanya perbedaan mendasar pada hasil akhir dan menggunakan opsi biasa. Mari perluas pengontrol dengan menambahkan elemen baru menggunakan tab tambahan. Setelah pengguna mengklik elemen bilah navigasi, @GetMapping("/new") dipanggil dan dialihkan ke halaman "baru" dari direktori "operasi", mengembalikan parameter bernama "pesan" saat mengonfirmasi data yang dimasukkan menggunakan tombol dan mengarahkan ke blok utama. Perlunya pencocokan lengkap nama variabel di jendela input dengan nama nilai yang ditransfer memerlukan perhatian khusus.
<input type="text" class="form-control" id="message" th:name="message" placeholder="Enter your note." maxlength="100"/>
@GetMapping("/new")
public String newNote() {
   return "operations/new";
}

@PostMapping("/save")
public String updateNote(@RequestParam String message) {
   service.saveNote(new Note(message));
   return "redirect:/";
}
Teknik serupa digunakan untuk memperbarui catatan. Setelah mengklik kontrol, pemetaan @GetMapping("/edit/{id}") dipanggil dan pengidentifikasi dari string URL ditransfer, atribut "note" ditambahkan dengan entri untuk pengeditan lebih lanjut. @RequestParam(nilai = "selesai", diperlukan = salah) boolean selesai) menentukan nilai tertentu memainkan peran kunci dalam penggunaan kotak centang saat menggunakan mesin templat Thymeleaf dan disetel ke "false" secara default.
@GetMapping("/edit/{id}")
public String edit(@PathVariable Integer id, Model model) {
   Note note = service.getNoteById(id);
   model.addAttribute("note", note);
   return "operations/edit";
}

@PostMapping("/update")
public String saveNote(@RequestParam Integer id, @RequestParam String message,
                      @RequestParam(value = "done", required = false) boolean done) {
   service.updateNote(id, message, done);
   return "redirect:/";
}
Menghapus item dari database sangatlah sederhana dan tidak memerlukan manipulasi signifikan dengan memanggil fungsi layanan yang sesuai menggunakan nilai yang diteruskan:
@GetMapping("/delete/{id}")
public String delete(@PathVariable Integer id) {
   service.deleteNote(id);
   return "redirect:/";
}
Sekarang mari kita membuat sedikit penyesuaian pada fragmen yang sudah selesai dan beralih ke komunikasi menarik dengan MySQL menggunakan kueri kueri di Spring Data JPA, secara terpisah menambahkan fungsi untuk mengelola pemfilteran sederhana sebelum menutup Kontroler.
@Controller
public class NoteController {

   private String sortDateMethod = "ASC";

   @GetMapping("/")
   public String list(Model model) {
       List<Note> notebook = filterAndSort();
       model.addAttribute("notes", notebook);
       model.addAttribute("sort", sortDateMethod);
       return "index";
   }

private List<Note> filterAndSort() {
   List<Note> notebook = null;
   switch (sortDateMethod) {
       case "ASC":
           notebook = service.findAllByOrderByDateAsc();
           break;
       case "DESC":
           notebook = service.findAllByOrderByDateDesc();
           break;
   }
   return notebook;
}

Kueri yang sangat kecil, namun sangat penting.

Memalukan untuk mengakui bahwa memfilter nilai, bertentangan dengan ekspektasi, ternyata menjadi batu sandungan lain dalam memenuhi tugas teknis, dengan percaya diri mengatasi ambang kompleksitas yang ditetapkan oleh penomoran halaman - memecah larik data menjadi halaman terpisah dengan ukuran tertentu untuk tampilan lebih lanjut. Kemungkinan besar, kelelahan yang terakumulasi mulai berdampak buruk, tapi... inspirasi datang setelah pertemuan yang tidak disengaja dengan kueri Query.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
Spring Data JPA menyediakan kemampuan untuk membuat kueri basis data yang sangat terperinci yang menghilangkan kebutuhan untuk menyortir informasi setelah diterima dan memiliki potensi aplikasi yang luas. Misalnya:
List<Note> findAllByOrderByDateAsc();
Metode ini akan dikonversi ke kueri SQL dan menampilkan semua catatan (findAll) yang diurutkan (berdasarkan Pesanan) berdasarkan tanggal (byDate) dalam urutan menaik (Asc). Selain itu, Anda dapat membuat kombinasi kompleks dan mengambil sampel di banyak bidang dengan satu persyaratan. Katakanlah, pilih semua catatan (findAll) yang diselesaikan (byDoneTrue) secara berurutan (berdasarkan Pesanan) menurun (Des) berdasarkan nilai tanggal (berdasarkan Tanggal):
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

Kesimpulan atau pengakuan lain dari seorang programmer pemula

Semua! Anda dapat meluncurkan aplikasi web dengan aman menggunakan kombinasi Shift+F10 atau dengan mengklik ikon yang sesuai. Spring Boot akan membangun program di Apache Maven dan menginstal server Apache Tomcat lokal di localhost:8080. Sekarang Anda hanya perlu mengikuti tautan di browser apa pun.
Sepatu Musim Semi Penaklukan - 6
Dan, tentu saja, mengembangkan metodologi untuk memenuhi kebutuhan bisnis lainnya. Potensi aplikasi dibatasi oleh usaha, akal, dan imajinasi pengembang.
Sepatu Musim Semi Penaklukan - 7
Berterus terang dan memperhatikan jalur yang ditempuh, saya berulang kali yakin akan kebenaran arah yang dipilih dan menyadari manfaat belajar di portal pendidikan JavaRush. Berkat berbagai tugas praktis, minat yang memikat dalam mempelajari pemrograman dapat dikembalikan, yang telah sepenuhnya ditekan dalam program yang ketinggalan jaman dan sangat membosankan dari lembaga pendidikan tinggi dengan arah yang sama. Empat bulan mempelajari materi secara aktif dalam tumpukan teknologi back-end menginvestasikan lebih banyak pengetahuan dibandingkan dengan menghadiri kuliah dan kelas laboratorium selama bertahun-tahun. Percaya atau tidak. Saya harap kalian tidak menyerah pada kesulitan memasuki materi yang kompleks, karena melalui mengatasi rintangan kita menjadi lebih baik dan berkembang secara profesional dan pribadi. Saya harap cerita kecil ini membantu saya menemukan beberapa ide baru untuk menggunakan alat luar biasa yang disebut SpringBoot. PS Github .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION