คำนำ
JDBC Templet ของ Spring เป็น encapsulation พื้นฐานที่ Spring ใช้สำหรับ JDBC ส่วนใหญ่จะช่วยให้โปรแกรมเมอร์จัดการการเชื่อมต่อฐานข้อมูลและวิธีการใช้งานที่เหลือไม่แตกต่างจากการใช้ JDBC โดยตรง
ข้อกำหนดทางธุรกิจ
ทุกคนคุ้นเคยกับการใช้ JDBC นี่คือส่วนใหญ่เพื่อแสดงให้เห็นถึงขั้นตอนในการใช้ Spring JDBC Templet ใน Springboot ดังนั้นเราจึงออกแบบข้อกำหนดที่ง่าย การดำเนินการนมเปรี้ยวของวัตถุผู้ใช้ วัตถุมีคุณสมบัติสองคุณสมบัติหนึ่งคือ ID และอีกชื่อหนึ่งคือชื่อ เก็บไว้ในตาราง auth_user ใน mysql
สร้างโครงการใหม่และเพิ่มการพึ่งพา
สร้างโครงการ Springboot ที่ว่างเปล่าใน INTELLIJ Idea การอ้างอิงขั้นตอนเฉพาะ
บทช่วยสอนกราฟิกของ Intellij Idea สำหรับการสร้างโครงการฤดูใบไม้ผลิ ตามข้อกำหนดของตัวอย่างนี้เราจำเป็นต้องเพิ่มการอ้างอิงสามแบบต่อไปนี้
<การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Web </Artifactid> </การพึ่งพาอาศัย> <การพึ่งพา> <roupId> org.springframework.boot </groupid> <RoupID> MySQL </groupID> <ArtIfactId> MySQL-Connector-Java </ArtIfactId> <Sersion> 6.0.6 </เวอร์ชัน> </การพึ่งพา>
เนื่องจากเราต้องการเผยแพร่บริการ HTTP REST เราจึงเพิ่มการพึ่งพาการพึ่งพา Spring-Boot-Starter-Web ที่นี่เราต้องการใช้วิธี JDBC Tempet เพื่อเข้าถึงฐานข้อมูลดังนั้นเราจึงเพิ่มการพึ่งพา Spring-Boot-Starter-JDBC เพื่อเข้าถึงฐานข้อมูล MySQL ดังนั้นเราจึงเพิ่มไดรเวอร์ JDBC เวอร์ชันล่าสุดของ MySQL
เตรียมสภาพแวดล้อมฐานข้อมูล
สมมติว่า MySQL 5.7 ได้รับการติดตั้งไว้แล้วในระบบปฏิบัติการ Linux การดำเนินการต่อไปนี้จะดำเนินการบนบรรทัดคำสั่งระบบปฏิบัติการลงชื่อเข้าใช้ไคลเอนต์บรรทัดคำสั่งของ MySQL ผ่านผู้ใช้รูท
สร้างฐานข้อมูลและตาราง
สร้างฐานข้อมูล springboot_jdbc; สร้าง table auth_user (uuid bigint ไม่ใช่ null, ชื่อ varchar (32), คีย์หลัก (uuid)) charset เริ่มต้น = utf8mb4;
ตั้งค่าสิทธิ์ผู้ใช้
ให้สิทธิ์ทั้งหมดใน Springboot_jdbc.* ถึง 'Springboot'@'%' ที่ระบุโดย 'Springboot'; Flush Privileges;
กำหนดค่าแหล่งข้อมูล (กลุ่มการเชื่อมต่อ)
แหล่งข้อมูลของ Springboot ได้รับการกำหนดค่าโดยอัตโนมัติ ใน Springboot 2.0 มีการกำหนดค่าแหล่งข้อมูลหลายอย่างและพวกเขาเลือกแหล่งข้อมูลที่จะใช้จริงในลำดับสุดท้ายของ Hikaricp -> Tomcat Pooling -> Commons DBCP2
เมื่อโครงการเพิ่มการพึ่งพา Spring-Boot-Starter-JDBC การพึ่งพาแหล่งข้อมูล HIKARICP จะรวมอยู่แล้วดังนั้นแหล่งข้อมูลการเชื่อมต่อ HIKARICP จะถูกกำหนดค่าโดยอัตโนมัติที่นี่
เพิ่มการกำหนดค่าต่อไปนี้ใน appplications.properties
#การกำหนดค่าแหล่งข้อมูลข้อมูล 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 = springbootspring.datasource.password = springboot# แหล่งข้อมูล Hikari การกำหนดค่าเฉพาะ spring.datasource.hikari.maximum-pool-size = 20spring.datasource.hikari.minimum-idle = 5
ในหมู่พวกเขาการกำหนดค่าส่วนใหญ่ของแหล่งข้อมูล Hikari จะแสดงในรูปด้านล่าง คุณสามารถตรวจสอบความหมายของการกำหนดค่าแต่ละครั้ง
การพัฒนาโปรแกรม
เอนทิตีฐานข้อมูลผู้ใช้
ตามข้อกำหนดแล้วเอนทิตีข้อมูลผู้ใช้ที่สอดคล้องกันมีสองแอตทริบิวต์หนึ่งคือ ID และอื่น ๆ คือชื่อ นี่คือวัตถุ Pojo ที่บริสุทธิ์
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao;/*** วัตถุเอนทิตีของผู้ใช้** @author Yang Gaochao* @since 2018-03-09*/คลาสสาธารณะ ชื่อสตริงส่วนตัว; Public Long getId () {return id; } โมฆะสาธารณะ setId (Long id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; - วัตถุส่งคืน http ทั่วไป
โดยปกติแล้วในอินเทอร์เฟซ HTTP REST เราไม่เพียง แต่ต้องการส่งคืนเนื้อหาของวัตถุธุรกิจโดยตรง แต่ยังส่งคืนข้อมูลทั่วไปบางอย่างเช่นผลลัพธ์ของการเรียกอินเทอร์เฟซข้อความที่กำหนดเองส่งคืนเมื่อการโทรล้มเหลว ฯลฯ จากนั้นเราต้องสร้างวัตถุที่กลับมาใช้งานร่วมกันสองรายการ คำจำกัดความเฉพาะมีดังนี้
ส่งคืนวัตถุสำหรับเนื้อหาธุรกิจแยกต่างหาก
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo;/*** วัตถุเดียวส่งคืนผลลัพธ์** @author Yang Gaochao* @since 2018-03-09*/คลาสสาธารณะ ข้อความสตริงส่วนตัว รายการส่วนตัว สตริงสาธารณะ getResult () {ผลตอบแทน; } โมฆะสาธารณะ setResult (ผลลัพธ์สตริง) {this.result = ผลลัพธ์; } สตริงสาธารณะ getMessage () {ส่งคืนข้อความ; } โมฆะสาธารณะ setMessage (ข้อความสตริง) {this.message = ข้อความ; } สาธารณะ t getItem () {รายการส่งคืน; } โมฆะสาธารณะ setItem (รายการ t) {this.item = item; - คอลเลกชันเนื้อหาธุรกิจส่งคืนวัตถุ
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo; นำเข้า java.util.collection;/*** คอลเลกชันวัตถุส่งคืนผลลัพธ์** @author Yang Gaochao* @Since 2018-03-09 ข้อความสตริงส่วนตัว คอลเลกชันส่วนตัว <T> รายการ; สตริงสาธารณะ getResult () {ผลตอบแทน; } โมฆะสาธารณะ setResult (ผลลัพธ์สตริง) {this.result = ผลลัพธ์; } สตริงสาธารณะ getMessage () {ส่งคืนข้อความ; } โมฆะสาธารณะ setMessage (ข้อความสตริง) {this.message = ข้อความ; } คอลเล็กชันสาธารณะ <t> getItems () {รายการส่งคืน; } โมฆะสาธารณะ setItems (คอลเลกชัน <t> รายการ) {this.items = รายการ; - การพัฒนาเลเยอร์การคงอยู่ของข้อมูล
คำจำกัดความอินเทอร์เฟซเลเยอร์การคงอยู่ของข้อมูลผู้ใช้
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn.dao นำเข้า com.yanggaochao.springboot.learn.springbootjdbclearn.dao.dao.userdo; 2018-03-09*/ส่วนต่อประสานสาธารณะ UserDao {/*** บันทึกผู้ใช้ใหม่ลงในฐานข้อมูล** @param Object Object เพื่อบันทึก* @@return ว่ากล้ามเนื้อจะประสบความสำเร็จ*/บูลีนเพิ่ม (ผู้ใช้ UserDo); / *** อัปเดตผู้ใช้ในฐานข้อมูล** @param ผู้ใช้ผู้ใช้ผู้ใช้เพื่ออัปเดต* @return ว่าการอัปเดตนั้นสำเร็จ*/ บูลีนอัปเดต (ผู้ใช้ Userdo); / *** ลบผู้ใช้ที่ระบุ** @param id ข้อมูลประจำตัวของผู้ใช้เพื่อลบ* @return ว่าการลบนั้นสำเร็จ*/ บูลีนลบ (Long ID); / *** การสืบค้นที่แน่นอนของผู้ใช้ที่ระบุ** @param id ข้อมูลประจำตัวของผู้ใช้เพื่อสอบถาม* @return หากสามารถสอบถามได้ส่งคืนข้อมูลผู้ใช้มิฉะนั้นจะส่งคืนตำแหน่ง null*/ userdo (Long ID); / *** สอบถามผู้ใช้ตามชื่อ** @param ชื่อชื่อเป็นฟัซซี่* @return รายชื่อผู้ใช้เพื่อสอบถาม*/ list <userdo> matchName (ชื่อสตริง);} การใช้เลเยอร์การคงอยู่ของข้อมูลผู้ใช้
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn.dao.impl; นำเข้า com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao; com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.jdbc. org.springframework.jdbc.support.rowset.sqlrowset; นำเข้า org.springframework.stereotype.repository; นำเข้า java.util.arraylist; นำเข้า Java.util.list;/*** */@repositoryPublic คลาส USERDAOJDBCTEMPLETIMPL ใช้ USERDAO {ส่วนตัวสุดท้าย JDBCTEMPLATE JDBCTEMPLATE; @AutoWired Public UserDaoJDBCTEMPLETIMPL (JDBCTEMPLATE JDBCTEMPLATE) {this.jdBctemplate = JDBCTEMPLATE; } @Override บูลีนสาธารณะเพิ่ม (ผู้ใช้ userdo) {string sql = "แทรกลงใน auth_user (uuid, ชื่อ) ค่า (?,?)"; ส่งคืน jdbctemplate.update (SQL, user.getId (), user.getName ())> 0; } @Override การอัปเดตบูลีนสาธารณะ (ผู้ใช้ UserDo) {String SQL = "UPDATE AUTH_USER SET NAME =? ที่ไหน uUID =?"; ส่งคืน jdbctemplate.update (SQL, user.getName (), user.getId ())> 0; } @Override บูลีนสาธารณะลบ (id ยาว) {string sql = "ลบจาก auth_user ที่ uuid =?"; ส่งคืน jdbctemplate.update (sql, id)> 0; } @Override public userdo locate (Long id) {string sql = "เลือก * จาก auth_user ที่ uuid =?"; SQLROWSET RS = JDBCTEMPLATE.QUERYFORROWSET (SQL, ID); if (rs.next ()) {return generateentity (rs); } return null; } @Override รายการสาธารณะ <EserDo> MatchName (ชื่อสตริง) {String SQL = "SELECT * จาก Auth_USER ชื่อที่ชอบ?"; SQLROWSET RS = JDBCTEMPLATE.QUERYFORROWSET (SQL, "%" + ชื่อ + "%"); รายการ <userdo> users = arraylist ใหม่ <> (); ในขณะที่ (rs.next ()) {users.add (generateentity (rs)); } ผู้ใช้ที่ส่งคืน; } Private UserDo GenerateEntity (SQLROWSET RS) {UserDo WeChatPay = new UserDo (); wechatpay.setid (Rs.getLong ("UUID")); wechatpay.setName (rs.getString ("ชื่อ")); กลับ Wechatpay; - ที่นี่เราใช้คำอธิบายประกอบครั้งแรก @Repository เพื่อระบุว่านี่เป็นคลาสของเลเยอร์การคงอยู่ของข้อมูลและ SpringBoot จะยกตัวอย่างคลาสนี้โดยอัตโนมัติ จากนั้นเพิ่ม @autowired ลงในตัวสร้าง เมื่อ Springboot อินเวสต์คลาสนี้จะฉีดอินสแตนซ์ JDBCTEMPLET โดยอัตโนมัติลงในคลาสนี้โดยอัตโนมัติ ที่นี่อินสแตนซ์ JDBCTEMPLET ได้รับการกำหนดค่าโดยอัตโนมัติโดย SpringBoot ตามการกำหนดค่าที่เกี่ยวข้องกับแหล่งข้อมูลในแอปพลิเคชัน ตามอัลกอริทึมของ Springboot เพื่อกำหนดค่าแหล่งข้อมูลโดยอัตโนมัติแหล่งข้อมูลที่จะกำหนดค่าที่นี่คือ Hikaricp
ส่วนที่เหลือก็เหมือนกับการพัฒนา JDBCTEMPLET ฤดูใบไม้ผลิธรรมดา โดยการแปลงระหว่างวัตถุและฐานข้อมูล SQL ด้วยตนเองโดยโปรแกรมเมอร์ผู้ใช้สามารถเพิ่มการแก้ไขการลบการจับคู่ที่คลุมเครือการสืบค้นที่แม่นยำและฟังก์ชั่นอื่น ๆ
การพัฒนาเลเยอร์ธุรกิจข้อมูล
คำจำกัดความอินเทอร์เฟซเลเยอร์ข้อมูลข้อมูล
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn.service นำเข้า com.yanggaochao.springboot.learn.springbootjdbclearn.dao.dao.userdo; 2018-03-09 */Public Interface UserserVice {UserDo Add (UserDo User); Userdo Update (UserDo user); บูลีนลบ (ID ยาว); userdo ค้นหา (ID ยาว); รายการ <userdo> matchname (ชื่อสตริง);} การใช้งานเลเยอร์บริการข้อมูล
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn.service.impl; นำเข้า com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao; com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; นำเข้า com.yanggaochao.springboot.learn.springbootjdbclearn.service.userservice; org.springframework.stereotype.service; นำเข้า java.util.date; นำเข้า Java.util.list;/*** คลาสการใช้งานชั้นธุรกิจของผู้ใช้** @author Yang Gaochao* @Since 2018-03-09*/ @ServicePublic ผู้ใช้ @AutoWired Public UserserViceImpl (UserDao UserDao) {this.userdao = userdao; } @Override Public UserDo เพิ่ม (ผู้ใช้ UserDo) {user.setId (วันที่ใหม่ (). getTime ()); if (userdao.add (ผู้ใช้)) {return user; } return null; } @Override การอัปเดต UserDo สาธารณะ (ผู้ใช้ userdo) {ถ้า (userdao.update (ผู้ใช้)) {return location (user.getId ()); } return null; } @Override บูลีนสาธารณะลบ (Long ID) {return userdao.delete (id); } @Override ตำแหน่งผู้ใช้สาธารณะ (Long ID) {return userdao.locate (ID); } @Override รายการสาธารณะ <Eserdo> matchName (ชื่อสตริง) {return userDao.MatchName (ชื่อ); - ที่นี่คลาสการใช้งานนี้ได้รับการประกาศว่าเป็นคลาสระดับธุรกิจผ่านคำอธิบายประกอบ @Service Userdao ของเลเยอร์การคงอยู่ช่วยให้ Springboot สามารถสร้างอินสแตนซ์คลาสเลเยอร์ธุรกิจนี้ผ่าน @autowired และฉีดคลาสเลเยอร์การคงอยู่ที่สอดคล้องกันโดยอัตโนมัติลงในคลาสธุรกิจนี้
ที่นี่เมื่อเพิ่มวัตถุผู้ใช้เมื่อตั้งค่าการระบุตัวตนสำหรับผู้ใช้จำนวนเวลาหลายมิลลิวินาทีจะถูกใช้เป็นเพียงการระบุ ในระหว่างกระบวนการพัฒนาจริงสถานที่นี้จำเป็นต้องใช้กลไกที่ไม่ซ้ำกันทั่วโลกเพื่อให้แน่ใจว่าโลโก้นี้ไม่สามารถทำซ้ำได้
การพัฒนาเลเยอร์บริการภายนอก
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn.web นำเข้า com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo.restcollectionresult; com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; นำเข้า com.yanggaochao.springboot.learn.springbootjdbclearn.service.userservice; org.springframework.web.bind.annotation.*; นำเข้า java.util.list;/*** ผู้ใช้ http rest interface** @author yang gaochao* @since 2018-03-09*/ @restcontroller @requestmapping ("API/V1/V1/ผู้ใช้ @RequestMapping (value = "/เพิ่ม", method = requestMethod.post) สาธารณะ RESTITEMRESULT <EserDo> เพิ่ม (@RequestBody UserDo ผู้ใช้) {RestItEmResult <userdo> result = new RestItEmResult <> (); user = userservice.add (ผู้ใช้); if (user! = null) {result.setItem (ผู้ใช้); result.setResult ("ความสำเร็จ"); } else {result.setMessage ("ผู้ใช้ใหม่ล้มเหลว"); result.setResult ("ล้มเหลว"); } ผลตอบแทนผลลัพธ์; } @RequestMapping (value = "/update", method = requestMethod.post) สาธารณะ retItEmresult <ererdo> อัปเดต (@RequestBody UserDo ผู้ใช้) {RESTITEMRESULT <userDo> result = ใหม่ RESTITEMRESULT <> (); user = userservice.update (ผู้ใช้); if (user! = null) {result.setItem (ผู้ใช้); result.setResult ("ความสำเร็จ"); } else {result.setMessage ("userdo ล้มเหลวในการแก้ไขผู้ใช้"); result.setResult ("ล้มเหลว"); } ผลตอบแทนผลลัพธ์; } @RequestMapping (value = "/ลบ/{uuid}", method = requestMethod.get) สาธารณะ retItEmresult <ererdo> ลบ (@PathVariable uuid ยาว) {restiteMresult <ผู้ใช้> result = new restiteMresult <> (); if (userservice.delete (uuid)) {result.setResult ("ความสำเร็จ"); } else {result.setMessage ("ลบผู้ใช้ล้มเหลว"); result.setResult ("ล้มเหลว"); } ผลตอบแทนผลลัพธ์; } @RequestMapping (value = "/locate/{uuid}", method = requestMethod.get) สาธารณะ retItEmresult <ererdo> ค้นหา (@PathVariable ยาว UUID) {RESTITEMRESULT <ผู้ใช้> ผลลัพธ์ = RESTITEMRESULT <> (); userdo user = userservice.locate (UUID); if (user! = null) {result.setItem (ผู้ใช้); result.setResult ("ความสำเร็จ"); } else {result.setMessage ("ผู้ใช้แบบสอบถามล้มเหลว"); result.setResult ("ล้มเหลว"); } ผลตอบแทนผลลัพธ์; } @RequestMapping (value = "/match/{name}", method = requestMethod.get) สาธารณะ retCollectionResult <Eserdo> Match (@PathVariable String ชื่อ) {RestCollectionResult <userdo> result = new RestCollectionResult <> (); รายการ <userdo> users = userservice.matchName (ชื่อ); result.setItems (ผู้ใช้); result.setResult ("ความสำเร็จ"); ผลการกลับมา; - ที่นี่ @RestController ใช้เพื่อประกาศว่านี่เป็นคลาสอินเตอร์เฟส HTTP REST เส้นทางการโทรสำหรับแต่ละอินเตอร์เฟสนั้นเกิดขึ้นโดยการรวม @requestmapping ในคลาสและ @requestmapping บนวิธีนี้ คุณสมบัติวิธีการใน @requestmapping บนวิธีนี้ประกาศวิธีการที่เรียกโดย http @RequestBody Annotation แปลงวัตถุ JSON โดยอัตโนมัติในข้อมูลโพสต์เป็นวัตถุ POJO @PathVariable แปลงข้อมูลโดยอัตโนมัติในเส้นทาง URL HTTP เป็นพารามิเตอร์ของวิธีการบริการ
การทดสอบส่วนต่อประสาน HTTP REST
ทดสอบบริการ HTTP REST เรียกผ่าน httpClient ของ Apache Commons
HTTP RESST เรียกคลาสเสริม
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn นำเข้า org.apache.commons.httpclient.defaulthttpmethodretryhandler; นำเข้า org.apache.commons.httpclient.httplient; org.apache.commons.httpclient.methods.getMethod; นำเข้า org.apache.commons.httpClient.methods.getMethod; นำเข้า org.apache.Commons.httpClient.methods.stringRequestiTity; java.io.bufferedreader; นำเข้า java.io.inputStreamreader; นำเข้า java.io.inputStreamreader; นำเข้า java.io.Reader; นำเข้า java.util.map;/*** @author Yang Gaochao* @Since 2018-03-09* คำขอ * * @param url URL ของ http เพื่อเข้าถึง * @return access http ข้อความตอบกลับที่ได้รับหลังจาก */ สตริงสาธารณะ httpgetRequest (สตริง url, แผนที่ <สตริง, สตริง> ส่วนหัว) {ลอง {httpClient httpplient = new httpClient (); วิธี getMethod = ใหม่ getMethod (URL); method.setRequestHeader ("ประเภทเนื้อหา", "แอปพลิเคชัน/json; charset = utf-8"); method.getParams (). setparameter (httpmethodparams.retry_handler, defaulthttpmethodretryhandler ใหม่ (3, false)); if (ส่วนหัว! = null) {สำหรับ (คีย์สตริง: headers.keyset ()) {method.setRequestheader (key, headers.get (key)); }} int StatusCode = httpClient.executemethod (วิธีการ); if (statusCode == 200) {return parseInputStream (method.getResponseBodyStream ()); } else {system.out.println (url + "status =" + statusCode); }} catch (exception e) {e.printstacktrace (); } return null; } / *** ใช้วิธีการโพสต์เพื่อเริ่มต้นคำขอ HTTP** @param url URL ของ http ที่จะเข้าถึง* ข้อมูลข้อมูล @param ในคำขอ* @return ข้อความตอบกลับที่ได้รับหลังจากเข้าถึง http* / สตริงสาธารณะ httppoStrequest httpClient (); วิธีการ postmethod = postmethod ใหม่ (URL); method.setRequestHeader ("ประเภทเนื้อหา", "แอปพลิเคชัน/json; charset = utf-8"); Method.setRequestheader ("ผู้ใช้ตัวแทน", "Mozilla/5.0 (Windows NT 6.1; WOW64) Applewebkit/537.36 (khtml, เช่น Gecko) Chrome/34.0.1847.131 Safari/537.36"); if (ส่วนหัว! = null) {สำหรับ (คีย์สตริง: headers.keyset ()) {method.setRequestheader (key, headers.get (key)); }} method.setRequestEntity (stringRequestEntity ใหม่ (ข้อมูล, "JSON", "UTF-8")); Int StatusCode = httpClient.executemethod (วิธีการ); if (statusCode == 200) {return parseInputStream (method.getResponseBodyStream ()); } else {system.out.println (url + "status =" + statuscode + parseInputStream (method.getResponseBodyStream ())); }} catch (exception e) {e.printstacktrace (); } return null; } / *** การแยกวิเคราะห์ข้อมูลข้อความจาก java.io.Reader** @param rd java.io.Reader วัตถุ* @throws ข้อยกเว้นจะเกิดข้อผิดพลาดเมื่อเกิดข้อผิดพลาด* / Private String Parsereader (RD RD) โยนข้อยกเว้น สายสตริง; StringBuilder ตอบสนอง SECONTEXT = new StringBuilder (); ในขณะที่ ((line = brd.readline ())! = null) {responsesecontext.append (บรรทัด) .append ("/n"); } //rd.close (); if (responsecontext.length ()> 0) {responsesecontext.deletecharat (responsecontext.length () - 1); } return reponscontext.toString (); } / *** การแยกข้อมูลข้อความจากสตรีมอินพุต** @param คืออินพุตสตรีม* @throws ข้อยกเว้นจะโยนข้อยกเว้นเมื่อเกิดข้อผิดพลาด* / สตริงส่วนตัว parseInputStream (inputStream) โยนข้อยกเว้น {return parsereader (bufferedreader ใหม่ - ที่นี่เราใช้วิธีการเรียกใช้บริการ HTTP REST โดยใช้วิธี GET และ POST เป็นหลัก
กรณีทดสอบ
ใช้ Junit เพื่อดำเนินการทดสอบกรณี ในการดำเนินการทดสอบเราได้เพิ่มการพึ่งพา Maven ต่อไปนี้
<การพึ่งพา> <roupId> Commons-httpClient </groupId> <ratifactId> Commons-httpClient </artifactid> <version> 3.1 </version> <scope> ทดสอบ </scope> <Scope> ทดสอบ </cope> </dependency>
แพ็คเกจ com.yanggaochao.springboot.learn.springbootjdbclearn นำเข้า org.codehaus.jettison.json.jsonObject; นำเข้า org.junit.after; นำเข้า org.junit.before; นำเข้า org.test.test; java.util.list;/** * คำอธิบาย: * * @author Yang Gaochao * @Since 2018-03-09 */คลาสสาธารณะ userApitest {สตริงส่วนตัว useraddurl = "http: // localhost: 3030/security/api/v1/user/add"; สตริงส่วนตัว userlocateUrl = "http: // localhost: 3030/ความปลอดภัย/api/v1/ผู้ใช้/locate/"; สตริงส่วนตัว userdeleteUrl = "http: // localhost: 3030/ความปลอดภัย/api/v1/ผู้ใช้/ลบ/"; สตริงส่วนตัว userUpdateUrl = "http: // localhost: 3030/ความปลอดภัย/api/v1/ผู้ใช้/อัปเดต"; สตริงส่วนตัว usermatchurl = "http: // localhost: 3030/ความปลอดภัย/api/v1/ผู้ใช้/การจับคู่/"; jsonObject addUser = new JsonObject (); adduserid ยาว = null; รายการ <long> userIds = arrayList ใหม่ <> (); @Before โมฆะสาธารณะก่อน () พ่นข้อยกเว้น {adduser.put ("ชื่อ", "แกะสวย"); jsonObject addresultjson = new JsonObject (ใหม่ httpclienthelper (). httppostrequest (useraddurl, adduser.toString (), null)); ยืนยัน ("ความสำเร็จ" .Equals (addresultjson.getString ("ผลลัพธ์"))); addUserId = addResultjson.getJsonObject ("รายการ"). getLong ("id"); ผู้ใช้ jsonObject = new jsonObject (); user.put ("ชื่อ", "แพะที่น่าพอใจ"); addresultjson = new JsonObject (ใหม่ httpclienthelper (). httppostrequest (useraddurl, user.toString (), null)); ยืนยัน ("ความสำเร็จ" .Equals (addresultjson.getString ("ผลลัพธ์"))); userIds.add (addresultjson.getjsonobject ("รายการ"). getLong ("id")); user.put ("ชื่อ", "Grey Wolf"); addresultjson = new JsonObject (ใหม่ httpclienthelper (). httppostrequest (useraddurl, user.toString (), null)); ยืนยัน ("ความสำเร็จ" .Equals (addresultjson.getString ("ผลลัพธ์"))); userIds.add (addresultjson.getjsonobject ("รายการ"). getLong ("id")); } @Test โมฆะสาธารณะ testUpDateUser () พ่นข้อยกเว้น {JSONObject user = new JSONObject (); user.put ("ชื่อ", "Smad Sheep"); user.put ("id", addUserId); ใหม่ httpcleienthelper (). httppostrequest (userUpdateUrl, user.toString (), null); jsonObject locateresultjson = new jsonObject (ใหม่ httpclienthelper (). httpgetRequest (userlocateUrl + adduserid, null)); ยืนยัน (user.getString ("ชื่อ"). เท่ากับ (locateresultjson.getJsonObject ("รายการ"). getString ("ชื่อ"))); } @Test Public Void TestMatchUser () พ่นข้อยกเว้น {JSONObject MatchResultjson = new JsonObject (ใหม่ httpClienthelper (). httpgetRequest (usermatchurl + urlencoder.encode ("แกะ", "UTF-8"); ยืนยัน (MatchResultjson.has ("items") && matchResultjson.getjsonarray ("รายการ"). ความยาว () == 2); MatchResultjson = new JsonObject (ใหม่ httpclienthelper (). httpgetRequest (usermatchurl + urlencoder.encode ("Wolf", "UTF-8"), null)); ยืนยัน (MatchResultjson.has ("items") && matchResultjson.getjsonarray ("รายการ"). ความยาว () == 1); } @After โมฆะสาธารณะหลังจาก () พ่นข้อยกเว้น {ถ้า (addUserId! = null) {jsonObject deleteresultjson = new jsonObject (ใหม่ httpClienthelper (). httpgetRequest ยืนยัน ("ความสำเร็จ" .Equals (deleteresultjson.getString ("ผลลัพธ์"))); } สำหรับ (Long UserId: UserIds) {jsonObject deleteresultjson = new JsonObject (ใหม่ httpclienthelper (). httpgetRequest (userdeleteurl + userId, null)); ยืนยัน ("ความสำเร็จ" .Equals (deleteresultjson.getString ("ผลลัพธ์"))); - ที่นี่มีการประกาศกรณีทดสอบสองกรณีใน @Test หนึ่งทดสอบฟังก์ชั่นการปรับเปลี่ยนผู้ใช้และการทดสอบอื่น ๆ ของฟังก์ชันการสืบค้นผู้ใช้ฟัซซี่ @Before ประกาศการเตรียมการที่ต้องทำก่อนดำเนินการแต่ละกรณีทดสอบ ที่นี่เราแทรกข้อมูลสามชิ้นลงในฐานข้อมูลและในเวลาเดียวกันเรายังทดสอบฟังก์ชั่นของการเพิ่มข้อมูลและการสืบค้นที่แม่นยำ @After ประกาศการล้างข้อมูลหลังจากดำเนินการทดสอบแต่ละกรณี ที่นี่เราลบข้อมูลที่แทรกไว้ก่อนหน้านี้เป็นหลัก ฟังก์ชั่นของการลบผู้ใช้ได้รับการทดสอบแบบซิงโครนัสที่นี่
postscript
นี่คือตัวอย่างที่สมบูรณ์ของ Springboot โดยใช้ JDBC Templet หากคุณมีประสบการณ์ในการใช้ JDBC Templet ภายใต้ฤดูใบไม้ผลิจุดประสงค์หลักของการลดการกำหนดค่าจำนวนมากในฤดูใบไม้ผลิ
รหัสที่เกี่ยวข้องในบทความนี้ได้ถูกอัปโหลดไปยัง GitHub และคุณสามารถดาวน์โหลดได้ในพื้นที่
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com