一、安装IDEA
工欲善其事必先利其器,先下载安装开发工具IDEA。
二、安装MySQL
需要安装mysql和mysql-workbench
三、新建数据库并存入相关测试数据
1、打开MySQL Workbench,新建数据库连接。(点击MySQL Connection 旁边的+号添加)
本地的Hostname为localhost
2、新建数据库
Create a new schema in the connected server
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工程
选择Spring Initializr,并选择你所需要的插件,现工程需要的是Web(Spring Web)和 SQL(MyBatis Framework和MySQL Driver)
再新建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中支持查看此数据库了。
对数据库的操作有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;
我们需要更新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;
修改完访问权限,还需要配置阿里云的安全组规则。
阿里云的安全组规则的配置:
登入阿里云控制台,网络与安全—>安全组—>配置规则—>添加安全组规则,开放MySQL的3306端口。
打开本地的MySQL Workbench新建阿里云MySQL的连接(把原本的localhost也就是图中的xxxxx修改为阿里云的公有ip)。此时就能打开阿里云MySQL了。
到工程,把application.properties和Database中的localhost修改为阿里云的公网ip,重新运行,测试OK就可以打包了。
最后在IDEA的Terminal窗口中使用mvn clean package命令进行打包,打包完成后会在target目录下生成jar包。然后把生成xxx-xx-SNAPSHOT.jar复制到阿里云服务器上,打开cmd运行。
java -jar xxx-xx-SNAPSHOT.jar
打开浏览器,输入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搭建一个简易的后台(一)