ในบทความก่อนหน้านี้มีการอธิบายหลักการพื้นฐานและการใช้งานของ Spring Boot ผ่านโปรแกรม HelloWorld ที่เรียบง่าย บทความนี้ส่วนใหญ่จะอธิบายวิธีการเข้าถึงฐานข้อมูลผ่าน Spring Boot บทความนี้จะแสดงให้เห็นถึงสามวิธีในการเข้าถึงฐานข้อมูล อย่างแรกคือ JDBCTEMPLATE ที่สองคือ JPA และที่สามคือ MyBatis ดังที่ได้กล่าวไว้ก่อนหน้านี้ชุดนี้จะใช้ระบบบล็อกเป็นพื้นฐานสำหรับการอธิบายดังนั้นบทความนี้จะอธิบายการจัดเก็บและการเข้าถึงบทความ (แต่ไม่รวมถึงรายละเอียดของบทความ) เนื่องจากการใช้งานขั้นสุดท้ายเสร็จสมบูรณ์ผ่าน MyBatis จะมีการสาธิตอย่างง่าย ๆ ของ JDBCTEMPLATE และ JPA เท่านั้นและส่วน MyBatis จะใช้การเพิ่มการลบการดัดแปลงและการค้นหาบทความอย่างเต็มที่
1. การเตรียม
ก่อนที่จะแสดงวิธีการเหล่านี้คุณต้องเตรียมบางสิ่งก่อน ที่แรกคือฐานข้อมูล ระบบนี้ใช้งานโดยใช้ MySQL เราจำเป็นต้องสร้างตาราง tb_article ก่อน:
Drop Table หากมีอยู่ `tb_article`; สร้างตาราง` tb_article` (`id` bigint (20) ไม่ใช่ null auto_increment,` title` varchar (255) ไม่ใช่ค่าเริ่มต้นที่เป็นโมฆะ ', `summary` varchar (1024) ไม่ได้เป็นค่าเริ่มต้น' Bigint (20) ไม่ใช่ค่าเริ่มต้น null '0', `create_time` timestamp ไม่ใช่ null default current_timestamp,` update_time` timestamp ไม่ใช่ null default current_timestamp, `public_time` timestamp ไม่ใช่ null default current_timestamp, คีย์หลัก (` id`)
ในการสาธิตครั้งต่อไปตารางนี้จะถูกเพิ่มลบแก้ไขและตรวจสอบ คุณควรเห็นว่าไม่มีรายละเอียดของบทความในตารางนี้ เหตุผลก็คือรายละเอียดของบทความค่อนข้างยาว หากวางไว้ในตารางนี้มันจะส่งผลกระทบต่อประสิทธิภาพของการสอบถามรายการบทความได้อย่างง่ายดายดังนั้นรายละเอียดของบทความจะถูกเก็บไว้ในตารางอื่นแยกกัน นอกจากนี้เราจำเป็นต้องกำหนดค่าพูลการเชื่อมต่อฐานข้อมูล ที่นี่เราใช้พูลเชื่อมต่อ Druid นอกจากนี้ไฟล์การกำหนดค่าได้รับการกำหนดค่าโดยใช้ YAML นั่นคือ Application.yml (คุณสามารถใช้แอปพลิเคชันไฟล์การกำหนดค่า properties ไม่มีความแตกต่างใหญ่ถ้าคุณไม่คุ้นเคยกับ YMAL และสนใจคุณสามารถตรวจสอบได้ซึ่งค่อนข้างง่าย) การกำหนดค่าการเชื่อมต่อพูลมีดังนี้:
ฤดูใบไม้ผลิ: DataSource: URL: JDBC: MySQL: //127.0.0.1: 3306/บล็อก? useunicode = true & aractenencoding = UTF-8 & usessl = false driverclassname: com.mysql.jdbc.driver username: รูทรหัสผ่าน: 123456 ประเภท
ในที่สุดเราต้องสร้างคลาส POJO ที่สอดคล้องกับฐานข้อมูลรหัสมีดังนี้:
บทความชั้นเรียนสาธารณะ {Private Long ID; ชื่อสตริงส่วนตัว; สรุปสตริงส่วนตัว; วันที่ส่วนตัว createTime; วันที่ส่วนตัวเผยแพร่; วันที่ส่วนตัวอัปเดต; ผู้ใช้ยาวส่วนตัว; สถานะจำนวนเต็มส่วนตัว ประเภทจำนวนเต็มส่วนตัว;}ตกลงนั่นคืองานทั้งหมดที่คุณต้องเตรียมและตอนนี้เริ่มใช้การดำเนินการฐานข้อมูล
2. การรวมเข้ากับ jdbctemplate
ก่อนอื่นเราจะเข้าถึงฐานข้อมูลผ่าน JDBCTEMPLATE ก่อน ที่นี่เราแสดงให้เห็นถึงการแทรกข้อมูลเท่านั้น ดังที่ได้กล่าวไว้ในบทความก่อนหน้านี้ Spring Boot มีผู้เริ่มต้นจำนวนมากเพื่อรองรับฟังก์ชั่นที่แตกต่างกัน เพื่อรองรับ JDBCTEMPLATE เราต้องแนะนำผู้เริ่มต้นต่อไปนี้เท่านั้น:
<การพึ่งพา> <roupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Jdbc </artifactId>
ตอนนี้เราสามารถใช้การแทรกข้อมูลผ่าน JDBCTEMPLATE:
ส่วนต่อประสานสาธารณะ articledao {Insertarticle ยาว (บทความบทความ);} @repositorypublic คลาส articledaojdbctempleimpl ดำเนินการ articledao {@autowired private namedparameterjdbctemplate Jdbctemplate; @Override public long insertarticle (บทความบทความ) {string sql = "แทรกลงใน tb_article (ชื่อเรื่อง, สรุป, user_id, create_time, public_time, update_time, สถานะ)" + "ค่า (: title ,: summary ,: userid ,: createTime ,: publictime, แผนที่ <string, Object> param = new hashmap <> (); param.put ("title", article.getTitle ()); param.put ("สรุป", article.getSummary ()); param.put ("userId", article.getUserId ()); param.put ("สถานะ", article.getStatus ()); param.put ("createTime", article.getCreateTime ()); param.put ("createTime", article.getCreateTime ()); param.put ("Publictime", article.getPublictime ()); param.put ("updateTime", article.getUpDateTime ()); return (long) jdbctemplate.update (sql, param); -เราใช้ Junit เพื่อทดสอบรหัสด้านบน:
@runwith (springjunit4classrunner.class) @springboottest (classes = application.class) ชั้นเรียนสาธารณะ articledaotest {@autowired ส่วนตัว Articledao Articledao; @Test โมฆะสาธารณะทดสอบ () {บทความบทความ = บทความใหม่ (); บทความ Settitle ("ชื่อทดสอบ"); บทความ. setsummary ("การทดสอบสรุป"); บทความ SetUserID (1L); บทความ SetStatus (1); บทความ SetCreateTime (วันที่ใหม่ ()); บทความ SetUpDatetime (วันที่ใหม่ ()); บทความ SetPublictime (วันที่ใหม่ ()); Articledao.insertarticle (บทความ); -เพื่อสนับสนุนโปรแกรมการทดสอบข้างต้นคุณต้องแนะนำผู้เริ่มต้น:
<Effercy> <mergiED> org.springframework.boot </groupId> <ratifactid> การทดสอบสปริง-สตาร์สตาร์เทสต์ </artifactid>
จากรหัสข้างต้นเราจะเห็นได้ว่าในความเป็นจริงไม่มีการกำหนดค่ายกเว้นการแนะนำ JDBC เริ่มต้น นี่คือกระบวนการกำหนดค่าอัตโนมัติของสปริงบูต รหัสข้างต้นต้องให้ความสนใจกับตำแหน่งของคลาสแอปพลิเคชัน คลาสนี้จะต้องอยู่ในแพ็คเกจหลักของคลาส DAO ตัวอย่างเช่น Dao อยู่ในแพ็คเกจ com.pandy.blog.dao ตอนนี้เราย้ายคลาส Application.java จากแพ็คเกจ com.pandy.blog ไปยังแพ็คเกจ com.pandy.blog และข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น:
เกิดจาก: org.springframework.beans.factory.nosuchbeandefinitionexception: ไม่มีถั่วที่มีคุณสมบัติตามประเภท 'com.pandy.blog.dao.articledao' มีให้: คาดว่าจะมีถั่วอย่างน้อย 1 ตัว คำอธิบายประกอบการพึ่งพา: {@org.springframework.beans.factory.annotation.autowired (จำเป็น = จริง)} ที่ org.springframework.beans.factory.support.defaultlistablebeanformatory.raisenomatchingbeanfound org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedency (defaultlistablebeanfactory.java:1104) ที่ org.springframework.beans.factory.support.defaultlistablebeanbeanbeanbeanfaultlistabore org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor $ autowiredfieldelement.inject (AutowiredannotationBeanpostProcessor.java:585) ...กล่าวอีกนัยหนึ่งการใช้งานของ Articledao ไม่สามารถพบได้ เหตุผลคืออะไร? ในโพสต์บล็อกก่อนหน้านี้เราได้เห็นแล้วว่าคำอธิบายประกอบ @SpringBootapplication สืบทอด @componentscan ซึ่งสแกนแพ็คเกจและแพคเกจย่อยที่คลาสแอปพลิเคชันจะอยู่ตามค่าเริ่มต้นเท่านั้น ดังนั้นสำหรับข้อผิดพลาดข้างต้นนอกเหนือจากการรักษาคลาสแอปพลิเคชันในแพ็คเกจหลักของ DAO คุณยังสามารถระบุแพ็คเกจสแกนเพื่อแก้ไข:
@springbootapplication@componentscan ({"com.pandy.blog"}) แอปพลิเคชันคลาสสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) โยนข้อยกเว้น {springapplication.run (application.class, args); -3. การรวมกับ JPA
ตอนนี้เราจะเริ่มอธิบายวิธีการใช้งานฐานข้อมูลผ่าน JPA มันยังคงคล้ายกับ JDBCTEMPLATE ก่อนอื่นเราต้องแนะนำผู้เริ่มต้นที่เกี่ยวข้อง:
<การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Data-JPA </artifactId>
จากนั้นเราต้องเพิ่มคำอธิบายประกอบเอนทิตีลงในคลาส POJO และระบุชื่อตาราง (หากไม่ได้ระบุชื่อตารางเริ่มต้นคือบทความ) และจากนั้นเราจำเป็นต้องระบุ ID และกลยุทธ์การสร้าง นี่คือความรู้ JPA ทั้งหมดและไม่มีส่วนเกี่ยวข้องกับการบูตฤดูใบไม้ผลิ หากคุณไม่คุ้นเคยคุณสามารถดูจุดความรู้ JPA:
@ENTITY (name = "tb_article") บทความคลาสสาธารณะ {@id @IneratedValue ส่วนตัว Long ID; ชื่อสตริงส่วนตัว; สรุปสตริงส่วนตัว; วันที่ส่วนตัว createTime; วันที่ส่วนตัวเผยแพร่; วันที่ส่วนตัวอัปเดต; ผู้ใช้ยาวส่วนตัว; สถานะจำนวนเต็มส่วนตัว;}ในที่สุดเราต้องสืบทอดคลาส JParepository ที่นี่เราใช้วิธีการสืบค้นสองวิธี ครั้งแรกคือแบบสอบถามที่สอดคล้องกับข้อกำหนดการตั้งชื่อ JPA JPA จะช่วยให้เรากรอกคำสั่งการค้นหาโดยอัตโนมัติ อีกวิธีหนึ่งคือการใช้ JPQL (แบบสอบถาม SQL-like ที่รองรับโดย JPA)
ส่วนต่อประสานสาธารณะ articlerepository ขยาย jparepository <บทความยาว> {รายการสาธารณะ <บทความ> findByUserId (userId ยาว); @Query ("เลือกศิลปะจาก com.pandy.blog.po.article Art โดยที่ชื่อ =: title") รายการสาธารณะ <บทความ> querybytitle (@param ("ชื่อ") ชื่อสตริง);}ตกลงเราสามารถทดสอบรหัสด้านบนอีกครั้ง:
@runwith (springjunit4classrunner.class) @springboottest (classes = application.class) Public Class ArticlerePositoryTest {@autoWired ArticlerePository ที่เป็นส่วนตัว @Test Public Void TestQuery () {รายการ <Saticor> articLelist = articLerePository.QueryByTitle ("ชื่อทดสอบ"); assertTrue (articlelist.size ()> 0); -โปรดทราบว่ายังมีปัญหาคล้ายกับ JDBCTEMPLATE ที่นี่ คุณต้องทำให้คลาสการเริ่มต้นแอปพลิเคชันไม่ได้อยู่ในแพ็คเกจหลักของการตอบสนองและคลาสเอนทิตีมิฉะนั้นข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น:
เกิดจาก: org.springframework.beans.factory.nosuchbeandefinitionexception: ไม่มีถั่วที่มีคุณสมบัติตามประเภท 'com.pandy.blog.dao.articlerepository' มีให้: คาดว่าจะมีถั่วอย่างน้อย 1 ตัว คำอธิบายประกอบการพึ่งพา: {@org.springframework.beans.factory.annotation.autowired (จำเป็น = จริง)} ที่ org.springframework.beans.factory.support.defaultlistablebeanformatory.raisenomatchingbeanfound org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedency (defaultlistablebeanfactory.java:1104) ที่ org.springframework.beans.factory.support.defaultlistablebeanbeanbeanbeanfaultlistabore org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor $ autowiredfieldelement.inject (AutowiredannotationBeanpostProcessor.java:585) ...แน่นอนคุณสามารถระบุแพ็คเกจ JPA ที่สแกนได้โดยการใส่คำอธิบายประกอบ @enablejparepositories แต่ก็ยังไม่ทำงานและข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น:
เกิดจาก: java.lang.illegalargumentexception: ไม่ใช่ประเภทที่มีการจัดการ: คลาส com.pandy.blog.po.article ที่ org.hibernate.jpa.internal.metamodel.metamodelimpl.ManagedType (Metamodelimpl.java:210) org.springframework.data.jpa.repository.support.jpametamodelentityinformation. <init> (jpametamodelentityinformation.java:70) ที่ org.springframework.data.jpa.repository.support.jpaentityinformationsupport.getentityinformation (jpaentityinformationsupport.java:68) ที่ org.springframework.data.jpa.repository.support.jparepositoryfactory.getentityinformation (jparepositoryfactory.java:153) ที่ org.springframework.data.jpa.repository.support.jparepositoryfactory.getTargetRepository (jparepositoryfactory.java:100) ที่ org.springframework.data.jpa.repository.support.jparepositoryfactory.getTargetRepository (jparepositoryfactory.java:82) ที่ org.springframework.data.repository.core.support.repositoryfactorysupport.getrepository (repositoryfactorysupport.java:199) ที่ org.springframework.data.repository.core.support.repositoryfactorybeansupport.initandreturn (repositoryfactorybeansupport.java:277) ที่ org.springframework.data.repository.core.support.repositoryfactorybeansupport.afterpropertiesset (repositoryfactorybeansupport.java:263) ที่ org.springframework.data.jpa.repository.support.jparepositoryfactorybean.afterpropertiesset (jparepositoryfactorybean.java:101) ที่ org.springframework.beans.factory.support.AbstractautautowirecapableBeanFactory.invokeinitmethods (AbstractautautowirecapableBeanFactory.java:1687) ที่ org.springframework.beans.factory.support.AbstractautautowirecapableBeanfactory.initializeBean (AbstractautautowirecapableBeanFactory.java:1624) ... 39 เพิ่มเติมอีก 39
ข้อผิดพลาดนี้บ่งชี้ว่าไม่สามารถรับรู้เอนทิตีได้ดังนั้นคุณต้องระบุแพ็คเกจเอนทิตีโดยการใส่คำอธิบายประกอบ @EntityScan การกำหนดค่าขั้นสุดท้ายมีดังนี้:
@springbootapplication@componentscan ({"com.pandy.blog"})@enablejparepositories (basepackages = "com.pandy.blog")@entityscan ("com.pandy.blog") แอปพลิเคชันระดับสาธารณะ -4. การรวมกับ mybatis
สุดท้ายลองมาดูวิธีการเข้าถึงฐานข้อมูลผ่าน mybatis ในทำนองเดียวกันเรายังต้องแนะนำผู้เริ่มต้น:
<การพึ่งพา> <roupId> org.mybatis.spring.boot </groupid> <ratifactid> mybatis-spring-boot-starter </artifactid>
เนื่องจากผู้เริ่มต้นไม่ได้รับการจัดเตรียมอย่างเป็นทางการโดย Spring Boot หมายเลขเวอร์ชันไม่สอดคล้องกับ Spring Boot และจำเป็นต้องระบุด้วยตนเอง
โดยทั่วไป MyBatis สามารถระบุ SQL ที่ใช้งานฐานข้อมูลผ่าน XML หรือคำอธิบายประกอบ โดยส่วนตัวแล้วฉันชอบ XML ดังนั้นบทความนี้แสดงให้เห็นถึงการเข้าถึงฐานข้อมูลผ่าน XML เท่านั้น ก่อนอื่นเราต้องกำหนดค่าไดเรกทอรี Mapper เรากำหนดค่าใน application.yml:
mybatis: config-locations: mybatis/mybatis-config.xml mapper-locations: mybatis/mapper/*. xml type-aliases-package: com.pandy.blog.po
การกำหนดค่าที่นี่ส่วนใหญ่มีสามส่วนหนึ่งคือการกำหนดค่าของ mybatis เองเช่นนามแฝงสำหรับประเภทพื้นฐาน ประการที่สองคือการระบุตำแหน่งของไฟล์ Mapper และที่สามคือนามแฝงสำหรับคลาส Pojo การกำหนดค่านี้ยังสามารถนำไปใช้ผ่านการกำหนดค่า Java เนื่องจากปัญหาเกี่ยวกับพื้นที่ฉันจะไม่อธิบายรายละเอียดที่นี่ เพื่อนที่สนใจสามารถนำไปใช้ด้วยตัวเอง
หลังการกำหนดค่าก่อนอื่นเราจะเขียนอินเทอร์เฟซ Mapper:
ส่วนต่อประสานสาธารณะ articlemapper {public long interarticle (บทความบทความ); โมฆะสาธารณะ updatearticle (บทความบทความ); บทความสาธารณะ QueryById (Long ID); รายการสาธารณะ <บทความ> queryarticlesBypage (@param ("บทความ") บทความบทความ, @param ("pagesize") int pageize, @param ("Offset") int Offset);}อินเทอร์เฟซนี้กำหนดวิธีการชั่วคราวเพียงสี่วิธีเท่านั้นคือการเพิ่มการอัปเดตและการสืบค้นตาม ID และการแบ่งแยก นี่คืออินเทอร์เฟซและคล้ายกับ JPA ดังนั้นคุณไม่จำเป็นต้องใช้คลาส ต่อไปเราเขียนไฟล์ XML:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" namespace = "com.pandy.blog.dao.articlemapper"> <resultmap id = "articlemap" type = "com.pandy.blog.po.article"> <id column = "id" property = "id" jdbctype = "integer"/> column = "summary" property = "summary" jdbctype = "varchar"/> <result column = "user_id" คุณสมบัติ = "userId" jdbcType = "จำนวนเต็ม"/> <result column = "สถานะ" property = "สถานะ" jdbctype = "Integer"/> column = "update_time" คุณสมบัติ = "updateTime" jdbctype = "timestamp"/> <result column = "public_time" คุณสมบัติ = "publictime" jdbctype = "timestamp"/> </resultmap> <sql id = "base_column" id = "insertarticle" parameterType = "บทความ"> แทรกลงใน tb_article (<รวม refid = "base_column"/>) ค่า (#{title},#{summary},#{userid},#{สถานะ},#{createTime} parameterType = "บทความ"> อัปเดต tb_article <et> <ถ้า test = "title! = null"> title = #{title}, </ถ้า> <ถ้า test = "summary! = null"> summary = #{summary}, </if> <if test = "สถานะ null" #{publictime}, </if> <ถ้า test = "updateTime! = null"> update_time = #{updateTime}, </if> </set> โดยที่ id = #{id} </update> <select id = "queryById" tb_article โดยที่ id = #{id} </select> <select id = "queryarticlesBypage" resultmap = "articleMap"> เลือก id, <รวม refid = "base_column"> </include> จาก tb_article <โดยที่> <ถ้า test = " test = "article.UserId! = null"> user_id = #{plicane.UserId} </if> </โดยที่> จำกัด #{ออฟเซ็ต}, #{pagesize} </select> </mapper>ในที่สุดเราจำเป็นต้องระบุแพ็คเกจที่สแกนโดย Mapper:
@springbootapplication@mapperscan ("com.pandy.blog.dao") แอปพลิเคชันระดับสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) โยนข้อยกเว้น {springapplication.run (application.class, args); -ตกลงการรวมกับ mybatis เสร็จสมบูรณ์แล้วลองทดสอบอีกครั้ง:
@runwith (springjunit4classrunner.class) @springboottest (classes = application.class) Public Class ArticleMapperTest {@autowired Private Articlemapper Mapper; @Test โมฆะสาธารณะทดสอบ () {บทความบทความ = บทความใหม่ (); บทความ Settitle ("Test Title 2"); บทความ. setsummary ("การทดสอบสรุป 2"); บทความ SetUserID (1L); บทความ SetStatus (1); บทความ SetCreateTime (วันที่ใหม่ ()); บทความ SetUpDatetime (วันที่ใหม่ ()); บทความ SetPublictime (วันที่ใหม่ ()); mapper.insertarticle (บทความ); } @Test โมฆะสาธารณะ TestMyBatisQuery () {บทความบทความ = mappper.QueryById (1L); assertNotNull (บทความ); } @Test โมฆะสาธารณะ testUpDate () {บทความบทความ = mappper.QueryById (1L); บทความ SetPublictime (วันที่ใหม่ ()); บทความ SetUpDatetime (วันที่ใหม่ ()); บทความ SetStatus (2); mapper.updatearticle (บทความ); } @Test Public Void TestQueryByPage () {บทความบทความ = บทความใหม่ (); บทความ SetUserID (1L); รายการ <บทความ> list = mapper.QueryArticlesByPage (บทความ, 10,0); assertTrue (list.size ()> 0); -5. สรุป
บทความนี้แสดงให้เห็นถึงการรวมกันของการบูตฤดูใบไม้ผลิกับ JDBCTEMPLATE, JPA และ MyBatis โดยรวมการกำหนดค่าค่อนข้างง่าย นักเรียนที่เคยกำหนดค่าที่เกี่ยวข้องมาก่อนควรรู้สึกว่าเห็นได้ชัด Spring Boot ได้ให้ความช่วยเหลือที่ดีแก่เราในเรื่องนี้ ในบทความที่ตามมาเราจะใช้ mybatis เพื่อดำเนินการฐานข้อมูลเท่านั้น อีกสิ่งหนึ่งที่ควรทราบที่นี่คือการสืบค้นการเล่นหน้าของ MyBatis ถูกเขียนด้วยลายมือที่นี่ การปนเปื้อนนี้สามารถเสร็จสิ้นผ่านปลั๊กอินระหว่างการพัฒนาอย่างเป็นทางการ แต่สิ่งนี้ไม่เกี่ยวข้องกับการบูตฤดูใบไม้ผลิดังนั้นบทความนี้ใช้วิธีการใช้คู่มือนี้ชั่วคราวเพื่อทำการประมวลผลการปนเปื้อน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น