序文
SpringのJDBCテンプレットは、SpringがJDBCに使用する基本的なカプセル化です。主にプログラマーがデータベース接続を管理するのに役立ちます。残りの使用方法は、JDBCを直接使用することと大きな違いはありません。
ビジネス要件
誰もがJDBCの使用に精通しています。これは主に、スプリングブートでスプリングJDBCテンプレットを使用する手順を実証するためであるため、簡単な要件を設計しました。ユーザーオブジェクトのカード操作。オブジェクトには2つのプロパティがあります。1つはID、もう1つは名前です。 mysqlのauth_userテーブルに保存されています。
新しいプロジェクトを作成し、依存関係を追加します
Intellijのアイデアで空のスプリングブートプロジェクトを作成します。特定の手順参照
Spring-Bootプロジェクトを作成するためのIntellij Ideaのグラフィックチュートリアル。この例の要件によれば、次の3つの依存関係を追加する必要があります
<依存関係> groupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-web </artifactid> </dependency> <dependency> groupid> org.springframework.boot </groupid> <artifactid> spring-boot-spendc </jdbc </artifactid> <GroupId> mysql </groupId> <artifactid> mysql-connector-java </artifactid> <バージョン> 6.0.6 </version> </dependency>
HTTP RESTサービスを公開したいため、Spring-Boot-Starter-Web依存関係を追加します。ここでは、JDBC Tempetメソッドを使用してデータベースにアクセスするため、Spring-Boot-Starter-JDBC依存関係を追加してMySQLデータベースにアクセスするため、MySQLのJDBCドライバーの最新バージョンを追加します。
データベース環境を準備します
MySQL 5.7がLinuxオペレーティングシステムにすでにインストールされていると仮定します。次の操作は、ルートユーザーを介してMySQLのコマンドラインクライアントにログインし、オペレーティングシステムのコマンドラインで実行されます。
データベースとテーブルを作成します
データベースSpringboot_jdbc;作成テーブルauth_userの作成(uuid bigint not null、name varchar(32)、primary key(uuid))default charset = utf8mb4;
ユーザー権限を設定します
springboot_jdbc。*にすべての特権を付与します。「springboot」@'%'に 'Springboot'; Flush特権によって識別されます。
データソース(接続プール)を構成する
Springbootのデータソースは自動的に構成されています。 Springboot 2.0では、いくつかのデータソース構成が利用可能になり、HikaricPの最後の順序で実際に使用するデータソースを選択します - > Tomcat Pooling-> Commons DBCP2。
プロジェクトがSpring-Boot-Starter-JDBC依存関係を追加すると、HikaricPデータソースの依存関係が既に含まれているため、HikaricP接続プールデータソースはここで自動的に構成されています。
appplications.propertiesに次の構成を追加します
#generalデータソースの構成spring.datasource.datasource.driver-class-name = com.mysql.cj.jdbc.driverspring.datasource.url = jdbc:mysql://10.110.2.5:3306/spri ng-boot-jdbc?charset = utf8mb4&usessl = falsspring.datasource.username = springbootspring.datasource.password = springboot# hikariデータソース固有の構成spring.datasource.hikari.maximum-pool-size = 20spring.datasource.hikari.minimum-idle = 5
その中で、ヒカリデータソースの構成のほとんどを以下の図に示します。各構成の意味を確認できます
プログラム開発
ユーザーデータベースエンティティ
要件によれば、対応するユーザーデータエンティティには2つの属性があり、1つはID、もう1つは名前です。これは純粋なPojoオブジェクトです。
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao;/*** user entity object** @author yang gaochao* @since 2018-03-09*/public class userdo {private long id;プライベート文字列名; public long getId(){return id; } public void setid(long id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; }}一般的なhttp休憩オブジェクト
通常、HTTP RESTインターフェイスでは、ビジネスオブジェクトのコンテンツを直接返すだけでなく、インターフェイスコールの結果、コールが失敗したときに返されるカスタムテキストメッセージなど、いくつかの一般的な情報を返したいと考えています。特定の定義は次のとおりです
個別のビジネスコンテンツのオブジェクトを返します
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo;/***単一オブジェクトは結果を返します** @author yang gaochao* @since 2018-03-09*/public class RestiTemresult <t> {private string result;プライベート文字列メッセージ;プライベートTアイテム; public string getResult(){return result; } public void setResult(string result){this.result = result; } public string getMessage(){return message; } public void setMessage(string message){this.message = message; } public t getItem(){return item; } public void setItem(t item){this.item = item; }}ビジネスコンテンツのコレクションはオブジェクトを返します
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo; import java.util.collection;/***コレクションオブジェクトは結果を返します* @author yang gaochaoプライベート文字列メッセージ;プライベートコレクション<t>アイテム; public string getResult(){return result; } public void setResult(string result){this.result = result; } public string getMessage(){return message; } public void setMessage(string message){this.message = message; } public collection <t> getItems(){return items; } public void setItems(collection <t> items){this.items = items; }}データ永続性層の開発
ユーザーデータ永続性レイヤーインターフェイス定義
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn.dao; import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; import java.util.list; 2018-03-09*/public interface userdao {/***新しいユーザーをデータベースに保存** @paramユーザーオブジェクトを保存* @return Muscle Gainが成功したかどうか*/boolean add(userdo user); / ***データベースのユーザーを更新** @paramユーザーユーザーを更新* @returnアップデートが成功しているかどうか*/ boolean update(userdo user); / ***指定されたユーザーを削除** @param idユーザーの身元を削除する* @return削除が成功しているかどうか*/ boolean delete(long id); / ***指定されたユーザーの正確なクエリ** @param IDユーザーの身元をquery* @return queried、return userly information、それ以外はnull*/ userdo location(long id); / ***名前でユーザーをクエリ** @param name name be fuzzy* @return list of of of of ofユーザーはquery <userdo> matchname(string name);}ユーザーデータ永続性レイヤー実装
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn.dao.impl; import com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao; Import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; import org.springframework.beans.factory.annotation.autowired; Import org.springframework.jdbc.core.jdbctemplate; import; org.springframework.jdbc.support.rowset.sqlrowset; Import org.springframework.stereotype.repository; Import java.util.arraylist; Import java.util.list;/***ユーザーオブジェクトデータベースアクセス実装*/@repositorypublic class userdaojdbctempletimpl exmperment userdao {private final jdbctemplate jdbctemplate; @autowired public userdaojdbctempletimpl(jdbctemplate jdbctemplate){this.jdbctemplate = jdbctemplate; } @Override public boolean add(userdo user){string sql = "auth_user(uuid、name)values(?、?)"; jdbctemplate.update(sql、user.getid()、user.getname())> 0を返します。 } @Override public boolean update(userdo user){string sql = "used auth_user set name =?where uuid =?"; jdbctemplate.update(sql、user.getname()、user.getid())> 0; } @Override public boolean delete(long id){string sql = "auth_user where uuid =?"; jdbctemplate.update(sql、id)> 0を返します。 } @Override public userdo locate(long id){string sql = "select * from auth_user where uuid =?"; sqlrowset rs = jdbctemplate.queryforrowset(sql、id); if(rs.next()){return generateEntity(rs); } nullを返します。 } @Override public List <userdo> matchname(string name){string sql = "select * from auth_user where name where like?"; sqlrowset rs = jdbctemplate.queryforrowset(sql、 "%" + name + "%"); List <UserDo>ユーザー= new ArrayList <>(); while(rs.next()){users.add(generateEntity(rs)); }ユーザーを返します。 } private userdo generateEntity(sqlrowset rs){userdo wechatpay = new userDo(); wechatpay.setid(rs.getlong( "uuid")); wechatpay.setname(rs.getString( "name")); wechatpayを返します。 }}ここでは、最初にAnnotation @Repositoryを使用して、これがデータ永続性レイヤーのクラスであることを示し、Springbootはこのクラスを自動的にインスタンス化することを示します。次に、@autowiredをコンストラクターに追加します。 Springbootがこのクラスをインスタンス化すると、JDBCTEMPLETインスタンスをこのクラスに自動的に挿入します。ここでは、JDBCTEMPLETインスタンスは、Applications.Propertiesのデータソース関連の構成に基づいて、Springbootによって自動的に構成されます。 Springbootのアルゴリズムによると、データソースを自動的に構成すると、ここで構成するデータソースはHikaricPです。
残りは、通常の春のjdbctemplet開発のようなものです。プログラマーによってオブジェクトとデータベースSQL間を手動で変換することにより、ユーザーを追加、変更、削除、ファジーマッチング、正確なクエリ、その他の機能を変更できます。
データビジネスレイヤー開発
データサービスレイヤーインターフェイス定義
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn.service; import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; import java.util.list; 2018-03-09 */public Interface userservice {userdo add(userdo user); userdo update(userdo user); Boolean Delete(long id); userdo locate(long id);リスト<userdo> matchname(string name);}データサービスレイヤーの実装
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn.service.impl; import com.yanggaochao.springboot.learn.springbootjdbclearn.dao.userdao; Import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; import com.yanggaochao.springboot.learn.springbootjdbclearn.service.userservice; org.springframework.stereotype.service; import java.util.date; import java.util.list;/***ユーザービジネスレイヤー実装クラス** @author yang gaochao* @since 2018-03-09*/ @servicepublic class userserviceimpl emptrements userervice @autowired public userserviceimpl(userdao userdao){this.userdao = userdao; } @Override public userdo add(userdo user){user.setId(new date()。gettime()); if(userdao.add(user)){return user; } nullを返します。 } @Override public userDo Update(userDo user){if(userdao.update(user)){return location(user.getId()); } nullを返します。 } @Override public boolean delete(long id){return userdao.delete(id); } @Override public userdo location(long id){return userdao.locate(id); } @Override public List <userdo> matchname(string name){return userdao.matchname(name); }}ここでは、この実装クラスは、@Service Annotationを通じてビジネスレベルのクラスとして宣言されます。 Persistenceレイヤーのuserdaoを使用すると、スプリングブートは @autowiredを介してこのビジネスレイヤークラスをインスタンス化し、対応する永続レイヤークラスをこのビジネスクラスに自動的に挿入できます。
ここで、ユーザーオブジェクトを追加するとき、ユーザーの識別を設定するとき、現在の時間の数ミリ秒数は単に識別として使用されます。実際の開発プロセス中、この場所は、このロゴを繰り返すことができないことを確認するために、グローバルにユニークなメカニズムを使用する必要があります。
外部サービスレイヤー開発
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn.web; import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.bo.restcolectionResult; Import com.yanggaochao.springboot.learn.springbootjdbclearn.domain.dao.userdo; import com.yanggaochao.springboot.learn.springbootjdbclearn.service.userservice; org.springframework.web.bind.annotation。*; Import java.util.list;/***ユーザーhttp rest interface** @author yang gaochao* @since 2018-03-09*/ @retscontroller @requestmapping( "api/v1/user")public user userapi eutowid eutiy {autowid @RequestMapping(value = "/add"、method = requestmethod.post)public restitemresult <userdo> add(@requestbody userdo user){restitemresult <userdo> result = new restitemresult <>(); user = userservice.add(user); if(user!= null){result.setItem(user); result.setResult( "success"); } else {result.setMessage( "新しいユーザーFailed"); result.setResult( "故障"); } return result; } @RequestMapping(value = "/update"、method = requestmethod.post)public restitemresult <userdo> update(@requestbody userdo user){restitemresult <userdo> result = new restitemresult <>(); user = userservice.update(user); if(user!= null){result.setItem(user); result.setResult( "success"); } else {result.setmessage( "userdoはユーザーの変更に失敗しました"); result.setResult( "故障"); } return result; } @RequestMapping(value = "/delete/{uuid}"、method = requestmethod.get)public restiTemresult <userdo> delete( @pathvariable long uuid){restitemresult <userdo> result = new RestIteMresult <>(); if(userservice.delete(uuid)){result.setResult( "success"); } else {result.setmessage( "delete user failed"); result.setResult( "故障"); } return result; } @RequestMapping(value = "/locate/{uuid}"、method = requestmethod.get)public restiTemresult <userdo> locate( @pathvariable long uuid){restitemresult <userdo> result = new RestIteMresult <>(); userdo user = userservice.locate(uuid); if(user!= null){result.setItem(user); result.setResult( "success"); } else {result.setmessage( "query user faild"); result.setResult( "故障"); } return result; } @RequestMapping(value = "/match/{name}"、method = requestmethod.get)public restCollectionResult <userdo> match( @pathvariable string name){restCollectionResult <userdo> result = new restCollectionResult <>();リスト<userdo> users = userservice.matchname(name); result.setItems(users); result.setResult( "success");返品結果; }}ここで、@RestControllerは、これがHTTP RESTインターフェイスクラスであることを宣言するために使用されます。各インターフェイスのコールルートは、クラスの@RequestMappingを組み合わせ、メソッドに@RequestMappingを組み合わせて形成されます。メソッドの@RequestMappingのメソッドプロパティは、HTTPによって呼び出されるメソッドを宣言します。 @RequestBody Annotationは、POSTデータのJSONオブジェクトをPOJOオブジェクトに自動的に変換します。 @pathvariaipは、HTTP URLパスのデータをサービスメソッドのパラメーターに自動的に変換します。
HTTP RESTインターフェイステスト
テストHTTPレストサービスは、Apache CommonsのHTTPClientを介して呼び出されます。
http resstは補助クラスを呼び出します
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn; Import org.apache.commons.httpclient.defaulthttpmethodretryhandler; Import org.apache.commons.httpclient.htpclient; Import; apache.commons.httpclient.methods.getMethod; Import org.apache.commons.httpclient.methods.getMethod; Import org.apache.commons.httpclient.Methods.StringRequestEntity; Import org.apach.httpmms.httpmms Java.io.BufferedReader; Import java.io.inputStreamReader; Import java.io.inputStreamReader; Import java.util.map;/*** @author yang gaochao* @since 2018-03-09*/public getpclienthel httpclienthel aidhethe httpclienthe eaidhethe ease http request * * @param url httpのurlにアクセス * @returnアクセスhttp */ public string httpgetrequest(string url、map <string> headers){try {httpclient httppclient = new httpclient(new httpclient(); getMethod method = new getMethod(url); method.setRequestheader( "content-type"、 "application/json; charset = utf-8"); method.getParams()。setParameter(httpmethodparams.retry_handler、new defulthttpmethodretryhandler(3、false)); if(headers!= null){for(string key:headers.keyset()){method.setRequestheader(key、headers.get(key)); }} int statusCode = httpclient.executeMethod(method); if(statuscode == 200){parseinputStreamを返します(method.getResponseBodyAsstream()); } else {system.out.println(url + "status =" + statusCode); }} catch(例外e){e.printstacktrace(); } nullを返します。 } / *** postメソッドを使用してHTTP要求を開始します** @param url httpのURLにアクセスする* @paramデータデータはリクエストの@paramデータデータ* @@return http* / public string httppostrequest(string url、string <<string、string> httpclient httpclient httpclient sh httpclient Httpclient = new < httpclient(); PostMethod method = new postmethod(url); method.setRequestheader( "content-type"、 "application/json; charset = utf-8"); method.setRequestheader( "user-agent"、 "mozilla/5.0(windows nt 6.1; wow64)applewebkit/537.36(khtml、geckoのような)chrome/34.0.1847.131 safari/537.36"); if(headers!= null){for(string key:headers.keyset()){method.setRequestheader(key、headers.get(key)); }} method.setRequestentity(new StringRequestentity(data、 "json"、 "utf-8")); int statuscode = httpclient.executemethod(method); if(statuscode == 200){parseinputStreamを返します(method.getResponseBodyAsstream()); } else {system.out.println(url + "status =" + statuscode + parseinputStream(method.getResponseBodyAsstream()); }} catch(例外e){e.printstacktrace(); } nullを返します。 } / *** java.io.readerからのテキストデータの解析** @param rd java.io.io.io.reader object* @throws例外がエラーが発生したときにエラーをスローします* / private string parsereader(reader rd)throws {bufferedreader brd = new bufferedreader(rd);文字列線; stringbuilder responssecontext = new StringBuilder(); while((line = brd.readline())!= null){ResponseContext.Append(line).Append( "/n"); } //rd.close(); if(respondecontext.length()> 0){responseContext.deletecharat(respondecontext.length() - 1); } runts responssecontext.toString(); } / ***入力ストリームからのテキストデータの解析** @paramは入力ストリームです* @throws例外が発生したときに例外をスローします* / private string parseinputStream(inputstream is)throws exception {return parsereader(new inputstreamReader(IS)); }}ここでは、GetおよびPost Methodを使用してHTTP RESTサービスを呼び出す方法を主に実装します。
テストケース
Junitを使用してテストケースを実行します。テストを実装するために、次のMaven依存関係を追加しました
<Dependency> groupId> commons-httpclient </groupid> <artifactid> commons-httpclient </artifactid> <version> 3.1 </version> <scope> test </scope> </dependency> <dependency> <groupid> org.codehaus.jettison </groupid> </</</</</</</</</</</</</</</</</</</</</</</</</</< <scope>テスト</scope> </dependency>
パッケージcom.yanggaochao.springboot.learn.springbootjdbclearn; Import org.codehaus.jettison.json.jsonobject; import org.junit.after; import org.junit.before; import org.junit.test; import java.net.net.net.net.net.net.urlencoder; java.util.list;/** *説明: * * @author yang gaochao * @since 2018-03-09 */public class userapitest {private string useraddurl = "http:// localhost:3030/security/api/v1/user/add"; private string userlocateurl = "http:// localhost:3030/security/api/v1/user/locate/"; private string userdeleteurl = "http:// localhost:3030/security/api/v1/user/delete/"; private string userupdateurl = "http:// localhost:3030/security/api/v1/user/update";プライベート文字列usermatchurl = "http:// localhost:3030/security/api/v1/user/match/"; jsonobject adduser = new jsonobject(); long adduserid = null; List <long> userIds = new ArrayList <>(); @before public void before()throws exception {adduser.put( "name"、 "Beautiful Sheep"); jsonobject addResultJson = new jsonobject(new httpclienthelper()。httppoStre equest(useraddurl、adduser.tostring()、null)); assert( "success" .equals(addresultjson.getString( "result"))); adduserid = addresultjson.getJsonObject( "item")。getLong( "id"); jsonobject user = new jsonobject(); user.put( "name"、 "Pleasant Goat"); addResultJson = new jsonobject(new httpclienthelper()。httppoStrequest(useraddurl、user.tostring()、null)); assert( "success" .equals(addresultjson.getString( "result"))); userids.add(addresultjson.getjsonobject( "item")。getLong( "id")); user.put( "name"、 "Gray Wolf"); addResultJson = new jsonobject(new httpclienthelper()。httppoStrequest(useraddurl、user.tostring()、null)); assert( "success" .equals(addresultjson.getString( "result"))); userids.add(addresultjson.getjsonobject( "item")。getLong( "id")); } @test public void testUpdateUser()スロー例外{jsonobject user = new jsonobject(); user.put( "name"、 "Smad Sheep"); user.put( "id"、adduserid); new httpclienthelper()。httppoStrequest(userupdateurl、user.tostring()、null); jsonobject locateresultjson = new jsonobject(new httpclienthelper()。httpgetRequest(userlocateurl + adduserid、null)); assert(user.getString( "name")。 } @test public void testmatchuser()スロー例外{jsonobject matchResultjson = new jsonobject(new httpclienthelper()。httpgetrequest(usermatchurl + urlencoder.encode( "heep"、 "utf-8")、null)); assert(matchResultjson.has( "items")&& matchResultJson.getJSonArray( "items")。length()== 2); MatchResultJson = new JSonObject(new httpclienthelper()。httpgetRequest(usermatchurl + urlencoder.encode( "wolf"、 "utf-8")、null)); assert(matchResultjson.has( "items")&& matchResultJson.getJSonArray( "items")。length()== 1); } @after public void after()throws exception {if(adduserid!= null){jsonobject leteresultjson = new jsonobject(new httpclienthelper()。httpgetrequest(userdeleteurl + adduserid、null)); assert( "success" .equals(deleteresultjson.getString( "result"))); } for(long userid:userids){jsonobject leterethultjson = new jsonobject(new httpclienthelper()。httpgetRequest(userdeleteurl + userid、null)); assert( "success" .equals(deleteresultjson.getString( "result"))); }}}ここでは、2つのテストケースが@Testで宣言され、1つはユーザーの変更関数をテストし、もう1つはユーザーファジークエリ関数をテストします。 @beforeは、各テストケースを実行する前に行われる準備を宣言します。ここでは、最初に3つのデータをデータベースに挿入し、同時にデータと正確なクエリの追加機能もテストします。 @Afterは、各テストケースが実行された後にクリーンアップを宣言します。ここでは、主に以前に挿入されたデータを削除します。ここでは、ユーザー削除の機能が同期してテストされています。
ポストスクリプト
JDBC Templetを使用したスプリングブートの完全な例を以下に示します。春の下でJDBCテンプレットを使用した経験がある場合は、春に多くの構成作業を減らすことを主な目的とします。
この記事に関係するコードはGitHubにアップロードされており、ローカルにダウンロードすることもできます
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。