Dalam artikel sebelumnya, prinsip -prinsip dasar dan penggunaan boot musim semi telah dijelaskan melalui program HelloWorld sederhana. Artikel ini terutama menjelaskan cara mengakses database melalui boot musim semi. Artikel ini akan menunjukkan tiga cara untuk mengakses database. Yang pertama adalah JDBCtemplate, yang kedua adalah JPA, dan yang ketiga adalah Mybatis. Seperti yang disebutkan sebelumnya, seri ini akan menggunakan sistem blog sebagai dasar untuk penjelasan, jadi artikel ini akan menjelaskan penyimpanan dan akses artikel (tetapi tidak termasuk rincian artikel). Karena implementasi akhir diselesaikan melalui MyBatis, hanya demonstrasi sederhana JDBCtemplate dan JPA yang akan dibuat, dan bagian MyBatis akan sepenuhnya menerapkan penambahan, penghapusan, modifikasi, dan pencarian artikel.
1. Persiapan
Sebelum menunjukkan metode ini, Anda perlu menyiapkan sesuatu terlebih dahulu. Yang pertama adalah database. Sistem ini diimplementasikan menggunakan MySQL. Kita perlu membuat tabel tb_article terlebih dahulu:
Jatuhkan tabel jika ada `tb_article`; buat tabel` tb_article` (`id` bigint (20) bukan null auto_increment,` title` varchar (255) bukan null default '', `ringkasan` varchar (1024) bukan null default '', status` status` int (11), non -null (tidak ada null `noul` not `not` not `not` noul ` bigint(20) NOT NULL DEFAULT '0', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `public_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Dalam demonstrasi berikutnya, tabel ini akan ditambahkan, dihapus, dimodifikasi dan diperiksa. Anda harus melihat bahwa tidak ada detail artikel di tabel ini. Alasannya adalah bahwa rincian artikel ini relatif panjang. Jika ditempatkan di tabel ini, itu akan dengan mudah mempengaruhi efisiensi menanyakan daftar artikel, sehingga rincian artikel akan disimpan di tabel lain secara terpisah. Selain itu, kita perlu mengonfigurasi kumpulan koneksi database. Di sini kami menggunakan kumpulan koneksi Druid. Selain itu, file konfigurasi dikonfigurasi menggunakan YAML, yaitu, Application.yml (Anda juga dapat menggunakan file konfigurasi application.properties. Tidak ada perbedaan besar. Jika Anda tidak terbiasa dengan YMAL dan tertarik, Anda dapat memeriksanya, yang relatif sederhana). Konfigurasi kumpulan koneksi adalah sebagai berikut:
Spring: DataSource: URL: JDBC: mysql: //127.0.0.1: 3306/blog? UseUnicode = true & characterencoding = UTF-8 & usessl = False DriverClassName: com.mysql.jdbc.driver nama pengguna: Root Kata Sandi: 123456 Tipe: COM.MYSQL.JDBC.DRIVER Username: Root Award: 123456 Tipe: COM.MYSQL.JDBC.DRIVER Username: Root Award: 123456 TYPE: COM.MYSQL.JDBC.DRIVER Username: Root Award: 123456 TYPE: COM.MYSQL.JDBC.
Akhirnya, kita juga perlu membuat kelas POJO yang sesuai dengan database, kodenya adalah sebagai berikut:
artikel kelas publik {private long ID; judul string pribadi; ringkasan string pribadi; createTime tanggal pribadi; PublicTime tanggal pribadi; pembaruan tanggal pribadi; Userid panjang pribadi; status bilangan bulat pribadi; tipe bilangan bulat pribadi;}Oke, hanya itu pekerjaan yang perlu Anda persiapkan, dan sekarang mulai mengimplementasikan operasi basis data.
2. Integrasi dengan JDBCtemplate
Pertama, pertama -tama kami mengakses database melalui JDBCtemplate. Di sini kami hanya menunjukkan penyisipan data. Seperti yang disebutkan dalam artikel sebelumnya, Spring Boot menyediakan banyak starter untuk mendukung berbagai fungsi. Untuk mendukung JDBCtemplate, kita hanya perlu memperkenalkan starter berikut:
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-jdbc </artifactid> </dependency>
Sekarang kita dapat mengimplementasikan penyisipan data melalui jdbctemplate:
antarmuka publik articledao {long sersertarticle (artikel artikel);} @RepositoryPublic kelas ArticledaojdBctemplateImpl mengimplementasikan articledao {@autowired private namedparameterjdbctemplate jdbctemplate; @Override Public Long InsertArticle (artikel artikel) {string sql = "masukkan ke tb_article (judul, ringkasan, user_id, create_time, public_time, update_time, status)" + "values (: title ,: ringkasan ,: userid ,: createTime ,: publicTime ,: updateTime ,: status)"; Peta <string, object> param = hashmap baru <> (); param.put ("title", artikel.gettitle ()); param.put ("ringkasan", artikel.getSummary ()); param.put ("userid", artikel.getUserId ()); param.put ("status", artikel.getStatus ()); param.put ("createTime", artikel.getCreateTime ()); param.put ("createTime", artikel.getCreateTime ()); param.put ("publicTime", artikel.getPublicTime ()); param.put ("updateTime", artikel.getupDateTime ()); return (long) jdbctemplate.update (sql, param); }}Kami menggunakan JUnit untuk menguji kode di atas:
@Runwith (springjunit4classrunner.class) @springboottest (class = application.class) kelas publik articledaotest {@autowired private articledao articledao; @Test public void testInsert () {artikel artikel = artikel baru (); artikel.settitle ("judul tes"); artikel.setsummary ("Ringkasan Uji"); artikel.setUserId (1L); artikel.setstatus (1); artikel.setCreateTime (tanggal baru ()); artikel.setupDateTime (tanggal baru ()); artikel.setPublicTime (tanggal baru ()); Articledao.insertarticle (artikel); }}Untuk mendukung program pengujian di atas, Anda juga perlu memperkenalkan starter:
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> spring-boot-starter-test </t Artifactid> <scope> tes </seupop> </dependency>
Dari kode di atas, kita dapat melihat bahwa pada kenyataannya, pada dasarnya tidak ada konfigurasi kecuali untuk pengenalan JDBC Start. Ini adalah proses konfigurasi otomatis boot musim semi. Kode di atas perlu memperhatikan lokasi kelas aplikasi. Kelas ini harus ditempatkan di paket induk kelas DAO. Misalnya, DAO terletak di paket com.pandy.blog.dao. Sekarang kami memindahkan kelas application.java dari paket com.pandy.blog ke paket com.pandy.blog, dan kesalahan berikut akan muncul:
Disebabkan oleh: org.springframework.beans.factory.nosuchbeandefinitionException: tidak ada kacang kualifikasi tipe 'com.pandy.blog.dao.articledao' tersedia: diharapkan setidaknya 1 kacang yang memenuhi syarat sebagai kandidat autowire. Anotasi ketergantungan: {@org.springframework.beans.factory.annotation.Autowired (wajib = true)} di org.springframework.beans.factory.support.defaultListableBeanFactory.RaisenOMatchingBeanFound (defaultListableBeanFacPory.RaisEnoMatchingBeArd (defaultListableBeanFacCory.RaisEnoMatching.defaultListableAbeanFacorctory.RaiseMatching org.springframework.beans.factory.support.defaultListableBeanFactory.Doresolvedependency (defaultListableBeanFactory.java:1104) di org.springframework.beans.factory.support.defaultListableBeanFactory.Resolvedependency (defaultListableBeanFactory.java:1066) di org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutoWiriredFieldElement.Inject (AutoWirirEnnotationBeanPostProcessor.java:585) ... 28Dengan kata lain, implementasi Articledao tidak dapat ditemukan. Apa alasannya? Dalam posting blog sebelumnya, kami telah melihat bahwa anotasi @springbootApplication mewarisi @ComponentScan, yang hanya memindai paket dan subpackage di mana kelas aplikasi terletak secara default. Oleh karena itu, untuk kesalahan di atas, selain menjaga kelas aplikasi dalam paket induk DAO, Anda juga dapat menentukan paket yang dipindai untuk dipecahkan:
@SpringbootApplication@componentscan ({"com.pandy.blog"}) Aplikasi kelas publik {public static void main (string [] args) melempar Exception {springApplication.run (application.class, args); }}3. Integrasi dengan JPA
Sekarang kita akan mulai menjelaskan cara mengimplementasikan operasi basis data melalui JPA. Ini masih mirip dengan jdbctemplate. Pertama, kita perlu memperkenalkan starter yang sesuai:
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-data-jpa </t Artifactid> </gandendency>
Maka kita perlu menambahkan anotasi entitas ke kelas POJO dan menentukan nama tabel (jika tidak ditentukan, nama tabel default adalah artikel), dan kemudian kita perlu menentukan ID dan strategi pembuatannya. Ini semua adalah pengetahuan JPA dan tidak ada hubungannya dengan Spring Boot. Jika Anda tidak terbiasa dengan itu, Anda dapat melihat poin pengetahuan JPA:
@Entity (name = "tb_article") Artikel kelas publik {@id @generatedValue Private Long ID; judul string pribadi; ringkasan string pribadi; createTime tanggal pribadi; PublicTime tanggal pribadi; pembaruan tanggal pribadi; Userid panjang pribadi; status bilangan bulat pribadi;}Akhirnya, kita perlu mewarisi kelas JParepository. Di sini kami menerapkan dua metode kueri. Yang pertama adalah kueri yang sesuai dengan spesifikasi penamaan JPA. JPA akan secara otomatis membantu kami menyelesaikan pembuatan pernyataan kueri. Cara lain adalah mengimplementasikan JPQL (kueri seperti SQL yang didukung oleh JPA).
antarmuka publik Articlerepository memperluas jParePository <artikel, Long> {Daftar Publik <TARTENTER> FindByUserId (Long UserId); @Query ("Pilih Seni dari com.pandy.blog.po.article Art Where Title =: Title") Daftar Publik <TARTENTER> QUERYBYTITLE (@param ("Judul") Judul String);}Oke, kita dapat menguji kode di atas lagi:
@Runwith (springjunit4classrunner.class) @springboottest (class = application.class) kelas publik articlerepositorytest {@Autowired private articlerePository articlerepository; @Test public void testQuery () {List <RALTICTER> articLeList = ArticLerepository.QueryByTitle ("Test Title"); asserttrue (articlelist.size ()> 0); }}Perhatikan bahwa masih ada masalah yang mirip dengan jdbctemplate di sini. Anda perlu membuat kelas startup aplikasi tidak dalam paket induk kelas respositori dan entitas, jika tidak kesalahan berikut akan muncul:
Disebabkan oleh: org.springframework.beans.factory.nosuchbeandefinitionException: tidak ada kacang kualifikasi tipe 'com.pandy.blog.dao.articlerepository' tersedia: diharapkan setidaknya 1 kacang yang memenuhi syarat sebagai kandidat autowire. Anotasi ketergantungan: {@org.springframework.beans.factory.annotation.Autowired (wajib = true)} di org.springframework.beans.factory.support.defaultListableBeanFactory.RaisenOMatchingBeanFound (defaultListableBeanFacPory.RaisEnoMatchingBeArd (defaultListableBeanFacCory.RaisEnoMatching.defaultListableAbeanFacorctory.RaiseMatching org.springframework.beans.factory.support.defaultListableBeanFactory.Doresolvedependency (defaultListableBeanFactory.java:1104) di org.springframework.beans.factory.support.defaultListableBeanFactory.Resolvedependency (defaultListableBeanFactory.java:1066) di org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutoWiriredFieldElement.Inject (AutoWirirEnnotationBeanPostProcessor.java:585) ... 28Tentu saja, Anda juga dapat menentukan paket JPA yang dipindai dengan menganotasi @enableJparepositories, tetapi masih tidak berhasil, dan kesalahan berikut akan muncul:
Disebabkan oleh: java.lang.illegalargumentException: bukan tipe terkelola: kelas com.pandy.blog.po.article di org.hibernate.jpa.internal.metamodel.metamodelimpl.ManagedType (MetAmodelImpl .java:210) di org.springframework.data.jpa.repository.support.jpametamodelentityInformation. <inin> (jpametamodelentityInformation.java:70) di org.springframework.data.jpa.repository.support.jpaentityInformationsupport.getEntityInformation (jpaentityInformationsupport.java:68) di org.springframework.data.jpa.repository.support.jparepositoryFactory.getEntityInformation (jParepositoryFactory.java:153) di org.springframework.data.jpa.repository.support.jparepositoryFactory.getTargetRepository (jParepositoryFactory.java:100) di org.springframework.data.jpa.repository.support.jparepositoryFactory.getTargetRepository (jParepositoryFactory.java:82) di org.springframework.data.repository.core.support.repositoryFactorySupport.getRepository (repositoryFactorySupport.java:199) di org.springframework.data.repository.core.support.RepositoryFactoryBeansupport.InitAndReturn (RepositoryFactoryBeansupport.java:277) di org.springframework.data.repository.core.support.RepositoryFactoryBeansupport.AfterPropertiesset (RepositoryFactoryBeansupport.java:263) di org.springframework.data.jpa.repository.support.jparepositoryfactorybean.afterpropertiesset (jparepositoryfactorybean.java:101) di org.springframework.beans.factory.support.AbstractAutoweCableBeanFactory.InvokeInitMethods (AbstractAutowIrecapableBeanFactory.java:1687) di org.springframework.beans.factory.support.AbstractAutoweCableBeanFactory.InitializeBean (AbstractAutowIcapableBeanFactory.java:1624) ... 39
Kesalahan ini menunjukkan bahwa entitas tidak dapat dikenali, jadi Anda juga perlu menentukan paket entitas dengan menganotasi @EntityScan. Konfigurasi akhir adalah sebagai berikut:
@SpringbootApplication@componentscan ({"com.pandy.blog"})@enableJparePositories (basepackages = "com.pandy.blog")) entityscan ("com.pandy.blog") aplikasi kelas public {public static main (string [] args) {argapplicing (string), argaplication {publiclication {public void Main (string [] args) lemparan {argapplicing. }}4. Integrasi dengan mybatis
Akhirnya, mari kita lihat cara mencapai akses basis data melalui mybatis. Demikian pula, kita masih perlu memperkenalkan starter:
<dependency> <GroupId> org.mybatis.spring.boot </groupId> <ArTifactId> mybatis-spring-boot-starter </RaintifactId> <Version> 1.1.1 </versi> </dependency>
Karena starter tidak secara resmi disediakan oleh Spring Boot, nomor versi tidak konsisten dengan Spring Boot dan perlu ditentukan secara manual.
Mybatis umumnya dapat menentukan SQL yang mengoperasikan database melalui XML atau anotasi. Secara pribadi, saya lebih suka XML, jadi artikel ini hanya menunjukkan mengakses basis data melalui XML. Pertama, kita perlu mengkonfigurasi direktori mapper. Kami mengonfigurasinya di application.yml:
mybatis: config-locations: mybatis/mybatis-config.xml mapper-locations: mybatis/mapper/*. xml tipe-aliases-package: com.pandy.blog.po
Konfigurasi di sini terutama mencakup tiga bagian, satu adalah beberapa konfigurasi mybatis itu sendiri, seperti alias untuk tipe dasar. Yang kedua adalah menentukan lokasi file mapper, dan yang ketiga adalah alias untuk kelas pojo. Konfigurasi ini juga dapat diimplementasikan melalui konfigurasi Java. Karena masalah ruang, saya tidak akan menjelaskan secara rinci di sini. Teman yang tertarik dapat mengimplementasikannya sendiri.
Setelah konfigurasi, pertama -tama kami menulis antarmuka mapper:
Articlemapper Antarmuka Publik {Public Long InsertArticle (artikel artikel); public void updateArticle (artikel artikel); Artikel Publik QueryById (Long ID); DAFTAR UMUM <TARTENTER> Artikel QueryArticlesByPage (@param ("Artikel"), @param ("halaman") int pageSize, @param ("offset") int offset);}Antarmuka ini sementara hanya mendefinisikan empat metode, yaitu, menambah, memperbarui, dan menanyakan berdasarkan ID dan pagination. Ini adalah antarmuka, dan mirip dengan JPA, sehingga Anda tidak perlu mengimplementasikan kelas. Selanjutnya kami menulis file XML:
<? Xml Version = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// 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" properti = "ID" jdbctype = "integer"/<hasil kolom hasil = "judul" "judul" "JDBCTYPE =" integer "/<columning =" judul "" property="summary" jdbcType="VARCHAR"/> <result column="user_id" property="userId" jdbcType="INTEGER"/> <result column="status" property="status" jdbcType="INTEGER"/> <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/> <result column="update_time" property="updateTime" jdbctype = "timestamp"/> <hasil kolom = "public_time" properti = "publicTime" jdbctype = "timestamp"/> </resultMap> <sql id = "base_column"> title, ringkasan, status, create_time, update_time, public_time </sql> <sisipan iD = "PARUSTICLE" "PARAMLET" PARUSTICE = "PUTASTER_TIME </SQL> <SERVARION =" PULATICLE "" refid="base_column"/>) VALUE (#{title},#{summary},#{userId},#{status},#{createTime},#{updateTime},#{publicTime}) </insert> <update id="updateArticle" parameterType="Article"> UPDATE tb_article <set> <if test="title != null"> title = #{title}, </if> <if test = "ringkasan! = null"> ringkasan = #{ringkasan}, </if> <if test = "status! = null"> status = #{status}, </if> <if test = "publicTime! = null"> public_time = #{publicTime, </if test = "ifeT> if! = null"> public_time = #{publicTime, </nulling = "ifEnpen> ifEnpe> ifEnt> ifEnt> null"> public_time = #{publicTime}}} </if ifeT> if! #{UpdateTime}, </if> </atur> where id = #{id} </dendate> <pilih id = "queryById" parameterType = "long" resultMap = "articlemap"> pilih id, <include refid = "base_column"> </include> dari tb_article di mana id {{{{{{{{query {query {query {query {query {query {query {query/{query/{query {query. resultMap = "Articlemap"> Pilih id, <include refid = "base_column"> </incert> dari tb_article <where> <if test = "artikel.title! = null"> judul seperti concat ('%', $ {artikel.title}, '%') </if> <if test = "artikel. </if> </dens> limit #{offset}, #{pagesize} </ pilih> </mapper>Akhirnya, kita perlu menentukan secara manual paket yang dipindai oleh mapper:
@SpringbootApplication@mapperscan ("com.pandy.blog.dao") Aplikasi kelas publik {public static void main (string [] args) melempar Exception {springApplication.run (application.class, args); }}Oke, integrasi dengan mybatis juga selesai, mari kita uji lagi:
@Runwith (springjunit4classrunner.class) @springboottest (class = application.class) kelas publik articlemappertest {@autowired private articlemapper mapper; @Test public void testInsert () {artikel artikel = artikel baru (); Article.settitle ("Tes Judul 2"); artikel.setsummary ("Ringkasan Uji 2"); artikel.setUserId (1L); artikel.setstatus (1); artikel.setCreateTime (tanggal baru ()); artikel.setupDateTime (tanggal baru ()); artikel.setPublicTime (tanggal baru ()); mapper.insertarticle (artikel); } @Test public void testMyBatisQuery () {artikel artikel = mappper.queryById (1L); Assertnotnull (artikel); } @Test public void testUpdate () {artikel artikel = mappper.querybyId (1L); artikel.setPublicTime (tanggal baru ()); artikel.setupDateTime (tanggal baru ()); artikel.setstatus (2); mapper.updateArticle (artikel); } @Test public void testQueryByPage () {artikel artikel = artikel baru (); artikel.setUserId (1L); Daftar <Artikel> daftar = mapper.queryArticleSbyPage (artikel, 10,0); asserttrue (list.size ()> 0); }}5. Ringkasan
Artikel ini menunjukkan integrasi boot musim semi dengan JDBCtemplate, JPA dan Mybatis. Secara keseluruhan, konfigurasinya relatif sederhana. Siswa yang telah melakukan konfigurasi terkait sebelumnya harus merasa jelas. Spring Boot memang memberi kami bantuan besar dalam hal ini. Dalam artikel selanjutnya, kami hanya akan menggunakan MyBatis untuk melakukan operasi basis data. Hal lain yang perlu diperhatikan di sini adalah bahwa kueri pagination Mybatis ditulis tangan di sini. Pagination ini dapat diselesaikan melalui plug-in selama pengembangan formal, tetapi ini tidak ada hubungannya dengan Spring Boot, jadi artikel ini sementara menggunakan metode manual ini untuk melakukan pemrosesan pagination.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.