1 前言&概述
这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug。
本文是SpringBoot
+Android
+MySQL
的增删查改的简单实现,用到的技术包括Jackson
、OkHttp
、bouncycastle
、Spring Data JPA
。
2 环境
Android 4.1.2
IDEA 2020.3.1
Spring Boot 2.4.2
MySQL 8.0.23
OpenJDK 11
环境准备就略过了。
3 后端
3.1 新建项目
依赖:
3.2 项目结构
3.3 实体类
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private String password;
}
基本的Lombok
注解+JPA
中的两个注解:
@Id
:标识主键@GeneratedValue
:主键生成策略,包括四个
主键生成策略如下:
GenerationType.TABLE
:使用一个特定的数据库表格来保存主键,不依赖外部环境和数据库的具体实现,但是不能充分利用数据库特性,一般不会优先使用,且一般配合@TableGenerator
使用GenerationType.SEQUENCE
:一些数据库不支持主键自增(如Oracle
),这时就可以使用SEQUENCE
,只有部分(Oracle
/DB2
/PostgreSQL
)支持序列对象,一般不用于其他数据库GenerationType.IDENTITY
:一般意义上的主键自增长,插入数据时自动给主键复制,比如MySQL
中的auto_increment
GenerationType.AUTO
:主键生成策略交给持久化引擎,持久化引擎会根据数据库在以上三种主键策略中选择其中一种,这是JPA
默认的主键生成策略
3.4 持久层
继承CrudRepository<T,ID>
,T
为实体类,ID
为主键类型:
@Repository
public interface UserRepository extends CrudRepository<User,Integer> {
boolean existsByName(String name);
User findByNameAndPassword(String name,String password);
}
一个需要注意的点是CrudRepository<T,ID>
继承了Repository<T,ID>
,而后者有一个叫查询方法
的特性,就是说能根据一些方法中指定的关键字去生成对应的SQL
,比如第一个方法existsByName
,就根据name
判断用户是否存在,参数为一个String name
,返回boolean
,具体的关键字以及例子参考如下:
3.5 业务层
@Transactional
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class UserService {
private final UserRepository repository;
public boolean exists(User user){
return repository.existsByName(user.getName());
}
public User findByNameAndPassword(User user){
return repository.findByNameAndPassword(user.getName(),user.getPassword());
}
public boolean insert(User user){
repository.save(user);
return true;
}
public boolean update(User user){
if(repository.findById(user.getId()).isEmpty()){
return false;
}
repository.save(user);
return true;
}
public boolean deleteById(int id){
if(!repository.existsById(id)){
return false;
}
repository.deleteById(id);
return true;
}
}
注解解释如下:
@Transactional
:@Service
:标识为业务层,实际效果等价于@Component
@RequiredArgsConstructor
:Lombok
中的一个注解,主要是为了解决如下的警告:
其他一些根据方法名就知道含义的方法就不解释了。
3.6 控制层
@RestController
@RequestMapping("/")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class UserController {
private final UserService service;
@PostMapping("sign/in/up")
public ResponseBody signInUp(@Reque