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客户端的内容吧,加油!

猜你喜欢

转载自blog.csdn.net/MagicMHD/article/details/84573203