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为主键类型:
@Repository
public interface UserRepository extends CrudRepository {
boolean existsByName(String name);
User findByNameAndPassword(String name,String password);
}
一个需要注意的点是CrudRepository继承了Repository,而后者有一个叫查询方法的特性,就是说能根据一些方法中指定的关键字去生成对应的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(