本文主要是一个查询学生成绩的一整套系统,主要为功能实现,串联起来后端和移动端的连接。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文件中加入依赖如下:
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0
mysql
mysql-connector-java
runtime
com.alibaba
druid
1.0.29
数据库配置文件:
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 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 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 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 getStudentList(){
try {
List students=studentService.getStudentList();
return students;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 添加学生
* @param student
* @return
*/
@RequestMapping(value = "student/add",method = RequestMethod.POST)
public ResponseEntity 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 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 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客户端的内容吧,加油!