1. บทนำ
(1) MySQL เป็นระบบฐานข้อมูลเชิงสัมพันธ์ซึ่งเป็นฐานข้อมูลที่ใช้กันมากที่สุดและกว้างขวางที่สุดสำหรับ บริษัท อินเทอร์เน็ตในปัจจุบัน เป็นฐานข้อมูลฝั่งเซิร์ฟเวอร์ที่สามารถทนต่อการเข้าชมพร้อมกันได้สูง
(2) Spring-Data-JPA เป็นการดำเนินการของชั้นที่เก็บที่ให้ไว้ภายใต้ข้อกำหนด JPA สามารถพัฒนาได้โดยใช้กรอบการใช้งานที่แตกต่างกันเช่น Hibernate, OpenJPA และเฟรมเวิร์กอื่น ๆ สิ่งนี้สามารถทำให้ที่เก็บง่ายและแก้ปัญหาการมีเพศสัมพันธ์กับเลเยอร์ธุรกิจ
ในการศึกษานี้เราใช้ MySQL + Spring-Data-JPA เพื่อสร้าง วิธีการใช้งาน JPA ใช้ไฮเบอร์เนต พูลการเชื่อมต่อฐานข้อมูลใช้ DBCP สำหรับการเชื่อมต่อ
2. การก่อสร้างโครงการ
1. แนะนำ MySQL และการพึ่งพาที่เกี่ยวข้องกับ JPA:
<!-การพึ่งพาที่เกี่ยวข้องกับ Spring-JDBC-> <การพึ่งพา> <roupId> org.springframework </groupId> <ratifactid> Spring-Jdbc </artifactid> <ArtIfactId> mysql-connector-java </artifactid> </การพึ่งพาอาศัย> <!-การพึ่งพาที่เกี่ยวข้องกับ JPA ได้แก่ Spring-Data-JPA, Spring-orm และ Hibernate เพื่อสนับสนุน JPA-> <ArtIfactId> Spring-Boot-Starter-Data-JPA </artifactId> </dercedency>
ต้องมีการพึ่งพาสามครั้ง JDBC เป็นการพึ่งพาที่จำเป็นโดยฤดูใบไม้ผลิรวม MySQL ประการที่สองคือการพึ่งพาไดรเวอร์ฐานข้อมูลของ MySQL และที่สามคือการพึ่งพา Spring-Data-JPA ที่เกี่ยวข้องกับการพึ่งพา:
มันรวมถึงการพึ่งพาเช่น AOP, JDBC, Spring-orm, ธุรกรรม Transaction-API และ Hibernate เพื่อสนับสนุน ดังนั้น JPA จะเริ่มต้นใช้งานโดยใช้ไฮเบอร์เนต
2. การกำหนดค่าไฟล์การกำหนดค่า:
เราเลือกไฟล์รูปแบบ. yml สำหรับไฟล์การกำหนดค่าและใช้ DPCP2 เพื่อกำหนดค่าพารามิเตอร์การเชื่อมต่อพูล:
1) การกำหนดค่าที่เกี่ยวข้องกับโครงการ:
เซิร์ฟเวอร์: #configuration พอร์ตหมายเลขพอร์ต: 8088Spring: แอปพลิเคชัน: #Configuration ชื่อบริการชื่อ: CMS-DEPT
นี่คือข้อมูลที่เกี่ยวข้องเกี่ยวกับการกำหนดค่าการเปิดเซิร์ฟเวอร์ส่วนใหญ่กำหนดค่าชื่อเซิร์ฟเวอร์และพอร์ต
2) การกำหนดค่าที่เกี่ยวข้องกับ MySQL
Spring: #DATA Source และ JPA การกำหนดค่า DataSource: #การเชื่อมต่อการกำหนดค่าที่เกี่ยวข้องกับฐานข้อมูล -SSL การเชื่อมต่อเป็น URL เท็จ: JDBC: MySQL: // LocalHost: 3306/CRM?
นี่คือการกำหนดค่าที่เกี่ยวข้องกับฐานข้อมูลส่วนใหญ่การกำหนดค่า URL ฐานข้อมูลบัญชีและรหัสผ่าน ข้อมูลการกำหนดค่าหลังจาก URL เป็นรูปแบบการเข้ารหัสของ MySQL ที่เชื่อมต่อและเปิดใช้งานการเข้ารหัส SSL หรือไม่
3) การกำหนดค่าที่เกี่ยวข้องกับ DBCP
ฤดูใบไม้ผลิ: #ต่อไปนี้คือการกำหนดค่า DBCP2 สำหรับพูลการเชื่อมต่อที่เกี่ยวข้อง: #Initialize การเชื่อมต่อขนาดพูลขนาดเริ่มต้น: 10 #sitting จำนวนขั้นต่ำของการเชื่อมต่อพูลการเชื่อมต่อขั้นต่ำ: 10 #configure จำนวนสูงสุดของการเชื่อมต่อพูลสูงสุด: 30 #configure รอเวลา เวลาระหว่าง-eviction-runs-millis: 200000 #configure เวลาการอยู่รอดขั้นต่ำของการเชื่อมต่อในการเชื่อมต่อพูลการลบออกจากการบำรุงรักษา: 200000
ส่วนใหญ่จะถูกกำหนดค่าเป็นข้อมูลพูลการเชื่อมต่อและรายละเอียดการกำหนดค่าจะแสดงในความคิดเห็นข้างต้น
4) Spring-Data-JPA ขึ้นอยู่กับการกำหนดค่าที่เกี่ยวข้องกับ Ihibernata
สปริง: JPA: #Configure ฐานข้อมูลประเภทฐานข้อมูล: mysql #configure ไม่ว่าจะพิมพ์ sql show-sql: true #hibernate การกำหนดค่าที่เกี่ยวข้อง Hibernate: #configure ระดับน้ำตก DDL-Auto: อัปเดตการตั้งชื่อ: org.hibernate.dialect.mysql5dialect
การกำหนดค่าคือประเภทฐานข้อมูลการเชื่อมต่อและไม่ว่าจะพิมพ์น้ำตกของ SQL และ Hibernate มีหลายประเภท:
1) ตรวจสอบความถูกต้อง- เมื่อมีการโหลดไฮเบอร์เนตตรวจสอบการสร้างโครงสร้างตารางฐานข้อมูล
2) สร้าง- สร้างใหม่ทุกครั้งที่มีการโหลดไฮเบอร์เนตโครงสร้างตารางฐานข้อมูลจะถูกสร้างขึ้นใหม่ซึ่งเป็นสาเหตุของการสูญเสียข้อมูลตารางฐานข้อมูล
3) การสร้าง Drop ที่สร้างขึ้นเมื่อมีการโหลดไฮเบอร์เนตและการออกคือการลบโครงสร้างตาราง
4) Update-Cascade Update Load Hibernate จะอัปเดตโครงสร้างฐานข้อมูลโดยอัตโนมัติ
ที่นี่เราเลือกการอัปเดตแบบเรียงซ้อนและวนซ้ำบนตารางเดิม
กลยุทธ์การตั้งชื่อมีสองประเภท:
1), org.springframework.boot.orm.jpa.hibernate.springphysicalnamingstrategy พบกับตัวอักษรตัวใหญ่บวก "_"
2), org.hibernate.cfg.improvednamingstrategy ไม่มีการตั้งชื่อการดัดแปลง
3. กำหนดค่าคลาสที่เกี่ยวข้อง:
คลาสการกำหนดค่าจะต้องมีการกำหนดค่าในไดเรกทอรีแนวนอนหรือไดเรกทอรีย่อยด้วยคลาสนิวเมติกก่อนที่จะสามารถกำหนดค่าได้สำเร็จ ที่นี่เราใช้การกำหนดค่าคลาส Java แทนวิธี XML สำหรับการกำหนดค่า:
/*** @function คำอธิบาย: คลาสสำหรับการกำหนดค่าที่เกี่ยวข้อง MySQL* @author Administrator* /// บรรทัดต่อไปนี้ใช้เพื่อเรียงลำดับอินเตอร์เฟสคำอธิบายประกอบเพื่อจัดการกับปัญหาการโหลดลำดับความสำคัญ มันมีตัวแปรการแจงนับสองตัว @order (สั่งซื้อ highest_precedence) // บรรทัดต่อไปนี้แสดงถึงคลาสนี้เป็นคลาสการกำหนดค่า @configuration // บรรทัดต่อไปนี้แสดงถึงคลาสนี้เพื่อเปิดใช้งานการจัดการธุรกรรม @enabletransactionManagement (proxytargetClass = true) // @componentscan.filter (type = filterType.annotation, value = service.class)} @enablejparepositories (basepackages = "com.hzt. **. repository") คลาสสาธารณะ mysqlconfig PersistenceExceptionTranslationPostProcessor (); -
1) @Order Annotation ใช้เพื่อกำหนดค่าลำดับความสำคัญในการโหลดของคลาสมันมีตัวแปรการแจงนับสองตัว:
order.highest_precedence- integer.min_value - ค่าต่ำสุดที่มีลำดับความสำคัญสูงสุด
ordered.lowest_precedence -integer.max_value -maximum ค่าที่มีลำดับความสำคัญต่ำสุด
2) @configuration คำอธิบายประกอบซึ่งหมายความว่าคลาสนี้เป็นคลาสการกำหนดค่า
3) @EnableTransactionManagement การจัดการธุรกรรมสำหรับ MySQL ProxyTargetClass = วิธีการจริงเพื่อเปิดใช้งานการจัดการธุรกรรมของชั้นเรียน
4) @enablejparepositories ใช้เพื่อกำหนดค่าการทำธุรกรรม ที่นี่เส้นทางจะถูกแสดงโดยนิพจน์ CGNL และยังสามารถกำหนดเป็นคลาสเฉพาะเช่น deptrepository.class
องค์ประกอบลูกของมันรวมถึง Filters สามารถกำหนดตัวดักถ่ายธุรกรรมเช่น integr filters = { @componentscan.filter (type = filterType.annotation, value = service.class)}
4. การแมป ORM Java คลาสที่เกี่ยวข้องกับคลาส:
1) โครงสร้างตารางฐานข้อมูล
2) การทำแผนที่ระดับเอนทิตี
@ENTITY // แสดงถึงคลาสเอนทิตีการแมปประเภทนี้สำหรับตาราง @Table (name = "tbl_dept") // ตั้งค่าชื่อตารางที่สอดคล้องกันแผนกคลาสสาธารณะใช้การใช้งาน serializable { /*** ฟังก์ชั่นคำอธิบาย: ความเป็นเอกลักษณ์ในระหว่างการทำให้เป็นอนุกรม */ ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 1L; /** คีย์หลัก -id uuid*/@id // หมายเหตุนี้หมายความว่าฟิลด์เป็นคีย์หลักของคลาส @GeneratedValue (Generator = "System -uuid") @GenericGenerator (name = "System -uuid", strategy = "uuid") // ชื่อ -ระบุชื่อของคอลัมน์ที่สอดคล้องกัน /** ตัวเลข, ไม่ซ้ำกัน*/// nullable - มันเป็นโมฆะ, ค่าเริ่มต้นเป็นจริงไม่ซ้ำกัน - ไม่ว่าจะเป็นค่าเริ่มต้นเป็นเท็จ @column (name = "no", nullable = false, ไม่ซ้ำกัน = true) จำนวนเต็มส่วนตัว no; / ** ชื่อแผนก*/ @column (name = "name", ไม่ซ้ำกัน = true, nullable = false) ชื่อสตริงส่วนตัว; / ** คีย์การจัดการแผนกหลัก -id uuid*/ @column (name = "manager", ไม่ซ้ำกัน = true, nullable = false) ผู้จัดการสตริงส่วนตัว; / ** แผนกคำอธิบาย*/ @column (name = "คำอธิบาย") คำอธิบายสตริงส่วนตัว; / ** แผนกโทรศัพท์*/ @column (name = "phone") สตริงโทรศัพท์ส่วนตัว; / ** แผนกโทรศัพท์*/ @column (name = "phone") สตริงโทรศัพท์ส่วนตัว; / ** เวลาการสร้างแผนก*/ @column (name = "createTime") @datetimeformat (pattern = "yyyy-mm-dd hh: mm: ss") วันที่ส่วนตัว createTime; / ** เวลาการปรับเปลี่ยนแผนก*/ @column (name = "edittime") @datetimeformat (pattern = "yyyy-mm-dd hh: mm: ss") วันที่ส่วนตัว edittime;} (1) @Entity แสดงถึงโครงสร้างตารางของการแมปประเภทนี้เป็นฐานข้อมูล
(2), @Table (name = "tbl_dept") คำอธิบายประกอบนี้ใช้เพื่อกำหนดค่าความสัมพันธ์ระหว่างคลาสเอนทิตีและการแมปตาราง ชื่อแสดงชื่อตารางที่แมป
(3) คำอธิบายประกอบ @ID หมายความว่าคลาสนี้เป็นคีย์หลัก
(4) คำอธิบายประกอบ @GeneratedValue ใช้เพื่อกำหนดค่าข้อมูลหลักที่เกี่ยวข้องกับคีย์หลักและแอตทริบิวต์เครื่องกำเนิดไฟฟ้าใช้เพื่อกำหนดค่ากลยุทธ์การสร้าง มีค่าการแจงนับดังต่อไปนี้:
1.Auto - คีย์หลักถูกควบคุมโดยโปรแกรม
2. ข้อมูลประจำตัว - สร้างฐานข้อมูลโดยอัตโนมัติ
3. Enerator - ระบุเครื่องกำเนิดไฟฟ้าที่ใช้ในการสร้างคีย์หลัก
4. ลำดับ - สร้างคีย์หลักตามลำดับของฐานข้อมูลพื้นฐาน
5. ตาราง - ใช้ตารางฐานข้อมูลเฉพาะเพื่อบันทึกคีย์หลัก
6. System-UUID แสดงถึงการใช้ UUID ที่สร้างระบบสำหรับการจับคู่
(5) @Column Annotation สำหรับการกำหนดค่าข้อมูลที่เกี่ยวข้องกับคอลัมน์ 1. ฟิลด์ชื่อใช้เพื่อระบุฟิลด์การแมปที่แมปกับโครงสร้างตาราง
2. ความยาวแสดงถึงข้อจำกัดความยาวของฟิลด์นี้และสามารถละเว้นได้
3. แอตทริบิวต์ที่ไม่ซ้ำกันแสดงว่าฟิลด์นี้มีข้อ จำกัด ที่ไม่ซ้ำกันหรือไม่ ค่าเริ่มต้นเป็นเท็จและไม่ซ้ำกันเป็นจริง
4. ว่างเปล่าหมายความว่าฟิลด์นี้สามารถว่างเปล่าและค่าเริ่มต้นเป็นจริง เท็จหมายความว่ามันไม่สามารถว่างเปล่าได้
(6) @datetimeformat ใช้เพื่อแมปเวลาตารางฐานข้อมูล
วิธีการรับและชุดที่สอดคล้องกันถูกละไว้
3) การใช้เลเยอร์ deptrepository
ดังที่แสดงในรูปการตอบสนองเป็นข้อกำหนดของอินเตอร์เฟสโดยมีการสืบทอดแบบอินเทอร์เฟซที่แตกต่างกัน นอกเหนือจากการสืบทอดฟังก์ชั่นทั้งหมดของอินเทอร์เฟซหลักแล้วแต่ละอินเตอร์เฟซย่อยจะเพิ่มวิธีการเพิ่มเติมสำหรับการใช้งานที่แตกต่างกัน คลาส crudrepository กำหนดวิธีพื้นฐานและคลาสย่อยของมันจะถูกขยายแยกกัน
ตัวอย่างเช่นนอกเหนือจากการสืบทอดวิธีการทั้งหมดของ crudrepository แล้วคลาส PagingandsortingRepository ยังขยายมันเพิ่มวิธีการที่เกี่ยวข้องสำหรับการค้นหาเพจ:
iterable <t> findall (เรียงลำดับ); Page <t> findall (pageable pageable);
JParePository ขยายตัวตาม PagingandsortingRepository
1. ชั้นเก็บ:
@Repository แสดงให้เห็นว่าคลาสนี้ได้รับการจัดการโดยฤดูใบไม้ผลิและเป็นชั้น DAO
/*** @Function คำอธิบาย: อินเตอร์เฟสเลเยอร์ DAO สำหรับการดำเนินการตารางแผนก* @Author Administrator*/ @repository // ที่เก็บนี่คือการใช้งาน Dao Layer การใช้งานส่วนต่อประสานสาธารณะ
ขึ้นอยู่กับคลาสการใช้งานมีวิธีการโทรต่างกัน โดยทั่วไปทุกคนสามารถรู้การใช้วิธีนี้โดยรู้ชื่อและความหมาย ในประเภททั่วไปพารามิเตอร์แรกแสดงถึงคลาสเอนทิตีของแผนที่ตารางและพารามิเตอร์ที่สองแสดงถึงประเภทคีย์หลัก
2. การใช้เลเยอร์บริการ:
/*** @Function คำอธิบาย: คลาสการใช้งานสำหรับการดำเนินงานบริการแผนก* @author Administrator*/ @ServicePublic คลาส DeptServiceImpl ใช้งาน DeptService {/** คลาสการประมวลผลบันทึก*/logger สุดท้าย logger สุดท้าย = loggerFactory.getLogger (getClass ()); @Autowired Private Deptrepository ที่เก็บ; @Override DEPT Public QueryById (String ID) โยนข้อยกเว้น {ลอง {dept result = repository.findone (id); log.info (result.toString ()); ผลการกลับมา; } catch (exception e) {log.info (e.toString (), e); โยนบริการใหม่ ("ข้อยกเว้นเกิดขึ้นในขณะที่สอบถามตาม ID!"); -ที่ FindOne เป็นวิธีการที่ใช้โดย JParepository
3. การใช้เลเยอร์คอนโทรลเลอร์:
@restController@requestmapping ("/api/v1/dept") คลาสสาธารณะ DeptController {/** คลาสการบันทึก*/logger ส่วนตัวบันทึก = loggerFactory.getLogger (getClass ()); / ** บริการของฉันเอง*/ @autowired Private Deptservice Service; /*** @function คำอธิบาย: วิธีการสอบถามเนื้อหาแผนกตาม ID* @return dept*/@getMapping ("/id/get") ผลลัพธ์สาธารณะ getById (String id) โยนข้อยกเว้น {ตรวจสอบ (ใหม่ Verifyparam ("ID แผนก", ID)); ส่งคืนผลลัพธ์ใหม่ ("ได้รับสำเร็จผ่าน ID!", Service.QueryById (ID)); -ที่ RestController แสดงถึงคอนโทรลเลอร์ที่ส่งคืนรูปแบบ JSON @requestmapping กำหนด URL ของแผนที่คลาส ข้อมูลที่เรายอมรับที่นี่เป็นประเภทสตริงปกติ หากคุณต้องการยอมรับประเภท JSON คุณต้องใช้ @requestbody String ID เพื่อกำหนดค่าพารามิเตอร์คำขอเพื่อยอมรับ
4. ทดสอบ:
จำลองการส่งคำขอรับเพื่อให้การรวมและการกำหนดค่าของ Spring-Data-JPA และ MySQL เสร็จสมบูรณ์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น