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

一、安装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搭建一个简易的后台(一)_第1张图片
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搭建一个简易的后台(一)_第2张图片

四、新建Spring Boot工程

选择Spring Initializr,并选择你所需要的插件,现工程需要的是Web(Spring Web)和 SQL(MyBatis Framework和MySQL Driver)
利用Spring Boot为Android App搭建一个简易的后台(一)_第3张图片再新建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搭建一个简易的后台(一)_第4张图片对数据库的操作有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搭建一个简易的后台(一)_第5张图片
我们需要更新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搭建一个简易的后台(一)_第6张图片
修改完访问权限,还需要配置阿里云的安全组规则。
阿里云的安全组规则的配置:
登入阿里云控制台,网络与安全—>安全组—>配置规则—>添加安全组规则,开放MySQL的3306端口。
利用Spring Boot为Android App搭建一个简易的后台(一)_第7张图片
打开本地的MySQL Workbench新建阿里云MySQL的连接(把原本的localhost也就是图中的xxxxx修改为阿里云的公有ip)。此时就能打开阿里云MySQL了。
利用Spring Boot为Android App搭建一个简易的后台(一)_第8张图片然后回到工程,把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搭建一个简易的后台(一)_第9张图片
打开浏览器,输入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 打钩)

你可能感兴趣的:(#,spring,android)