一生懸命勉強し、毎日改善する
この記事は私のGithubウェアハウスDayDayUPに含まれています:github.com/RobodLee/DayDayUP、スターへようこそ。その他の記事については、ディレクトリナビゲーションにアクセスしてください。
前回の記事では、元帳APPクライアントの開発について説明しましたが、この記事では、サーバー側の開発について説明します。サーバーには2つのコア機能があります。1つはクライアントからデータベースにデータを保存することです。私が選択したデータベースはMySQLで、もう1つはデータベースから指定されたユーザーのすべてのレコードを照会してクライアントに送り返すことです。この記事では、主にこれら2つの機能について説明します。ユーザー登録とログイン機能については説明しません。これらは比較的単純です。ソースコードを確認し、クリックして表示できます。
1.環境構築
プロジェクト全体がSpringBootに基づいているため、構成は比較的単純で、あまり言いません。まず、データベーステーブルの設計について説明します。テーブルは全部で2つあり、1つはユーザー情報を格納するためのユーザーテーブルで、もう1つはすべてのレコードを格納するためのレコードテーブルです。
永続性レイヤーのフレームワークとしてMyBatisを選択したので、MyBatisに必要な依存関係をpom.xmlに追加する必要があります。データベースの相互作用に関連するものは3つあります。1つはMyBatisの初期依存関係、もう1つはMySQLの接続ドライバー、最後はMyBatisデータベースのフィールドタイプマッピングです。3つ目がない場合、Dateの保存時にエラーが報告されます。
<dependencies>
…………
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
<!-- mybatis数据库字段类型映射 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.1</version>
</dependency>
…………
</dependencies>
準備ができたら、機能の実現を見てみましょう。
2.機能の実現
1.アップロード機能の実装
1.1コントローラーレイヤー
@RequestMapping("/uploadRecords")
public ResultInfo<String> uploadRecords(String phoneNumber , String recordsJson) {
ResultInfo<String> resultInfo = null;
List<Record> records = JSONArray.parseArray(recordsJson , Record.class);
try {
resultInfo = recordService.uploadRecords(phoneNumber,records);
} catch (Exception e) {
e.printStackTrace();
resultInfo = new ResultInfo<>();
resultInfo.setFlag(false);
resultInfo.setErrorMsg("内部错误");
}
return resultInfo;
}
制御層は2つのパラメーターを受け取ります。1つはユーザーから渡されるデータを決定するために使用されるphoneNumberで、もう1つはListのjson文字列です。クライアントにアップロードするときに、Listをjsonに変換したので、最初にJsonをListに再度変換してから、recordService.uploadRecordsメソッドを呼び出してリストを渡す必要があります。
1.2サービスレイヤー
@Override
public ResultInfo<String> uploadRecords(String phoneNumber, List<Record> records) throws Exception {
for (Record record : records) {
int status = record.getStatus();
if (status == 1) {
//添加数据
System.out.println(record.toString());
recordMapper.addRecord(phoneNumber, record);
} else if (status == 2) {
//删除数据
recordMapper.deleteRecord(record.getUuid());
} else if (status == 3) {
//修改数据
recordMapper.upgradeRecord(record);
}
}
//如果在上面代码中出现了异常下面的代码就不会执行,直接将异常抛给Controller层处理
ResultInfo<String> resultInfo = new ResultInfo<>();
resultInfo.setFlag(true);
resultInfo.setData("同步成功");
return resultInfo;
}
サービスレイヤーで、着信リストをトラバースし、ステータスの値、データの追加、削除、変更のいずれかに従って適切な操作を選択してから、daoレイヤーの対応するメソッドを呼び出します。Daoレイヤーの機能を見てみましょう。
1.3 Dao层
/**
* 添加一条记录
* @param phoneNumber
* @param record
* @throws Exception
*/
@Insert("insert into record(id,phoneNumber,category,content,money,status,date) " +
"values (#{record.uuid},#{phoneNumber},#{record.category},#{record.content},#{record.money},0,#{record.date})")
void addRecord(@Param("phoneNumber") String phoneNumber,@Param("record") Record record) throws Exception;
/**
* 删除指定的记录
* @param recordId
* @throws Exception
*/
@Delete("DELETE FROM record WHERE id = #{recordId}")
void deleteRecord(@Param("recordId")String recordId) throws Exception;
/**
* 修改服务器中的记录
* @param record
* @throws Exception
*/
@Update("UPDATE record SET category=#{category},content=#{content},money=#{money},status=#{status},date=#{dateString} WHERE id = #{uuid}")
void upgradeRecord(Record record) throws Exception;
非常に簡単です。対応するSQLステートメントを記述している限り、データを追加、削除、および変更できます。他のすべての操作は、MyBatisによって実行されます。
データのアップロードの実現について述べたので、データのダウンロードを実現する方法を見てみましょう。
2.ダウンロード機能の実現
2.1コントローラー層
@RequestMapping("/downloadRecords")
public ResultInfo<List<Record>> downloadRecords(String phoneNumber) {
ResultInfo<List<Record>> resultInfo = null;
try {
resultInfo = recordService.downloadRecords(phoneNumber);
} catch (Exception e) {
e.printStackTrace();
resultInfo = new ResultInfo<>();
resultInfo.setFlag(false);
resultInfo.setErrorMsg("内部错误");
}
return resultInfo;
}
Controllerレイヤーのコードは非常に単純です。つまり、phoneNumberパラメーターを受信してリクエストを送信したユーザーを判別し、recordService.downloadRecords(phoneNumber)メソッドを呼び出してphoneNumberを渡すと、9つがServiceレイヤーに送られます。
2.2サービスレイヤー
@Override
public ResultInfo<List<Record>> downloadRecords(String phoneNumber) throws Exception {
List<Record> records = recordMapper.findAllByPhoneNumber(phoneNumber);
//如果在上面代码中出现了异常下面的代码就不会执行,直接将异常抛给Controller层处理
ResultInfo<List<Record>> resultInfo = new ResultInfo<>();
resultInfo.setFlag(true);
resultInfo.setData(records);
return resultInfo;
}
また、サービスレイヤーでは非常に簡単です。つまり、recordMapper.findAllByPhoneNumber(phoneNumber)メソッドを呼び出して、照会されるListコレクションを取得します。
2.3 Dao层
/**
* 根据手机号码查询该用户下所有的信息
* @param phoneNumber
* @throws Exception
* @return
*/
@Select("SELECT * FROM record WHERE phoneNumber = #{phoneNumber}")
@Results({
@Result(property = "uuid",column = "id",id = true),
@Result(property = "category",column = "category"),
@Result(property = "content",column = "content"),
@Result(property = "money",column = "money"),
@Result(property = "status",column = "status"),
@Result(property = "date",column = "date")
})
List<Record> findAllByPhoneNumber(String phoneNumber) throws Exception;
データベース内のレコードのidフィールドは、Recordクラスのuuid属性に対応しています。なぜidがidに直接対応するのですか?前回の記事で述べた理由は、クライアントのSQLiteのIDはintタイプのみであるため、uuid属性が追加されているためです。
総括する
サーバー側には複雑な機能はなく、単純なCRUDがいくつかあります。私の記事のアイデアに従って、私のコードを理解できると思います。