1. 程式人生 > >Java開發後臺介面+Android開發客戶端的一個例項(學生成績管理)(一)

Java開發後臺介面+Android開發客戶端的一個例項(學生成績管理)(一)

本文主要是一個查詢學生成績的一整套系統,主要為功能實現,串聯起來後端和移動端的連線。UI後期可以根據自己的愛好再調整,這裡分為兩部分進行介紹:

1、使用Java開發後臺介面,使用現如今非常流行的SpringBoot框架,使用MySql資料庫,持久層框架使用MyBatis,後臺開發平臺為idea,介面風格為restful風格。

2、使用Android開發客戶端,採用OkHttp進行網路通訊,採用Gson進行JSon資料的解析,Android客戶端的開發平臺為AndroidStudio。

下面我們從新建專案講起!行動起來!

一、後端介面開發

1、使用idea新建一個springboot專案,在新增依賴時選擇Web即可。

新建專案結構如下:

我們可以把關於mvn的檔案刪除,(不刪也可以。)刪除後的專案結構如下圖:

springboot沒有做任何的web.xml配置。 沒有做任何的sping mvc的配置 沒有配置tomcat (springboot內嵌tomcat),實在是太簡潔了!

下面介紹一下springboot的啟動方式:

(1)、Application類main方法啟動
(2)、mvn clean install/package cd 到target目錄,java -jar 專案.jar,注意這裡需要加入依賴spring-boot-maven-plugin生成可執行的jar
(3)、mvn spring-boot: run 啟動

由於我的資料庫是建在我本機上的,所以啟動採用第一種方法即可。即點選下圖中的啟動按鈕:

2、建立MySql資料庫,資料庫主要包括的欄位分別為:id、username、Chinese、Math、English、和tel,即對應每個學生的學號、姓名、語文成績、數學成績、英語成績和聯絡方式。

資料庫連線工具使用Navicat Premium,新建資料庫的名字為db_students,表的名字為tb_students。建好的資料庫結構如下:

下面向資料庫插入一些資料,由於是測試,可以隨便寫進去一些資料。

這裡我添加了一下資料如下:

3、springboot整合MyBatis

pom檔案中加入依賴如下:

<!--mybatis依賴-->
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>1.3.0</version>
</dependency>

<!-- MySQL -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <scope>runtime</scope>
</dependency>
<!-- 驅動 -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.0.29</version>
</dependency>

資料庫配置檔案:

server.port=8089
mybatis:
type-aliases-package: cn.topmap.bean

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.username=root

spring.datasource.password=****

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/db_students?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false

下面開始開發restful介面,採用註解版Mybatis的用法,專案整體架構如下:

下面我將分別去實現它們!

(1)、JsonResult:這是一個通用json返回類,即把我們要返回的資料轉換為json格式

public class JsonResult {

    private String status=null;

    private Object result=null;

    public JsonResult status(String status) {
        this.status = status;
        return this;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Object getResult() {
        return result;
    }

    public void setResult(Object result) {
        this.result = result;
    }
}

(2)、Student實體類,包含上面我們提到的那些欄位

public class Student {

    private int id;

    private String username;

    private String Chinese;

    private  String Math;

    private String English;

    private String tel;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getChinese() {
        return Chinese;
    }

    public void setChinese(String chinese) {
        Chinese = chinese;
    }

    public String getMath() {
        return Math;
    }

    public void setMath(String math) {
        Math = math;
    }

    public String getEnglish() {
        return English;
    }

    public void setEnglish(String english) {
        English = english;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }
}

(3)、StudentMapper,這是要對資料庫直接做操作的介面:為了方便我們沒有在這上面加@Mapper註解,而是在

StudentsApplication中加入了@MapperScan註解,可以自動掃描mapper包
// @Mapper 這裡可以使用@Mapper註解,但是每個mapper都加註解比較麻煩,
// 所以統一配置@MapperScan在掃描路徑在application類中
public interface StudentMapper {

    //查
    @Select("SELECT * FROM tb_students WHERE id = #{id}")
    Student getStudentById(Integer id);

    //查全部
    @Select("SELECT * FROM tb_students")
    public List<Student> getStudentList();

    //增
    @Insert("insert into tb_students(id,username,Chinese,Math,English,tel) values(#{id},#{username},#{Chinese},#{Math},#{English},#{tel})")
    public int add(Student student);

    //刪
    @Delete("delete from tb_students where id=#{id}")
    public int delete(Integer id);

    //改
    @Update("update tb_students set username=#{student.username},Chinese=#{student.Chinese}," +
            "Math=#{student.Math},English=#{student.English} where" +
            " id=#{id}")
    public int update(@Param("id") Integer id, @Param("student") Student student);



}

(4)、StudentService,這裡我們只寫介面方法供controller呼叫,具體邏輯寫在StudentServiceImpl裡面。

public interface StudentService {

    //通過id查詢
    Student getStudentById(Integer id);

    //獲取使用者列表
    public List<Student> getStudentList();

    //增
    public int add(Student student);

    //刪
    public int delete(Integer id);

    //改
    public int update( Integer id, Student student);
}

(5)、StudentServiceImpl,在這裡面書寫具體的呼叫mapper方法操作資料庫的操作。主要書寫的增刪改查的業務操作。在編碼時記得要加上@Service註解。

//如果有一個類帶了@Service註解,將自動註冊到Spring容器,不需要再在applicationContext裡面定義bean了
@Service
public class StudentServiceImpl  implements StudentService{
    //Autowired:把配置好的Bean拿來用,完成屬性、方法的組裝
    @Autowired
    private StudentMapper studentMapper;



    @Override
    public Student getStudentById(Integer id) {
        return studentMapper.getStudentById(id);
    }

    @Override
    public List<Student> getStudentList() {
        return studentMapper.getStudentList();
    }

    @Override
    public int add(Student student) {
        return studentMapper.add(student);
    }

    @Override
    public int delete(Integer id) {
        return studentMapper.delete(id);
    }

    @Override
    public int update(Integer id, Student student) {
        return studentMapper.update(id,student);
    }
}

(6)、StudentController,這是與web互動的介面的書寫的最重要的部分,介面的風格為restful風格。

@RestController
public class StudentController {

    @Autowired
    private StudentService studentService;

    /**
     * 根據ID查詢學生
     * @param id
     * @return
     */
    //@PathVariable:用於獲取url中的資料
    @GetMapping(value = "student/query/{id}")
    public Student getStudentById(@PathVariable(value = "id") Integer id){
        try {
            Student student=studentService.getStudentById(id);
            return student;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;

    }


    /**
     * 查詢學生成績列表
     * @return
     */
    @RequestMapping(value = "students/query",method = RequestMethod.GET)
    public List<Student> getStudentList(){

        try {
            List<Student> students=studentService.getStudentList();
            return students;
        }catch (Exception e){
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 新增學生
     * @param student
     * @return
     */
    @RequestMapping(value = "student/add",method = RequestMethod.POST)
    public ResponseEntity<JsonResult> add(@RequestBody Student student){
        JsonResult r=new JsonResult();

        try {
            int orderId=studentService.add(student);
            if (orderId<0){
                r.setResult(orderId);
                r.setStatus("failed");
            }else {
                r.setResult(orderId);
                r.setStatus("ok");
            }

        }catch (Exception e){
            r.setResult(e.getClass().getName()+":"+e.getMessage());
            r.setStatus("error");
            e.printStackTrace();
        }

        return ResponseEntity.ok(r);

    }

    /**
     * 根據id刪除使用者
     * @param id
     * @return
     */
    @RequestMapping(value = "student/delete/{id}",method = RequestMethod.DELETE)
    public ResponseEntity<JsonResult> delete(@PathVariable(value = "id") Integer id){
        JsonResult r=new JsonResult();

        try {
            int delId=studentService.delete(id);
            if (delId<0){
                r.setResult(delId);
                r.setStatus("failed");
            }else {
                r.setResult(delId);
                r.setStatus("ok");
            }
        }catch (Exception e){
            r.setResult(e.getClass().getName()+":"+e.getMessage());
            r.setStatus("error");

            e.printStackTrace();
        }

        return ResponseEntity.ok(r);

    }

    /**
     * 根據id修改使用者資訊
     * @param student
     * @return
     */
    @RequestMapping(value = "student/update/{id}",method = RequestMethod.PUT)
    public ResponseEntity<JsonResult> update(@PathVariable(value = "id") Integer id,
                                             @RequestBody Student student){
        JsonResult r=new JsonResult();

        try {
            int ret=studentService.update(id, student);
            if (ret<0){
                r.setResult(ret);
                r.setStatus("fail");
            }else {
                r.setResult(ret);
                r.setStatus("ok");
            }
        }catch (Exception e){
            r.setResult(e.getClass().getName()+":"+e.getMessage());
            r.setStatus("error");
            e.printStackTrace();
        }

        return ResponseEntity.ok(r);
    }


}

4、介面測試,推薦的測試工具為postman,上面的介面我已經測試過了,都是正常的,在此不再贅述測試過程。

至此,我們使用java語言利用springboot框架編寫介面的部分就完成了,下面我們總結一下我們已經編寫好的增刪改查的幾個介面:

根據id查詢學生資訊介面:http://localhost:8089/student/query/{id}

查詢所有學生資訊介面:http://localhost:8089/students/query

新增學生資訊介面:http://localhost:8089/student/add

根據學生id刪除學生資訊介面:http://localhost:8089/student/delete/{id}

根據學生的id修改學生資訊:http://localhost:8089/student/update/{id}

後端介面已經編寫好了,我們的工作已經完成一半啦,下面繼續努力開始編寫Android客戶端的內容吧,加油!