spring boot获取datasource为null_利用Spring Boot为Android App搭建一个简易的后台(一)...

一、安装IDEA

工欲善其事必先利其器,先下载安装开发工具IDEA。

二、安装MySQL

需要安装mysql和mysql-workbench

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

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

本地的Hostname为localhost

2、新建数据库

Create a new schema in the connected server

2302058f98468dc3a9b2124b31f085d6.png

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 都勾上)

288fb6ea82339f734956b3d3131935c9.png

四、新建Spring Boot工程

选择Spring Initializr,并选择你所需要的插件,现工程需要的是Web(Spring Web)和 SQL(MyBatis Framework和MySQL Driver)

67cd790e8f11dec5f7f60d7331b61611.png

再新建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中支持查看此数据库了。

3fb7df5d70f7e0e521aeba0833d21768.png

对数据库的操作有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;

6a25b1d80a646c6ba72bba98ae346c1f.png

我们需要更新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;

4de988b0eb5043e1573af10edda370f7.png

修改完访问权限,还需要配置阿里云的安全组规则。

阿里云的安全组规则的配置:

登入阿里云控制台,网络与安全—>安全组—>配置规则—>添加安全组规则,开放MySQL的3306端口。

c7fd99fa70f736c6a9f9f68c669ac3f6.png

打开本地的MySQL Workbench新建阿里云MySQL的连接(把原本的localhost也就是图中的xxxxx修改为阿里云的公有ip)。此时就能打开阿里云MySQL了。

b24ab88256745ba8677fbdd65eee2265.png

到工程,把application.properties和Database中的localhost修改为阿里云的公网ip,重新运行,测试OK就可以打包了。

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

java -jar xxx-xx-SNAPSHOT.jar

ca5c335aa5131706e1ff72a3d284df11.png

打开浏览器,输入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 打钩)

作者CSDN地址:利用Spring Boot为Android App搭建一个简易的后台(一)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值