欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用Spring Boot为Android App搭建一个简易的后台(一)

程序员文章站 2022-05-17 08:46:40
...

一、安装IDEA

工欲善其事必先利其器,先下载安装开发工具IDEA。如果已安装,可以直接跳过。
官方下载地址
百度网盘,提取码:1ie8(包含那啥工具)
那啥工具使用方法:
1、安装完idea之后,点击试用进入。
2、把jetbrains-agent-latest.zip拖入idea
3、重启后会弹出那啥框,选择license server,确认。
4、那啥完成

二、安装MySQL

需要安装mysql和mysql-workbench
官网下载地址
百度网盘下载:提取码:02yd(版本为8.0.15)

三、新建数据库并存入相关测试数据

1、打开MySQL Workbench,新建数据库连接。(点击MySQL Connection 旁边的+号添加)
本地的Hostname为localhost

2、新建数据库
Create a new schema in the connected server
利用Spring Boot为Android App搭建一个简易的后台(一)
3、双击demoapp,在Tables中右键Create Table新建表格。
其中PK(primary key):主键,
NN(not null):非空,
UQ(unique):唯一索引,
B/BIN(binary):二进制数据(比较大),
UN(unsigned):无符号(非负数),
ZF(zero fill):填充0,例如值为1,int(4),则显示 0001,
AI(auto increment):自增,
G(generated column):由其他列计算而得
查看表格,并添加数据,
user_id作为主键,不能为空,需要自增。( PK、NN、ZF 都勾上)
利用Spring Boot为Android App搭建一个简易的后台(一)

四、新建Spring Boot工程

选择Spring Initializr,并选择你所需要的插件,现工程需要的是Web(Spring Web)和 SQL(MyBatis Framework和MySQL Driver)
利用Spring Boot为Android App搭建一个简易的后台(一)再新建class文件UserContoroller,写入getUserList方法,点击运行,并在浏览器中输入网址 http://localhost:8080/getuserlist 测试一下。

@RestController
public class UserController {
    @RequestMapping("/getuserlist")
    public String getUserList() {
        return "获取成功";
    }
}

成功后,再新建class文件ApiResult返回通用的结果。code为错误码,status为错误码的说明,data为需要返回的信息,所以类型为Object,message为相关信息。

public class ApiResult {
    private int code;
    private String status;
    private Object data;
    private String message;
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

最后回到UserContoroller,修改getUserList方法。

@RestController
public class UserController {
    @RequestMapping("/getuserlist")
    public ApiResult getUserList() {

        //返回结果
        ApiResult apiResult = new ApiResult();
        apiResult.setCode(300);//成功的代码
        apiResult.setStatus("Success");//状态
        apiResult.setData("123456");//需要返回的信息

        return apiResult;
    }
}

现在能获取到结果了,但我们想要的是SQL数据库中存储的信息,而不是固定的字符串。
所以就到SQL的处理了。
先在resources文件夹下的application.properties中配置SQL的信息。
其中XXX为SQL的地址,如果本地则为localhost,阿里云则为外网ip。demoapp为数据库名,yyy为数据库的密码。?serverTimezone=UTC 用于设定时区,如果删除可能会出现You must configure either the server or JDBC driver to use a more specifc time zone value if you want to utilize time zone support的报错。

#配置sql
# ?serverTimezone=UTC 为设定时区
spring.datasource.url=jdbc:mysql://XXX:3306/demoapp?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=yyy
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

然后再添加数据源,在右则的Database中点击+号 Data Source —> MySQL,填上数据库的信息。Test Connection 出现Successful 就OK了(如果Test Connection为灰色不可点击,点击下方的提示,下载driver即可),之后就可以IDEA的Database中支持查看此数据库了。
利用Spring Boot为Android App搭建一个简易的后台(一)对数据库的操作有JDBC和JPA两种方法,其中JPA为SpringBoot推荐的使用方法,所以这里就使用JPA。
首先添加JPA的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

然后修改application.properties,新增JPA的配置。注意:如果表格有数据,不要使用create模式,同名表格会被覆盖。

#在建表的时候,将默认的存储引擎切换为InnoDB
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#程序启动时删除并且创建实体类对应的表(注意:配置了这个之后,如果有同名的表,会被删除覆盖,慎用)
#spring.jpa.hibernate.ddl-auto=create

之后新建两个class文件,实体对象UserDAO.java 和 数据库访问层UserRepository.java(如果上面没有使用create模式,要到MySQL Workbench 中新建 user_info表格 )
UserDAO:实体类需要使用 @Entity 注解标注。并且实体类的属性也要进行标注,使用 @Id 标注主键,使用 @Column 标注非主键。
示例:

import javax.persistence.*;

/**
* USER表格
* */

@Entity
@Table(name="user_info") //指定表名
public class UserDao {
    @Id //主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer userId;
    
    @Column(name="user_name")
    private String userName;

    @Column(name="user_password")
    private String userPassword;

    @Column(name="user_mailbox")
    private String userMailbox;

    @Column(name="user_phone")
    private String userPhone;

    @Column(name="user_token")
    private String userToken;

    @Column(name="user_repository_time")
    private String userRepositoryTime;

    @Column(name="user_login_last_time")
    private String userLoginLastTime;

    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public String getUserMailbox() {
        return userMailbox;
    }
    public void setUserMailbox(String userMailbox) {
        this.userMailbox = userMailbox;
    }

    public String getUserPhone() {
        return userPhone;
    }
    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone;
    }

    public String getUserToken() {
        return userToken;
    }
    public void setUserToken(String userToken) {
        this.userToken = userToken;
    }

    public String getUserRepositoryTime() {
        return userRepositoryTime;
    }
    public void setUserRepositoryTime(String userRepositoryTime) {
        this.userRepositoryTime = userRepositoryTime;
    }

    public String getUserLoginLastTime() {
        return userLoginLastTime;
    }
    public void setUserLoginLastTime(String userLoginLastTime) {
        this.userLoginLastTime = userLoginLastTime;
    }

}

UserRepository.java:Repository为数据库访问层,它在内部封装了数据查询和存储的逻辑,也可以在这里自定义DAO的实现方法。

@Repository
public interface UserRepository extends JpaRepository<UserDao,Integer> {

}

最后 JPA增删查改的基本使用:
增加User:使用Repository.save方法

@Autowired
private UserRepository userRepository;
public void addUser(UserDao userInfo){
    UserDao userDao=new UserDao();
    userDao.setUserName(userInfo.getUserName());
    userRepository.save(userDao);
}

删除User:使用Repository.delete方法

@After 
public void after(){ 
    userRepository.deleteById(1);
}

查找User:使用 Repository.findByXXX或者 Repository.findAll;
默认只提供Repository.findById方法,如果要根据UserName查询,需要在UserRepository中自定义,UserRepository中方法的命名有一定的规则。如果表中为id,则为findById。如果表中为user_name,则为findByUserName。
示例:
自定义方法:

@Repository
public interface UserRepository extends JpaRepository<UserDao,Integer> {

    public List<UserDao> findByUserName(String userName); //通过UserName查询

    public List<UserDao> findByUserMailbox(String userMailbox);//通过Mailbox查询

    public List<UserDao> findByUserToken(String token);//通过UserToken查询

}

查询方法:

public List<UserDao> getUser(String name){
    List<UserDao> userInfos= userRepository.findByUserName(name);
    return userInfos;
}

更新方法:
JPA没有默认的更新方法,需要在UserRepository中自定义更新方法。或者使用save方法代替。
其中自定义更新方法 @Query中“value”为SQL语法,nativeQuery 为是否原生的SQL语句

//更新指定UserName的userLoginLastTime
@Query(value = "update "+ TableInfo.userTable +" set "+ TableInfo.userTable_loginLastTime+"=?2 where "+ TableInfo.userTable_name+"=?1 ", nativeQuery = true)
@Transactional
@Modifying
public void updateLoginLastTime(String name,String userLoginLastTime);

最后还是回到UserContoroller,修改getUserList方法。

@Autowired
private UserRepository userRepository;

@RestController
public class UserController {
    @RequestMapping("/getuserlist")
    public ApiResult getUserList() {
        int code = 0;
        String status = "unknown error";
        UserDao data = new UserDao();
        try {
            data=userRepository.findByUserName();
                      code=300;
        }catch (Exception e){
            status=String.valueOf(e);
        }
        //返回结果
        ApiResult apiResult = new ApiResult();
        apiResult.setCode(code);
        apiResult.setStatus(status );
        apiResult.setData("123456");//需要返回的信息

        return apiResult;
    }
}

重新点击运行,并在浏览器中输入网址 http://localhost:8080/getuserlist 测试能否获取返回成功。

五、把后台部署到阿里云服务器

上面只是在本地跑通了,但后台是要部署到服务器上才能真正发挥它的作用。所以你需要一个阿里云服务器(如果之前完全没使用过阿里云服务器,可以参考一下 手游SDK-Maven私有仓库的搭建 中的阿里云服务器部分)

首先在阿里云上安装MySQL。
安装完成后配置访问权限,不配置访问权限你是连接不上的。

打开cmd进入到MySQL安装目录的bin文件夹下
输入mysql命令和账号密码

# mysql -u root -p

切换到mysql库

use mysql;

查看当前用户表,当前的host(root)还是localhost

select host,user from user;

利用Spring Boot为Android App搭建一个简易的后台(一)
我们需要更新user用户表,把root变为允许外网ip访问。如果只需要指定ip才能访问,那把%还成指定ip即可
update user sethost= '%' whereuser= 'root' LIMIT 1;

分配访问权限(如已分配过了,这步可跳过)

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root密码' WITH GRANT OPTION;

最后强制刷新权限

flush privileges;

再次查询用户表,此时的root的host已更改为%(或者指定的ip)

select host,user from user;

利用Spring Boot为Android App搭建一个简易的后台(一)
修改完访问权限,还需要配置阿里云的安全组规则。
阿里云的安全组规则的配置:
登入阿里云控制台,网络与安全—>安全组—>配置规则—>添加安全组规则,开放MySQL的3306端口。
利用Spring Boot为Android App搭建一个简易的后台(一)
打开本地的MySQL Workbench新建阿里云MySQL的连接(把原本的localhost也就是图中的xxxxx修改为阿里云的公有ip)。此时就能打开阿里云MySQL了。
利用Spring Boot为Android App搭建一个简易的后台(一)然后回到工程,把application.properties和Database中的localhost修改为阿里云的公网ip,重新运行,测试OK就可以打包了。

最后在IDEA的Terminal窗口中使用mvn clean package命令进行打包,打包完成后会在target目录下生成jar包。然后把生成xxx-xx-SNAPSHOT.jar复制到阿里云服务器上,打开cmd运行。

java -jar xxx-xx-SNAPSHOT.jar

利用Spring Boot为Android App搭建一个简易的后台(一)
打开浏览器,输入http://阿里云公网ip:8091/getuserlist,8091为端口号,因为一般不使用8080端口号。端口号的设置可以在application.properties中通过server.port=8091设定。看看测试结果。

你有可能踩到的坑:
1、Could not create connection to database server。
是因为MySQL的版本与工程中使用的版本不一致。可以修改pom.xml中mysql的版本

2、运行时出现 org.springframework.orm.jpa.JpaSystemException: could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement
数据表的主键没有设置,可以把其设置为自增(AI 打钩)