前の記事では、Spring Bootの基本原則と使用が、単純なHelloworldプログラムを通じて説明されています。この記事では、主にSpring Bootを介してデータベースにアクセスする方法について説明します。この記事では、データベースにアクセスする3つの方法を示します。 1つ目はjdbctemplate、2つ目はjpa、3番目はmybatisです。前述のように、このシリーズはブログシステムを説明の基礎として使用するため、この記事では記事のストレージとアクセスについて説明します(ただし、記事の詳細は含まれていません)。最終実装はMyBatisを介して完了するため、JDBCTEMPLATEとJPAの簡単なデモのみが作成され、MyBatisパートは記事の追加、削除、変更、および検索を完全に実装します。
1。準備
これらの方法を示す前に、最初に何かを準備する必要があります。 1つ目はデータベースです。このシステムは、MySQLを使用して実装されています。最初にtb_articleテーブルを作成する必要があります:
テーブルをドロップする場合は `tb_article`;作成テーブル` tb_article`( `id` bigint(20)null auto_increment、` title` varchar(255)not null default ''、 `summary` varchar(1024)not null default '' '' '' '、` null default` int(11) bigint(20)not noll default '0'、 `create_time`タイムスタンプはnull null default current_timestamp、` update_time`タイムスタンプなしデフォルトcurrent_timestamp、 `public_timestamp not null default current_timestamp、プライマリキー(` id`))エンジン= innodb charset = utf8;
その後のデモでは、このテーブルが追加、削除、変更、およびチェックされます。この表には記事の詳細がないことがわかります。その理由は、記事の詳細が比較的長いためです。このテーブルに配置すると、記事リストのクエリの効率に簡単に影響するため、記事の詳細は別のテーブルに個別に保存されます。さらに、データベース接続プールを構成する必要があります。ここでは、Druid接続プールを使用します。さらに、構成ファイルはYAML、つまりApplication.ymlを使用して構成されます(Application.Properties Configurationファイルも使用できます。大きな違いはありません。YMALに慣れておらず、興味がある場合は、比較的簡単です)。接続プールの構成は次のとおりです。
春:DataSource:URL:JDBC:mysql://127.0.0.1:3306/blog?useunicode = true&charturecoding = utf-8&usessl = false driverclassname:com.mysql.jdbc.driver username:root passwar
最後に、データベースに対応するPOJOクラスを確立する必要があります。コードは次のとおりです。
パブリッククラス記事{プライベートロングID;プライベートストリングタイトル。プライベート文字列の概要。プライベートデートCreateTime;プライベートデートパブリック;プライベートデートアップデートタイム;プライベートロングユーザーID;プライベート整数ステータス。プライベート整数タイプ;}わかりました、それはあなたが準備するために必要なすべての作業であり、今ではデータベース操作の実装を開始します。
2。JDBCTEMPLATEとの統合
まず、JDBCTEMPLATEを介してデータベースにアクセスします。ここでは、データの挿入のみを示します。前の記事で述べたように、Spring Bootはさまざまな機能をサポートするために多くのスターターを提供します。 JDBCTEMPLATEをサポートするには、次のスターターを紹介するだけです。
<Dependency> groupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-jdbc </artifactid> </dependency>
これで、jdbctemplateを介してデータ挿入を実装できます。
パブリックインターフェイスarticledao {long insertarticle(記事記事);} @repositorypublic class articledaojdbctemplateimpl articledao {@autowired private namedparameterjdbctemplate jdbctemplate; @Override public long InsertArticle(記事記事){string sql = "tb_articleに挿入(タイトル、summary、user_id、create_time、public_time、upputient_time、status)" + "values(:summary、:userid、:createtime、:publictime、:updateTime、::status)"; map <string、object> param = new Hashmap <>(); param.put( "title"、article.getTitle()); param.put( "summary"、article.getSummary()); param.put( "userid"、article.getuserid()); param.put( "status"、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)public class articledaotest {@autowired private articledao articledao; @test public void testinsert(){記事記事= new article(); article.settitle( "テストタイトル"); article.setsummary( "Test Summary"); article.setuserid(1L); article.setstatus(1); article.setcreatetime(new date()); article.setupDateTime(new Date()); article.setpublictime(new Date()); articledao.insertarticle(記事); }}上記のテストプログラムをサポートするには、スターターも紹介する必要があります。
<Dependency> groupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-test </artifactid> <scope> test </scope> </dependency>
上記のコードから、実際には、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'の適格なBeanはありません:Autowire候補としての資格がある少なくとも1つのBeanが予想されます。依存関係アノテーション:{@org.springframework.beans.factory.annotation.autowired(必須= true)} org.springframework.beans.factory.support.defaultabablebeanfactory.raisenomatchingbeanfound(defaultlistablebeanfactory.java:1493) org.springframework.beans.factory.support.defaultablebeanfactory.doreSolvedenty(defaultlistablebeanfactory.java:1104)at org.springframework.beans.factory.Support.Duport.DefaultabableBeanFactory.ResolVedency org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor $ autowiredfieldelement.inject(autowiredannotationbeanpostprocessor.java:585)... 28詳細言い換えれば、Articledaoの実装は見つかりません。理由は何ですか?前のブログ投稿では、Annotation @SpringBootApplicationが@ComPonentsCanを継承していることがわかりました。これは、アプリケーションクラスがデフォルトで配置されているパッケージとサブパッケージのみをスキャンします。したがって、上記のエラーの場合、DAOの親パッケージにアプリケーションクラスを保持することに加えて、次のようにスキャンされたパッケージを指定することもできます。
@SpringBootApplication@componentscan({"com.pandy.blog"})public class application {public static void main(string [] args)throws {springApplication.run(application.class、args); }}3。JPAとの統合
次に、JPAを介してデータベース操作を実装する方法を説明し始めます。 JDBCtemplateにまだ似ています。まず、対応するスターターを紹介する必要があります。
<Dependency> groupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-data-jpa </artifactid> </dependency>
次に、Entity AnnotationをPOJOクラスに追加し、テーブル名(指定されていない場合はデフォルトのテーブル名が記事です)を指定する必要があり、その後、IDとその生成戦略を指定する必要があります。これらはすべてJPAの知識であり、Spring Bootとは何の関係もありません。あなたがそれに慣れていないなら、あなたはJPAの知識ポイントを見ることができます:
@Entity(name = "tb_article")パブリッククラス記事{@id @generatedValue private long id;プライベートストリングタイトル。プライベート文字列の概要;プライベートデートCreateTime;プライベートデートパブリック;プライベートデートアップデートタイム;プライベートロングユーザーID;プライベート整数ステータス;}最後に、JParePositoryクラスを継承する必要があります。ここでは、2つのクエリメソッドを実装します。 1つ目は、JPAネーミング仕様に準拠するクエリです。 JPAは、クエリステートメントの生成を自動的に完了するのに役立ちます。もう1つの方法は、JPQL(JPAがサポートするSQLのようなクエリ)を実装することです。
パブリックインターフェイスarticlerepository拡張jparepository <article、long> {public list <ports> findbyuserid(long userid); @Query( "com.pandy.blog.po.article art where where where where where where where where")public list <portion> querybytitle(@param( "title")string title);}わかりました、上記のコードをもう一度テストできます。
@runwith(springjunit4classrunner.class)@springboottest(classes = application.class)public class articlerepositorytest {@autowired private articlerepository articlerepository; @test public void testquery(){list <portion> articleList = articlerepository.querybytitle( "test title"); asserttrue(articlelist.size()> 0); }}JDBCTEMPLATEと同様の問題がここにあることに注意してください。 RespositoryおよびEntityクラスの親パッケージではなく、アプリケーションスタートアップクラスを作成する必要があります。そうしないと、次のエラーが表示されます。
原因:org.springframework.beans.factory.nosuchbeandefinitionexception:タイプ 'com.pandy.blog.dao.articlerepository'利用可能:Autowireの候補者としての資格がある少なくとも1つのBeanの適格なBeanはありません。依存関係アノテーション:{@org.springframework.beans.factory.annotation.autowired(必須= true)} org.springframework.beans.factory.support.defaultabablebeanfactory.raisenomatchingbeanfound(defaultlistablebeanfactory.java:1493) org.springframework.beans.factory.support.defaultablebeanfactory.doreSolvedenty(defaultlistablebeanfactory.java:1104)at org.springframework.beans.factory.Support.Duport.DefaultabableBeanFactory.ResolVedency org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor $ autowiredfieldelement.inject(autowiredannotationbeanpostprocessor.java:585)... 28詳細もちろん、@enableJparePositoriesに注釈を付けてスキャンされたJPAパッケージを指定することもできますが、それでも機能せず、次のエラーが表示されます。
原因:java.lang.illegalargumentexception:マネージドタイプではありません:クラスcom.pandy.blog.po.article at org.hibernate.jpa.internal.metamodel.metamodelimpl.managetype(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)at org.springframework.data.jpa.repository.support.jparepositoryfactory.getTargetRepository(jparepositoryfactory.java:100)at org.springframework.data.jpa.repository.support.jparepositoryfactory.getTargetRepository(jparepositoryfactory.java:82)at org.springframework.data.repository.core.support.repositoryfactorysupport.getRepository(RepositoryFactorySupport.java:199)at org.springframework.data.repository.core.support.repositoryfactorybeansupport.initandreturn(repositoryfactorybeansupport.java:277)at org.springframework.data.repository.core.support.repositoryfactorybeansupport.afterpropertiesset(repositoryfactorybeansupport.java:263)at org.springframework.data.jpa.repository.support.jparepositoryfactorybean.afterpropertiesset(jparepositoryfactorybean.java:101)at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.invokeInitmethods(abstractautowirecapabababebeanfactory.java:1687)at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean(abstractautowirecapablebeanfactory.java:1624)... 39以上
このエラーは、エンティティを認識できないことを示しているため、@entityscanに注釈を付けてエンティティパッケージを指定する必要もあります。最終的な構成は次のとおりです。
@SpringBootApplication@componentscan({"com.pandy.blog"})@enablejparepositories(basepackages = "com.pandy.blog")@entityscan( "com.pandy.blog")public class application {public static void main(string [] args); }}4。MyBatisとの統合
最後に、MyBatisを介してデータベースアクセスを実現する方法を見てみましょう。同様に、スターターを紹介する必要があります。
<Dependency> groupId> org.mybatis.spring.boot </groupid> <artifactid> mybatis-spring-boot-starter </artifactid> <バージョン> 1.1.1 </version> </dependency>
スターターはSpring Bootによって正式に提供されていないため、バージョン番号はSpring Bootと矛盾しているため、手動で指定する必要があります。
MyBatisは通常、XMLまたは注釈を介してデータベースを操作するSQLを指定できます。個人的には、私はXMLを好むので、この記事ではXMLを介したデータベースへのアクセスのみを示しています。まず、Mapperディレクトリを構成する必要があります。 application.ymlで構成します:
mybatis:config-locations:mybatis/mybatis-config.xml mapper-locations:mybatis/mapper/*。xml type-aliase-package:com.pandy.blog.po
ここでの構成には、主に3つの部分が含まれています。1つは、基本タイプのエイリアスなど、MyBatis自体の構成です。 2つ目は、マッパーファイルの場所を指定することで、3番目はPojoクラスのエイリアスです。この構成は、Java構成を介して実装することもできます。スペースの問題のため、ここでは詳しく説明しません。興味のある友達は自分でそれを実装できます。
構成後、最初にマッパーインターフェイスを書きます。
public Interface articlemapper {public long insertarticle(記事記事); public void updatearticle(記事記事);公開記事querybyid(long id); public list <portion> queryarticlesbypage(@param( "article")記事記事、@param( "pagesize")int pagesize、@param( "offset")int offset);}このインターフェイスは、IDとページネーションに基づいて、追加、更新、およびクエリの4つのメソッドのみを一時的に定義します。これはインターフェイスであり、JPAに似ているため、クラスを実装する必要はありません。次に、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.blog.po.article"> <id column = "id" property = "id" jdbctype = "integer"/> <result column "プロパティ= "summary" jdbctype = "varchar"/> <result column = "user_id" property = "userid" jdbctype = "integer"/> <result column = "status" property = "status" jdbctype = "jdbctype =" jdbctype = "jdbctype ="プロパティ= "updatetime" jdbctype = "タイムスタンプ"/> <result column = "public_time" property = "publictime" jdbctype = "timestampe"/> </resultmap> <sql id = "base_column" parametertype = "article"> tb_articleに挿入(<include refid = "base_column"/>)value(#{title}、#{summary}、#{userId}、#{status}、{createtime}、#{uppatime}、#{publictime}) tb_article <set> <if test = "title!= null"> title =#{title}、</if> <if> <if> "summary!= null"> summary =#{summary}、</if> <if> <"status!= null"> status =#{status}、</> <if> <publicime!= null "> null" <if test = "updatetime!= null"> update_time =#{updateTime}、</if> </set> where id =#{id} </update> <select id = "querybyid" parametertype = "long" resultmap = "articlemap"> select id、< </select> <選択id = "queryarticlesbypage" resultmap = "articlemap"> select id、<include base_column ">"> "> </inctrue> from tb_article <where>" if> "article.title!= null"> concat( '%'、$ {artion.title}、 '%') user_id =#{article.userid} </if> </where> limit#{offset}、#{pagesize} </select> </mapper>最後に、マッパーによってスキャンされたパッケージを手動で指定する必要があります。
@SpringBootApplication@mapperscan( "com.pandy.blog.dao")public class application {public static void main(string [] args)throws {springApplication.run(application.class、args); }}OK、MyBatisとの統合も完了しました。もう一度テストしましょう。
@runwith(springjunit4classrunner.class)@springboottest(classes = application.class)public class articlemappertest {@autowired private articlemapper mapper; @test public void testinsert(){記事記事= new article(); article.settitle( "テストタイトル2"); article.setsummary( "Test Summary 2"); article.setuserid(1L); article.setstatus(1); article.setcreatetime(new date()); article.setupDateTime(new Date()); article.setpublictime(new Date()); mapper.insertarticle(記事); } @test public void testmybatisquery(){article article = mappper.querybyid(1l); assertnotnull(記事); } @test public void testupdate(){article article = mappper.querybyid(1l); article.setpublictime(new Date()); article.setupDateTime(new Date()); article.setstatus(2); mapper.updatearticle(記事); } @test public void testquerybypage(){article article = new article(); article.setuserid(1L);リスト<portion> list = mapper.queryarticlesbypage(article、10,0); asserttrue(list.size()> 0); }}5。概要
この記事では、Spring BootとJDBCtemplate、JPA、MyBatisの統合を示しています。全体として、構成は比較的簡単です。以前に関連する構成を行ったことがある学生は、それが明らかであると感じるはずです。 Spring Bootは、この点で本当に大きな助けを提供してくれました。後続の記事では、MyBatisを使用してデータベース操作を実行します。ここで注意すべきもう1つのことは、Mybatisのページネーションクエリがここに手書きであることです。このページネーションは、正式な開発中にプラグインを介して完了することができますが、これはSpring Bootとは何の関係もないため、この記事ではこの手動方法を使用してページネーション処理を実行します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。