元帳APPサーバーの開発

元帳APP開発

一生懸命勉強し、毎日改善する

この記事は私の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がいくつかあります。私の記事のアイデアに従って、私のコードを理解できると思います。

WeChatパブリックアカウント

おすすめ

転載: blog.csdn.net/weixin_43461520/article/details/105476416