文章目录
一、自增操作
1.数据库中的表是自增的
AI表示Auto Increme
2.Entity类的annatation和setter、getter方法
-
关键是
@GeneratedValue(strategy = GenerationType.IDENTITY)
的声明,表示自增。如果没用这个的话,saveAndFlush()
返回的对象中是不会获得自增的值的。 -
setter、getter方法也是必须的。
-
其他基本的也得ok
@Entity
、@Id
、@Column(name = "userid")
package com.sand.alphon.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import jdk.nashorn.internal.objects.annotations.Getter;
import javax.persistence.*;
@Entity
public class User {
@Id
@Column(name = "userid")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int userId;
private String password;
private String name;
private int sex;
private int age;
private String email;
@Column(name = "phonenum")
private String phoneNum;
private String type;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
3.Service
不需要在DAO中写,默认生成的方法saveAndFlush()
就好。
@Service
public class UserService {
@Autowired
UserDAO userDAO;
/*
* 增
* 因为是不指定userId,而是自增,所以不检查存在与否
* 使用save()不能获得新增的主键userId,因为没真正提交,要使用saveAndFlush
*/
public User add(User user){
return userDAO.saveAndFlush(user);
}
}
(1)saveAndFlush
区别:
- 使用
saveAndFlush()
:此命令中的更改将立即刷新到DB。 - 使用
save()
:不一定了,它可能只暂时保留在内存中,直到发出flush或commit命令。
所以:
- 使用
saveAndFlush()
方法就可以立即获取到这条数据的自增id。 - 使用
save()
方法,你不flush()或者commit,你得数据是暂时只在内存中保存,所以此时这条数据是没有主键id的。
(2)为何自增的id是非null
这样我在调用的时候,不用传userId,调用自增后就能获得自增的userId。(其实默认实例化后是0
,但userId是主键非null,所以数据库判断后帮助我们自增一个非null 的useId。)
User user = new User();
user.setName(map.get("name").toString());
user.setPassword(map.get("password").toString());
user.setEmail(map.get("email").toString());
user.setPhoneNum(map.get("phonenum").toString());
user.setSex((int)Double.parseDouble(map.get("sex").toString()));
user.setAge((int)Double.parseDouble(map.get("age").toString()));
user.setType("reader");
// System.out.println(user.getUserId()); // 其实是0
User resultUser = userService.add(user);
System.out.println(resultUser.getUserId());
二、更新操作
1.DAO
/*
* 改
* saveAndFlush()本来就能做到不存在插入新的,存在更新旧的。
* 我们只想更新一个旧值,而不是整一个新的输错的值。
*/
public boolean update(User user){
if(userDAO.existsById(user.getUserId())){
userDAO.saveAndFlush(user);
return true;
}else {
return false;
}
}
2.saveAndFlush()机制
我们之所以不直接使用saveAndFlush()
,是因为它的机制:
- 如果没有这个
userId
,即要插入新记录:那么就会调用DB的insert
语句
- 如果已有这个
userId
,即要更新旧记录:那么就会调用DB的update
语句
所以,先判断userId
存在吗,再决定更新。