Kata pengantar
Templet JDBC Spring adalah enkapsulasi dasar yang digunakan Spring untuk JDBC. Ini terutama membantu programmer untuk mengelola koneksi basis data, dan metode penggunaan lainnya bukanlah perbedaan besar dari menggunakan JDBC secara langsung.
Persyaratan Bisnis
Setiap orang akrab dengan penggunaan JDBC. Ini terutama untuk menunjukkan langkah -langkah untuk menggunakan templet JDBC pegas di springboot, jadi kami merancang persyaratan sederhana. Operasi dadih objek pengguna. Suatu objek memiliki dua properti, satu adalah ID dan yang lainnya adalah nama. Disimpan di tabel auth_user di mysql.
Buat proyek baru dan tambahkan dependensi
Buat proyek Springboot kosong di IntelliJ Idea. Referensi Langkah -Langkah Khusus
Tutorial grafis IntelliJ Idea untuk membuat proyek boot-boot. Menurut persyaratan contoh ini, kita perlu menambahkan tiga dependensi berikut
<dependency> <GroupId> org.springframework.boot </groupid> <t Artifactid> Spring-boot-starter-web </artifactid> </dependency> <dependency> <roupidid> org.sprramework.boot </groupidid <artifactid> <t ArtiFacTid> <t ArtiFacTID> <TREPRED-BOOT-STARTER-STARTER-JDBC <groupId> mysql </groupId> <ArTifactId> mysql-connector-java </artifactid> <version> 6.0.6 </version> </gandendency>
Karena kami ingin mempublikasikan layanan HTTP REST, kami menambahkan ketergantungan Spring-boot-starter-Web. Di sini kami ingin menggunakan metode tempet JDBC untuk mengakses database, jadi kami menambahkan ketergantungan spring-boot-starter-JDBC untuk mengakses database MySQL, jadi kami menambahkan versi terbaru dari driver JDBC MySQL.
Persiapkan lingkungan basis data
Asumsikan bahwa MySQL 5.7 sudah diinstal pada sistem operasi Linux. Operasi berikut dijalankan pada baris perintah sistem operasi, masuk ke klien baris perintah MySQL melalui pengguna root.
Bangun Database dan Tabel
buat basis data springboot_jdbc; buat tabel auth_user (uuid bigint not null, name varchar (32), kunci utama (uuid)) charset default = utf8mb4;
Tetapkan izin pengguna
berikan semua hak istimewa di springboot_jdbc.* Untuk 'springboot'@'%' diidentifikasi oleh 'springboot'; hak istimewa flush;
Konfigurasikan sumber data (kumpulan koneksi)
Sumber data Springboot secara otomatis dikonfigurasi. Di Springboot 2.0, ada beberapa konfigurasi sumber data yang tersedia, dan mereka memilih sumber data mana yang benar -benar digunakan dalam urutan terakhir hikaricp -> tomcat pooling -> commons dbcp2.
Ketika proyek menambahkan ketergantungan pegas-boot-starter-JDBC, ketergantungan sumber data HikariCP sudah disertakan, sehingga sumber data kumpulan koneksi hikaricp secara otomatis dikonfigurasi di sini.
Tambahkan konfigurasi berikut di appplications.properties
Konfigurasi Sumber Data #General spring.datasource.driver-class-name = com.mysql.cj.jdbc.driverspring.datasource.url = jdbc: mysql: //10.110.2.5: 3306/spri ng-boot-jdbc? charset = utf8mb4 & usessl = falsspring.datasource.username = springbootpring.datasource.password = springboot# Hikari Sumber Data Konfigurasi Khusus spring.datasource.hikari.maximum-pool-size = 20spring.datasource.hikari.minimum-idle = 5
Di antara mereka, sebagian besar konfigurasi sumber data Hikari ditunjukkan pada gambar di bawah ini. Anda dapat memeriksa arti dari setiap konfigurasi
Pengembangan Program
Entitas Database Pengguna
Menurut persyaratan, entitas data pengguna yang sesuai memiliki dua atribut, satu ID dan yang lainnya adalah nama. Ini adalah objek pojo murni.
Paket com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao;/*** objek entitas pengguna** @author yang gaochao* @since 2018-03-09*/kelas publik Userdo {private long id; nama string pribadi; publik long getId () {return id; } public void setId (Long ID) {this.id = id; } public string getName () {return name; } public void setName (name string) {this.name = name; }} Objek Pengembalian HTTP REST UMUM
Biasanya di antarmuka HTTP REST, kami tidak hanya ingin secara langsung mengembalikan konten objek bisnis, tetapi juga mengembalikan beberapa informasi umum, seperti hasil dari panggilan antarmuka, pesan teks khusus yang dikembalikan ketika panggilan gagal, dll. Maka kami perlu membuat dua objek pengembalian yang sama, di samping pengembalian antarmuka umum hasil panggilan dan pesan teks, satu mencakup konten bisnis yang terpisah dan satu koleksi yang memegang kumpulan. Definisi spesifiknya adalah sebagai berikut
Mengembalikan objek untuk konten bisnis yang terpisah
Paket com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo;/*** Objek tunggal Mengembalikan hasil** @Author Yangaoo* @since 2018-03-09*/RestitemResult kelas publik <t> {hasil string pribadi; pesan string pribadi; item t pribadi; string publik getResult () {hasil pengembalian; } public void setResult (string hasil) {this.result = hasil; } public String getMessage () {return pesan; } public void setMessage (string message) {this.message = pesan; } public t getItem () {return item; } public void setItem (t item) {this.item = item; }} Kumpulan Objek Pengembalian Konten Bisnis
Paket com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo; impor java.util.collection;/*** hasil pengembalian objek** @author Yanga Gaochao* @since 2018-03-09*/Klasi Publik Restcollection <since <since; pesan string pribadi; koleksi pribadi <T> item; string publik getResult () {hasil pengembalian; } public void setResult (string hasil) {this.result = hasil; } public String getMessage () {return pesan; } public void setMessage (string message) {this.message = pesan; } koleksi publik <T> getItems () {item return; } public void setItems (koleksi <T> item) {this.items = item; }} Pengembangan Lapisan Kegigihan Data
Data Antarmuka Lapisan Kegigihan Data Pengguna
Paket com.yanggaochao.springboot.learn.springbootjdbclearn.dao; import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; impor java.util.list;/** ** ** ** ** loMa.userdo; Impor java.util.list;/** ** ** ** ** loMACHOR; 2018-03-09*/Antarmuka publik Userdao {/*** Simpan pengguna baru ke database** @param objek pengguna untuk menyimpan* @return apakah gain otot berhasil*/boolean add (userdo user); / *** Perbarui pengguna dalam database** @param pengguna pengguna pengguna untuk memperbarui* @return apakah pembaruan berhasil*/ pembaruan boolean (pengguna useroDo); / *** hapus pengguna tertentu** @param id identitas pengguna untuk menghapus* @return apakah penghapusan berhasil*/ boolean delete (ID panjang); / *** Permintaan yang tepat dari pengguna tertentu** @param id identitas pengguna untuk meminta* @return jika dapat ditanya, kembalikan informasi pengguna, jika tidak kembalikan lokasi null*/ userdo (ID panjang); / *** Permintaan pengguna dengan nama** @param Nama nama menjadi fuzzy* @return daftar pengguna untuk kueri*/ daftar <userdo> matchname (nama string);} Implementasi Lapisan Kegigihan Data Pengguna
Paket com.yanggaochao.springboot.learn.springbootjdbclearn.dao.impl; impor com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao; impor com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userbo; impor org.springframework.beans.factory.annotation.Autowired; impor org.spramework.jdbc.core.jdbctemate; org.springframework.jdbc.support.rowset.sqlrowset; impor org.springframework.stereotype.repository; import java.util.arraylist; import java.util.list;/*** Kelas implementasi basis data objek Pengguna Kelas Implementasi** @aut9 */@RepositoryPublic kelas UserdaojdBctempletImpl mengimplementasikan userdao {private final jdbctemplate jdbctemplate; @Autowired Public USERDAOJDBCTEMLETIMPL (JDBCTEMPLATE JDBCTEMPLATE) {this.jdbctemplate = jdbctemplate; } @Override public boolean add (userdo user) {string sql = "masukkan ke auth_user (uuid, name) values (?,?)"; return jdbctemplate.update (sql, user.getid (), user.getname ())> 0; } @Override Public Boolean Update (userdo user) {string sql = "perbarui auth_user set nama =? Di mana uuid =?"; return jdbctemplate.update (sql, user.getname (), user.getId ())> 0; } @Override public boolean delete (ID panjang) {string sql = "hapus dari auth_user di mana uuid =?"; return jdbctemplate.update (sql, id)> 0; } @Override Public Userdo Locate (Long ID) {String SQL = "SELECT * DARI AUTH_USER WHERE uUID =?"; Sqlrowset rs = jdbctemplate.queryforrowset (sql, id); if (rs.next ()) {return generateEntity (rs); } return null; } @Override Daftar publik <UserDoD> MatchName (nama string) {string sql = "pilih * dari auth_user di mana nama seperti?"; Sqlrowset rs = jdbctemplate.queryForrowset (sql, "%" + name + "%"); Daftar <UserOdo> Users = new ArrayList <> (); while (rs.next ()) {user.add (generateEntity (rs)); } pengembalian pengguna; } private userdo generateEntity (sqlrowset rs) {userdo wechatpay = UserDoDo baru (); wechatpay.setid (rs.getlong ("uuid")); wechatpay.setname (rs.getString ("name")); mengembalikan wechatpay; }} Di sini pertama -tama kami menggunakan anotasi @repository untuk menunjukkan bahwa ini adalah kelas dari lapisan persistensi data, dan springboot akan secara otomatis instantiate kelas ini. Kemudian tambahkan @Autowired ke konstruktor. Ketika Springboot membuat kelas ini, ia akan secara otomatis menyuntikkan instance JDBCtemplet ke dalam kelas ini. Di sini, instance JDBCtemplet secara otomatis dikonfigurasi oleh Springboot berdasarkan konfigurasi terkait sumber data di Applications.Properties. Menurut algoritma Springboot untuk secara otomatis mengonfigurasi sumber data, sumber data yang akan dikonfigurasi di sini adalah hikaricp.
Sisanya seperti pengembangan JDBCTemplets Spring biasa. Dengan mengonversi secara manual antara objek dan SQL basis data oleh programmer, pengguna dapat ditambahkan, dimodifikasi, dihapus, pencocokan fuzzy, kueri yang tepat dan fungsi lainnya.
Pengembangan Lapisan Bisnis Data
Definisi Antarmuka Lapisan Layanan Data
Paket com.yanggaochao.springboot.learn.springbootjdbclearn.service; import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; impor java.util.list;/** ** ** ** ** loMACHOR; 2018-03-09 */antarmuka publik UserService {userdo add (userdo user); UserOdo Update (userdo user); Boolean Delete (Long ID); Userdo Lokasi (ID Panjang); Daftar <UserOdo> MatchName (nama string);} Implementasi Lapisan Layanan Data
Paket com.yanggaochao.springboot.learn.springbootjdbclearn.service.impl; impor com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao; impor com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userbo; impor com.yanggaochao.springboot.learn.springbootjdbclear.service.userservice; impor org.springframram.bane.bane.bane.bane.bane.bane.bane.bane.spramorky org.springframework.stereotype.Service;import java.util.Date;import java.util.List;/** * User business layer implementation class* * @author Yang Gaochao* @since 2018-03-09 */@Servicepublic class UserServiceImpl implements UserService { private final UserDao userDao; @Autowired UserserServiceImpl (userdao userdao) {this.userdao = userdao; } @Override Userdo UserDo Tambah (userdo user) {user.setId (new date (). GetTime ()); if (userdao.add (user)) {return user; } return null; } @Override Public UserDo Update (userdo user) {if (userdao.update (user)) {return location (user.getId ()); } return null; } @Override public boolean delete (ID panjang) {return userdao.delete (id); } @Override Public UserDo Location (ID Panjang) {return userdao.locate (id); } @Override Daftar publik <UserDoD> MatchName (nama string) {return userdao.matchname (name); }} Di sini, kelas implementasi ini dinyatakan sebagai kelas tingkat bisnis melalui anotasi @Service. Userdao dari Lapisan Persistence memungkinkan Springboot untuk membuat instantiate kelas lapisan bisnis ini melalui @Autowired, dan secara otomatis menyuntikkan kelas lapisan persistensi yang sesuai ke dalam kelas bisnis ini.
Di sini, saat menambahkan objek pengguna, saat mengatur identifikasi untuk pengguna, jumlah milidetik waktu saat ini hanya digunakan sebagai identifikasi. Selama proses pengembangan yang sebenarnya, tempat ini perlu menggunakan mekanisme unik secara global untuk memastikan bahwa logo ini tidak dapat diulang.
Pengembangan Lapisan Layanan Eksternal
Paket com.yanggaochao.springboot.learn.springbootjdbclearn.web; impor com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo.restcollectionResult; impor com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userbo; impor com.yanggaochao.springboot.learn.springbootjdbclear.service.userservice; impor org.springframram.bane.bane.bane.bane.bane.bane.bane.bane.spramorky org.springframework.web.bind.annotation.*; import java.util.list;/*** antarmuka http use** @author YangAoo* @since 2018-03-09*/ @restcontroller @requestMapping ("API/V1/USERFER") Public classcroller @requestMapping ("API/V1/User") Public classcroller @requestmapping ("API/V1/USERVER") PUBLICE COLUSIRECRICE @ @RequestMapping (value = "/add", Method = requestMethod.post) Public RestitemResult <UserDoD> add (@RequestBody userdo user) {restitemResult <UserOdo> hasil = restitemResult baru <> (); user = userservice.add (pengguna); if (user! = null) {result.setItem (user); result.setResult ("Sukses"); } else {result.setMessage ("pengguna baru gagal"); result.setresult ("kegagalan"); } hasil pengembalian; } @RequestMapping (value = "/update", Method = requestMethod.post) Public RestitemResult <UserSoDo> UPDATE (@RequestBody userdo user) {restitemResult <UserOdo> hasil = restitemResult baru <> (); user = userservice.update (pengguna); if (user! = null) {result.setItem (user); result.setResult ("Sukses"); } else {result.setMessage ("UserDoDo gagal memodifikasi pengguna"); result.setresult ("kegagalan"); } hasil pengembalian; } @RequestMapping (value = "/delete/{uuid}", method = requestMethod.get) Public RestitemResult <UserOdo> hapus (@pathvariable long uuid) {restitemResult <UserOdo> hasil = restitemResult <> (); if (UsserService.delete (uuid)) {result.setResult ("Success"); } else {result.setMessage ("hapus pengguna gagal"); result.setresult ("kegagalan"); } hasil pengembalian; } @RequestMapping (value = "/locate/{uuid}", method = requestMethod.get) restitemResult publik <userdo> temukan (@pathvariable long uuid) {restitemResult <UserOdo> hasil = restitemResult <> (); Userdo user = userservice.locate (uuid); if (user! = null) {result.setItem (user); result.setResult ("Sukses"); } else {result.setMessage ("User Query Failure"); result.setresult ("kegagalan"); } hasil pengembalian; } @RequestMapping (value = "/match/{name}", method = requestMethod.get) Public RestCollectionResult <UserDoDE> cocok (@pathvariable string name) {restCollectionResult <UserOdo> hasil = baru restCollectionResult <> (); Daftar <UserOdo> Users = UserserVice.matchName (Name); result.setitems (pengguna); result.setResult ("Sukses"); hasil pengembalian; }} Di sini @RestController digunakan untuk menyatakan bahwa ini adalah kelas antarmuka HTTP REST. Rute panggilan untuk setiap antarmuka dibentuk dengan menggabungkan @Requestmapping di kelas dan @RequestMapping pada metode ini. Properti Metode di @RequestMapping pada metode ini menyatakan metode yang dipanggil oleh HTTP. @RequestBody Anotasi secara otomatis mengonversi objek JSON dalam data POST menjadi objek POJO. @PathVariable secara otomatis mengonversi data di jalur URL HTTP menjadi parameter metode layanan.
Tes Antarmuka Istirahat HTTP
Tes Layanan HTTP REST dipanggil melalui HTTPClient of Apache Commons.
Http resst panggilan kelas tambahan
Paket com.yanggaochao.springboot.learn.springbootjdbclearn; impor org.apache.commons.httpclient.defaulthttpMethodRetryHandler; impor org.apache.commons.httpclient.httpclient; org.apache.commons.httpclient.methods.getmethod; import org.apache.commons.httpclient.methods.getmethod; impor org.apache.commons.htpclient.methods.stringreestentity; import org.apache.commons.commons.hthppars.tring.string.somer; java.io.BufferedReader;import java.io.InputStreamReader;import java.io.InputStreamReader;import java.io.Reader;import java.util.Map;/** * @author Yang Gaochao* @since 2018-03-09 */public class HttpClientHelper { /** * Use the get method to initiate an Permintaan http * * @param url URL http untuk mengakses * @return akses http teks respons yang diperoleh setelah */ string publik httpgetRequest (string url, peta <string, string> header) {coba {httpclient httppclient = new httpclient (); Metode getMethod = GetMethod baru (url); method.setRequestHeader ("tipe konten", "aplikasi/json; charset = utf-8"); method.getParams (). setParameter (httpmethodparams.retry_handler, DEFAULTHTTPMETHODRETRYHANDLER (3, false)); if (header! = null) {for (tombol string: headers.keyset ()) {method.setRequestHeader (key, headers.get (key)); }} int statusCode = httpclient.executeMethod (metode); if (statusCode == 200) {return parseInputStream (method.getResponseBodyAsstream ()); } else {System.out.println (url + "status =" + statuscode); }} catch (Exception e) {e.printstacktrace (); } return null; } /** * Use the post method to initiate an http request* * @param url The url of http to be accessed * @param data data in the request* @return The response text obtained after accessing http*/ public String httpPostRequest(String url, String data, Map<String, String> headers) { try { HttpClient httppclient = new Httpclient (); Metode postmethod = postmethod baru (url); method.setRequestHeader ("tipe konten", "aplikasi/json; charset = utf-8"); Method.setRequestHeader ("Pengguna-Agen", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebkit/537.36 (KHTML, Like Gecko) Chrome/34.0.1847.131 Safari/537.36"); if (header! = null) {for (tombol string: headers.keyset ()) {method.setRequestHeader (key, headers.get (key)); }} method.setRequestEntity (stringRequestEntity baru (data, "json", "UTF-8")); int statuscode = httpclient.executeMethod (metode); if (statusCode == 200) {return parseInputStream (method.getResponseBodyAsstream ()); } else {System.out.println (url + "status =" + statusCode + parseInputStream (method.getResponseBodyAsstream ())); }} catch (Exception e) {e.printstacktrace (); } return null; } / *** Parsing data teks dari java.io.reader** @param rd java.io.reader objek* @throws Exception melempar kesalahan ketika kesalahan terjadi* / private string parsereader (reader rd) melempar pengecualian {buferedReader bRD = new BufferedReader (rd); Garis string; StringBuilder meresponSecontext = new StringBuilder (); while ((line = brd.readline ())! = null) {responseSeContext.append (line) .Append ("/n"); } //rd.close (); if (responseContext.length ()> 0) {responseSeContext.deleteCharat (responseContext.length () - 1); } return responseContext.toString (); } / *** Parsing data teks dari aliran input** @param adalah aliran input* @throws Exception melempar pengecualian ketika kesalahan terjadi* / private string parseInputStream (inputStream is) melempar pengecualian {return parsereader (BufferedReader baru (inputStreamReArder baru (IS)); }} Di sini kami terutama mengimplementasikan metode memanggil layanan HTTP REST menggunakan metode GET dan POST.
Kasus uji
Gunakan JUnit untuk menjalankan kasus uji. Untuk mengimplementasikan tes, kami menambahkan ketergantungan Maven berikut
<dependency> <GroupId> commons-httpclient </proupid> <ArTifactId> commons-httpclient </arttifactid> <version> 3.1 </version> <scope> tes </seCope> </dependency> <sependency> <groupid> org.codehaus. <scope> tes </seupop> </dependency>
Paket com.yanggaochao.springboot.learn.springbootjdbclearn; impor org.codehaus.jettison.json.jsonobject; impor org.junit.after; impor org.junit.before; impor org.junit.test; impor java.net.net. java.util.list;/** * Deskripsi: * * @Author Yang Gaochao * @since 2018-03-09 */kelas publik userapitest {private string useraddurl = "http: // localhost: 3030/keamanan/api/v1/use/add"; Private String userLococedUrl = "http: // localhost: 3030/Security/API/V1/USER/LOCATE/"; Private String userDeleteUrl = "http: // localhost: 3030/keamanan/API/v1/user/delete/"; Private String userUpdateUrl = "http: // localhost: 3030/keamanan/API/v1/user/update"; Private String userMatchUrl = "http: // localhost: 3030/Security/API/V1/user/match/"; JsonObject addUser = new jsonObject (); Long AddUserId = null; Daftar <long> userIds = new ArrayList <> (); @Before public void sebelum () melempar Exception {adduser.put ("name", "Beautiful Sheep"); JsonObject addResultJson = new jsonObject (httpclientHelper baru (). HttppoStrequest (useraddurl, adduser.tostring (), null)); assert ("Success" .Equals (addResultJson.getString ("hasil"))); addUserId = addresultjson.getjsonObject ("item"). getLong ("id"); JSONObject user = new jsonObject (); user.put ("name", "Pleasant Goat"); addResultJson = new jsonObject (httpclientHelper baru (). httppostrequest (useraddurl, user.tostring (), null)); assert ("Success" .Equals (addResultJson.getString ("hasil"))); userids.add (addresultjson.getjsonObject ("item"). getLong ("id")); user.put ("name", "grey wolf"); addResultJson = new jsonObject (httpclientHelper baru (). httppostrequest (useraddurl, user.tostring (), null)); assert ("Success" .Equals (addResultJson.getString ("hasil"))); userids.add (addresultjson.getjsonObject ("item"). getLong ("id")); } @Test public void testupDateUser () melempar Exception {jsonObject user = new jsonObject (); user.put ("name", "smad domba"); user.put ("id", adduserid); baru httpClientHelper (). httppostrequest (userupdateUrl, user.toString (), null); JsonObject locateresultjson = new jsonObject (httpclientHelper baru (). HttpgetRequest (userlococedR + adduserid, null)); assert (user.getString ("name"). Equals (locateresultjson.getjsonObject ("item"). getString ("name"))); } @Test public void testMatchUser () melempar Exception {jsonObject matchResultjson = new jsonObject (httpclientHelper baru (). HttpgetRequest (usermatchurl + urlencoder.encode ("domba", "UTF-8"), null)); assert (matchresultjson.has ("item") && matchresultjson.getjsonArray ("item"). length () == 2); MatchResultJson = new jsonObject (baru httpclienthelper (). httpgetRequest (usermatchurl + urlencoder.encode ("serigala", "utf-8"), null)); Assert (MatchResultJson.has ("item") && matchResultJson.getjsonArray ("item"). Length () == 1); } @After public void After () melempar Exception {if (addUserId! = Null) {jsonObject deleteresultjson = new jsonObject (httpClientHelper baru (). Assert ("Success" .Equals (deleteresultjson.getString ("hasil"))); } untuk (long userId: userIds) {jsonObject deleteresultjson = new jsonObject (httpclientHelper () baru httpgetRequest (userDeleteUrl + userid, null)); Assert ("Success" .Equals (deleteresultjson.getString ("hasil"))); }}} Di sini, dua kasus uji dinyatakan di @test, satu menguji fungsi modifikasi pengguna dan yang lainnya menguji fungsi kueri fuzzy pengguna. @Before menyatakan persiapan yang harus dilakukan sebelum melaksanakan setiap kasus uji. Di sini kami pertama -tama memasukkan tiga potong data ke dalam database, dan pada saat yang sama, kami juga menguji fungsi menambahkan data dan kueri yang tepat. @Shal menyatakan pembersihan setelah setiap tes kasus dieksekusi. Di sini kami terutama menghapus data yang dimasukkan sebelumnya. Fungsi penghapusan pengguna diuji secara serempak di sini.
nota bene
Berikut adalah contoh lengkap springboot menggunakan Templet JDBC. Jika Anda memiliki pengalaman menggunakan Templet JDBC di bawah Spring, maka tujuan utama mengurangi banyak pekerjaan konfigurasi di Spring.
Kode yang terlibat dalam artikel ini telah diunggah ke GitHub, dan Anda juga dapat mengunduhnya secara lokal
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.