序文
この記事では、主に、MyBatis、Druid、PageHelperを統合し、複数のデータソースとページネーションを実装するSpringbootのストーリーについて説明しています。その中でも、SpringbootはMyBatisを統合しています。これは前の記事で説明されているので、ここではあまり説明しません。焦点は、複数のデータソースでDruidとPageHelperを構成する方法にあります。
ドルイドの紹介と使用
Druidを使用する前に、Druidを簡単に見てみましょう。
Druidはデータベース接続プールです。 Druidは、現在最高のデータベース接続プールと言えます!開発者は、優れた機能、パフォーマンス、スケーラビリティについて非常に好まれています。
DruidはAlibabaに600以上のアプリケーションを展開しており、1年以上にわたって生産環境での大規模な展開の厳密なテストを行ってきました。 Druidは、監視と呼ばれるAlibabaが開発したデータベース接続プールです!
同時に、ドルイドは単なるデータベース接続プールではなく、ドルイドのコアには主に3つの部分が含まれます。
ドルイドの主な機能は次のとおりです。
紹介については説明しません。詳細については、公式ドキュメントを参照してください。
次に、Druidの使用方法の紹介を始めましょう。
まず第一に、Maven依存関係は、Druid Jarを追加するだけです。
<Dependency> <GroupId> com.alibaba </groupId> <artifactid> druid </artifactid> <バージョン> 1.1.8 </version> </dependency>
構成に関しては、主なことは、application.propertiesまたはapplication.ymlに次のように追加することです。
注:ここでは2つのデータソースを使用しているため、少し異なります。 Druid構成の指示はすでに以下で詳しく説明されているため、ここでは説明しません。
##デフォルトのデータソースmaster.datasource.url = jdbc:mysql:// localhost:3306/springboot?useunicode = true&charatereCoding = utf8&applemmultiqueries = tru emaster.datasource.username = rootmaster.datasource.password = 123456master.datasource.driverclassname = com.mysql.jdbc.driver ##別のデータソースcluster.datasource.url = jdbc:mysql:// localhost:3306/springboot_test?useunicode = true&charaterencoding = utf8cluster.datasource.username = rootcluster.datasource.password = 123456Cluster.dataSOSORCE.DATASOSORCE.DATASOSORCE.DATASOSORCE.DATASOSORCE接続プールの構成情報#サイズの初期化、最小、最大spring.datasource.type = com.alibaba.druiddatasourcespring.datasource.datasource.datasource.datasource.datasource.minidle = 5 spring.datasource.maxactive = 20 spring.datasource.maxWait=60000 # Configure how long it takes to perform a detection interval to detect idle connections that need to be closed, in milliseconds spring.datasource.timeBetweenEvictionRunsMillis=60000 # Configure the minimum time to survive in the pool, in milliseconds spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationquery = selece 1 rfrom dual spring.datasource.testwhileidle = true spring.datasource.testonborrow = false spring.datasource.testonreturn = false#open pscache = spscache = spring.datasource.poolpreparedtatemention.poolpreparedtatementionのサイズを指定します。 spring.datasource.maxpoolpreparedStatementperconnectionSize = 20#監視統計のためのフィルターを設定します。削除した後、監視インターフェイスSQLをカウントできません。 「wall」はファイアウォールに使用されますspring.datasource.filters = stat、wall、log4j#connectpropertiesプロパティを介してmergesql関数を開きます。スローSQLレコードspring.datasource.connectionproperties = druid.stat.mergesql = true; druid.stat.slowsqlmillis = 5000
構成ファイルを正常に追加した後、Druid関連のクラスを記述しましょう。
まず、MasterDataSourceConfig.javaクラスは、デフォルトのデータソース構成クラスです。
@configuration@mapperscan(basepackages = masterdatasourceconfig.package、sqlsessionfactoryref = "mastersqlsessionfactory")public class masterdatasourceconfig {static final string package = "com.pancm.dao.master";静的最終文字列mapper_location = "classpath:mapper/master/*。xml"; @value( "$ {master.datasource.url}")private string url; @value( "$ {master.datasource.username}")private string username; @value( "$ {master.datasource.password}")プライベート文字列パスワード。 @value( "$ {master.datasource.driverclassname}")private string driverclassname; @value( "$ {spring.datasource.initialsize}")private int hientize; @value( "$ {spring.datasource.minidle}")private int minidle; @value( "$ {spring.datasource.maxactive}")private int maxactive; @value( "$ {spring.datasource.maxwait}")private int maxwait; @value( "$ {spring.datasource.timebetweenevictionrunsmillis}")private int timebetweenevictionrunsmillis; @value( "$ {spring.datasource.minevictableidletimemillis}")private int minevictableidletimemillis; @value( "$ {spring.datasource.validationQuery}")private string balidationquery; @value( "$ {spring.datasource.testhileidle}")private boolean testhiledle; @value( "$ {spring.datasource.testonborrow}")private boolean testonborrow; @value( "$ {spring.datasource.testonreturn}")private boolean testonreturn; @value( "$ {spring.datasource.poolpreparedStatements}")private boolean poolpreparedStatements; @value( "$ {spring.datasource.maxpoolpreparedstatementperconnectionsize}")private int maxpoolpreparedstatementperconnectionsize; @value( "$ {spring.datasource.filters}")プライベート文字列フィルター。 @value( "{spring.datasource.connectionProperties}")private string connectionProperties; @bean(name = "masterdatasource")@primary public datasource masterdatasource(){druiddatasource datasource = new Druiddatasource(); dataSource.seturl(url); DataSource.setUsername(username); dataSource.setPassWord(パスワード); DataSource.setDriverClassName(DriverClassName); //特定の構成DataSource.setInitialSize(InitialSize); DataSource.setMinidle(Minidle); DataSource.setMaxactive(maxactive); DataSource.setMaxWait(MaxWait); dataSource.settimebetweenevictionrunsmillis(timevethictionrunsmillis); dataSource.setMineVictableIdletimemillis(minevictableidletimemillis); dataSource.setValidationQuery(ValidationQuery); dataSource.settestwhileidle(testhiledle); dataSource.settestonborrow(testonborrow); DataSource.SetteStonreturn(TestOnreturn); DataSource.setPoolPreparedStatements(PoolPreparedStatements); DataSource.setMaxPoolPreparedStatementPerConnectionSize(MaxPoolPreparedStatementPerConnectionSize); try {dataSource.setFilters(フィルター); } catch(sqlexception e){e.printstacktrace(); } dataSource.setConnectionProperties(ConnectionProperties); DataSourceを返します。 } @bean(name = "MasterTransactionManager")@primary public datasourcetransactionmanager mastertransactionmanager(){return new DataSourcetransactionManager(MasterDataSource()); } @bean(name = "mastersqlsessionfactory")@primary public sqlsessionfactory mastersqlsessionfactory( @qualifier( "masterdatasource")datasource masterdatasource)スロー{final sqlsessionfactorybean sessionfactory = new sqlsessionfactorybean(); sessionfactory.setdatasource(masterdatasource); sessionfactory.setMapperLocations(new PathMatchingResourcePatterNRESOLVER().GETRESOURCES(MASTERDATASOURCECONFIG.MAPPER_LOCATION)); return sessionfactory.getObject(); }}これらの2つの注釈を以下で説明します。
**@プライマリ**:複数の類似した豆候補がある場合は、この豆をロゴ
優先度が考慮されます。複数のデータソースを構成するときは、主要なデータソースがあることに注意し、@Primaryを使用してBeanをマークする必要があります。
**@mapperscan **:マッパーインターフェイスとコンテナ管理をスキャンします。
SQLSessionFactoryRefは、SQLSessionFactoryのユニークなインスタンスを定義することを表していることに注意する必要があります。
上記の構成が完了すると、Druidを接続プールとして使用できます。ただし、ドルイドは単なる接続プールではありません。監視アプリケーションとも言えます。 Web監視インターフェイスが付属しており、SQL関連の情報を明確に確認できます。
SpringbootでDruidの監視機能を使用すると、登録サービスとフィルタリングルールを実装するために、StatViewServletおよびWebStatFilterクラスを作成するだけです。ここでは、**@configuration ** and **@bean **を使用して、これら2つを一緒に書くことができます。
簡単に理解するために、関連する構成命令もコードに記述されているため、ここでは詳しく説明しません。
コードは次のとおりです。
@configurationPublic class DruidConfiguration {@bean public servletregistrationbean Druidstatviewservle(){// Service ServeTregistrationBean ServletRegistrationBean = new StatviewServlet()、 "/druid/*"); //ホワイトリスト(空の表現、すべてにアクセスでき、複数のIPのコンマで区切ることができます)ServleTRegistrationBean.AddinitParameter( "Allow"、 "127.0.0.1"); // IPブラックリスト(Donyは、共通の存在がある場合に許可を優先します)ServletRegistrationBean.AddinitParameter( "deny"、 "127.0.0.2"); //ログインユーザー名とパスワードServletRegistrationBean.AddinitParameter( "loginusername"、 "pancm")を設定します。 servletregistrationbean.addinitparameter( "loginpassword"、 "123456"); //データをリセットできるかどうか。 servletregistrationbean.addinitparameter( "resetenable"、 "false"); return servletregistrationbean; } @bean public filterRegistrationBean DruidStatFilter(){filterRegistrationBean FilterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); //フィルタリングルールを追加するfilterregistrationbean.addurlpatterns( "/*"); // filterregistrationbean.addinitparameter( "除外"、 "*.js、*。gif、*。jpg、*。png、*。css、*。ico、/druid/*"); system.out.println( "Druid初期化に正常に!"); FilterRegistrationBeanを返します。 }}書き込み後、プログラムを開始した後、http://127.0.0.1:8084/druid/index.htmlをブラウザに入力し、[ユーザー名とパスワード]を入力してWebインターフェイスにアクセスします。
マルチデータソース構成
マルチデータソース構成を実行する前に、SpringbootとSpringboot_testのMySQLデータベースでそれぞれ次のスクリプトを実行します。
- スプリングブートライブラリのスクリプトテーブルの作成 `t_user`(` id` int(11)null auto_incrementコメント「自己具体的なID」、 `name` varchar(10)デフォルトのヌルコメント「名前」、「age」、` age` int(2)デフォルトのヌルコメント 'age'、primary key( `id`))engine = innodb auto_increment = 15 defanterment = 15 `t_student`(` id` int(11)not null auto_increment、 `name` varchar(16)デフォルトnull、` age` int(11)default null、primary key( `did`))エンジン= innodb auto_increment = 2デフォルトcharset = utf8
注:怠け者になるために、2つのテーブルの構造が同じようになります!しかし、それはテストに影響しません!
これらの2つのデータソースに関する情報は、application.propertiesで構成されており、構成は一度投稿されているため、ここには投稿しません。
ここでは、2番目のデータソースの構成に焦点を当てます。上記のmasterdatasourceconfig.javaに似ていますが、違いは、**@primary ** annotationを使用せずに**@プライマリ**アノテーションと名前とは異なることです。 MasterDataSourceConfig.javaはパッケージをスキャンし、マッパーを正確にディレクトリにマッパーしていることに注意してください。ここの2番目のデータソースにも同じことが当てはまります。次に、コードは次のとおりです。
@configuration@mapperscan(basepackages = clusterdatasourceconfig.package、sqlsessionfactoryref = "clustersqlsessionfactory")public class clusterdatasourceconfig {static final string package = "com.pancm.dao.cluster";静的最終文字列mapper_location = "classpath:mapper/cluster/*。xml"; @value( "$ {cluster.datasource.url}")private string url; @value( "$ {cluster.datasource.username}")private string username; @value( "$ {cluster.datasource.password}")private string password; @value( "$ {cluster.datasource.driverclassname}")private string driverclass; // masterdatasourceconfigのように、here @bean(name = "clusterdatasource")public datasource clusterdatasource(){druiddatasource datasource = new Druiddatasource(); dataSource.seturl(url); DataSource.setUsername(username); dataSource.setPassWord(パスワード); dataSource.setDriverClassName(DriverClass); // masterdatasourceconfigのように、ここに... dataSourceを返します。 } @bean(name = "clusterTransactionManager")public dataSourcetransactionmanager clusterTransactionManager(){return new DataSourcetransactionManager(clusterDataSource()); } @bean(name = "clustersqlsessionfactory")public sqlsessionfactory clustersqlsessionfactory( @qualifier( "clusterdatasource")dataSource clusterdatasource)スロー例外sessionfactory.setdatasource(clusterdatasource); sessionfactory.setMapperLocations(new PathMatchingResourcePatterNresolver()。getResources(clusterdatasourceconfig.mapper_location)); return sessionfactory.getObject(); }}構成を正常に記述した後、プログラムと実行テストを開始します。
インターフェイスを使用して、それぞれSpringboot_Testライブラリにデータを追加します。
t_user
http:// localhost:8084/api/user {"name": "zhang san"、 "age":25} {"name": "li si"、 "age":25} {"name": "wang wu"、 "age":25}t_student
post http:// localhost:8084/api/desutent {"name": "sudine a"、 "age": "name": "sudent b"、 "age":17} {"name": "sudine c"、 "age":18}}データを正常に追加した後、クエリ用に異なるインターフェイスを呼び出します。
聞く:
get http:// localhost:8084/api/user?name = li si
戻る:
{"id":2、 "name": "li si"、 "age":25}聞く:
get http:// localhost:8084/api/desute?name = desute c
戻る:
{"id":1、 "name": "student c"、 "age":16}データから、複数のデータソースが正常に構成されていることがわかります。
PageHelper Paginationの実装
PageHelperはMyBatisのページングプラグインであり、非常に便利です!ここで強くお勧めします! ! !
PageHelperは非常に簡単に使用できます。MavenでPageHelperの依存関係を追加するだけです。
Mavenの依存関係は次のとおりです。
<Dependency> groupId> com.github.pagehelper </groupid> <artifactid> pagehelper-spring-boot-starter </artifactid> <バージョン> 1.2.3 </version> </depence>
注:ここでスプリングブートバージョンを使用しています!他のバージョンも使用できます。
依存関係を追加した後、次の構成またはコードを追加するだけです。
最初のタイプは、 application.propertiesまたはapplication.ymlに追加されます
PageHelper:helperdialect:mysql offsetaspagenum:true rowboundswithcount:真の合理的:false
2番目のタイプは、mybatis.xml構成に追加されます
<bean id = "sqlsessionfactory"> <プロパティ名= "datasource" ref = "datasource"/> <! - mapping.xmlファイルをスキャン - > <プロパティ名= "mapperlocations" value = "classpath:mapper/*。xml"> </jploction> <! - 塗装プラグイン< name = "Properties"> <value> helperdialect = mysql offsetaspagenum = true rowboundswithcount = true ruementable = false </value> </property> </bean> </array> </property> </bean>
3番目のタイプはコードに追加され、**@bean ** annotationを使用してプログラムを開始するときに初期化します。
@bean public pagehelper pagehelper(){pagehelper pagehelper = new pagehelper();プロパティプロパティ= new Properties(); // database properties.setProperty( "helperdialect"、 "mysql"); //パラメーターオフセットをPagenum Properties.setProperty( "offsetaspagenum"、 "true")として使用するかどうか。 // count Properties.setProperty( "rowboundswithcount"、 "true")を照会するかどうか。 //ページネーションプロパティを合理化するかどうか。SetProperty( "Recosable"、 "false"); pagehelper.setProperties(プロパティ); }ここでは複数のデータソースを使用しているため、ここの構成はわずかに異なります。 SessionFactoryで構成する必要があります。ここでは、MasterDataSourceConfig.javaに対応する変更を行います。 MastersQlSessionFactoryメソッドで、次のコードを追加します。
@bean(name = "mastersqlsessionfactory")@primary public sqlsessionfactory mastersqlsessionfactory( @qualifier( "masterdatasource")datasource masterdatasource)throws {final sqlsessionfactorybean sessionfactory = new sqlsessionfactorybean(); sessionfactory.setdatasource(masterdatasource); sessionfactory.setMapperLocations(new PathMatchingResourcePatterNRESOLVER().GETRESOURCES(MASTERDATASOURCECONFIG.MAPPER_LOCATION)); //ページネーションプラグインインターセプターインターセプター= new PageInterceptor();プロパティプロパティ= new Properties(); // database properties.setProperty( "helperdialect"、 "mysql"); //パラメーターオフセットをPagenum Properties.setProperty( "offsetaspagenum"、 "true")として使用するかどうか。 // count Properties.setProperty( "rowboundswithcount"、 "true")を照会するかどうか。 //ページネーションプロパティを合理化するかどうか。SetProperty( "Recosable"、 "false"); Interceptor.setProperties(プロパティ); sessionfactory.setPlugins(new Interceptor [] {Interceptor}); return sessionfactory.getObject(); }注:他のデータソースもページングしたい場合は、上記のコードを参照してください。
ここで注意する必要があるのは、合理化のページングを意味する合理的なパラメーターであり、デフォルト値はfalseです。このパラメーターがtrueに設定されている場合、最初のページはpagenum <= 0とpagenum>ページ(総数が超えた場合)のときにクエリがクエリになります。最後のページはクエリされます。デフォルトでfalseの場合、クエリはパラメーターに直接基づいています。
PageHelperを設定した後、使用する場合は、 PageHelper.startPage(pageNum,pageSize);クエリSQLの前。総数を知りたい場合は、クエリSQLステートメントの後に購入し、 page.getTotal()を追加します。
コード例:
パブリックリスト<t> findbylistentity(t entity){list <t> list = null; {page <?> page = pagehelper.startpage(1,2); System.out.println(getClassName(Entity)+"最初のページに2つのデータを設定!"); list = getMapper()。findByListentity(Entity); system.out.println( "合計があります:"+page.getTotal()+"データ、そして実際の返品は次のとおりです。 } catch(Exception e){logger.error( "query"+getClassName(entity)+"failed!as:"、e); }返品リスト。 }コードが書かれた後、最終テストが開始されます。
T_USERテーブルのすべてのデータをクエリして、それを塗ります。
聞く:
http:// localhost:8084/api/userを取得します
戻る:
[{"id":1、 "name": "zhang san"、 "age":25}、{"id":2、 "name": "li si"、 "age":25}]コンソール印刷:
クエリを開始します...
ユーザーは、最初のページに2つのデータを設定します!
2018-04-27 19:55:50.769デバッグ6152 --- [IO-8084-EXEC-10] CPDMUSERDAO.FINDBYLISTENTITY_COUNT:==>準備:T_USERから選択(0)
2018-04-27 19:55:50.770 DEBUG 6152 --- [IO-8084-EXEC-10] CPDMUSERDAO.FINDBYLISTENTITY_COUNT:==>パラメーター:
2018-04-27 19:55:50.771 DEBUG 6152 --- [IO-8084-EXEC-10] CPDMUSERDAO.FINDBYLISTENTITY_COUNT:<==合計:1
2018-04-27 19:55:50.772デバッグ6152 --- [IO-8084-EXEC-10] CPDAO.MASTER.USERDAO.FINDBYLISTENTITY:==>準備:ID、名前、T_USERからの年齢1 = 1リミット
2018-04-27 19:55:50.773 DEBUG 6152 --- [IO-8084-EXEC-10] CPDAO.MASTER.USERDAO.FINDBYLISTENTITY:==>パラメーター:2(整数)
2018-04-27 19:55:50.774 DEBUG 6152 --- [IO-8084-EXEC-10] CPDAO.MASTER.USERDAO.FINDBYLISTENTITY:<==合計:2
合計で3つのデータがあり、実際のリターンは次のとおりです。2つの2つのデータ!
T_Studentテーブルのすべてのデータをクエリして、それを塗ります。
聞く:
http:// localhost:8084/api/sudentを入手してください
戻る:
[{"id":1、 "name": "desute a"、 "age":16}、{"id":2、 "name": "desute b"、 "age":17}]コンソール印刷:
クエリを開始します...
StudNetは、最初のページに2つのデータを設定します!
2018-04-27 19:54:56.155デバッグ6152 --- [NIO-8084-EXEC-8] CPDCSFINDBYLISTENTITY_COUNT:==>準備:T_STUDENTから選択(0)
2018-04-27 19:54:56.155デバッグ6152 --- [NIO-8084-EXEC-8] CPDCSFINDBYLISTENTITY_COUNT:==>パラメーター:
2018-04-27 19:54:56.156デバッグ6152 --- [NIO-8084-EXEC-8] CPDCSFINDBYLISTENTITY_COUNT:<==合計:1
2018-04-27 19:54:56.157デバッグ6152 --- [NIO-8084-EXEC-8] CPDCSTUDENTDAO.FINDBYLISTENTITY:==>準備:ID、名前、年齢を選択します。
2018-04-27 19:54:56.157デバッグ6152 --- [NIO-8084-EXEC-8] CPDCSTUDENTDAO.FINDBYLISTENTITY:==>パラメーター:2(整数)
2018-04-27 19:54:56.157デバッグ6152 --- [NIO-8084-EXEC-8] CPDCSTUDENTDAO.FINDBYLISTENTITY:<== TOTAL:2
合計で3つのデータがあり、実際のリターンは次のとおりです。2つの2つのデータ!
クエリが完了したら、Druidの監視インターフェイスを見てみましょう。ブラウザに入力:http://127.0.0.1:8084/druid/index.html
操作記録ははっきりと見ることができます!
Druidについてもっと知りたい場合は、公式のドキュメントを確認できます!
結論
この記事はついに完成しました。コードを書くとき、私は多くの問題に遭遇し、それから私はそれを解決するためにゆっくりと情報を見つけました。この記事では、これらの関連する使用を非常に簡単に紹介するだけであり、実際のアプリケーションではより複雑になる可能性があります。
参照記事:https://www.bysocket.com/?p=1712
DURID公式住所:https://github.com/alibaba/druid
PageHelper公式住所:https://github.com/pagehelper/mybatis-pagehelper
プロジェクトをgithubに置きました:https://github.com/xuwujing/springboot、ローカルにダウンロードすることもできます。ここをクリックしてください
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。