赞
踩
User
类UserDAO
接口(继承JpaRepository<User, Integer>
)UserService
类spring boot jpa学习:1.Model类的注释annatation
spring boot jpa学习:2.DAO和Service的自增id、删、查、改操作
spring boot jpa学习:3.Controller层的入门
AI表示Auto Increme
关键是@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; } }
不需要在DAO中写,默认生成的方法saveAndFlush()
就好。
@Service
public class UserService {
@Autowired
UserDAO userDAO;
/*
* 增
* 因为是不指定userId,而是自增,所以不检查存在与否
* 使用save()不能获得新增的主键userId,因为没真正提交,要使用saveAndFlush
*/
public User add(User user){
return userDAO.saveAndFlush(user);
}
}
区别:
saveAndFlush()
:此命令中的更改将立即刷新到DB。save()
:不一定了,它可能只暂时保留在内存中,直到发出flush或commit命令。所以:
saveAndFlush()
方法就可以立即获取到这条数据的自增id。save()
方法,你不flush()或者commit,你得数据是暂时只在内存中保存,所以此时这条数据是没有主键id的。这样我在调用的时候,不用传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());
直接用默认的deleteByXXX()
和existsByXXX()
。
/*
* 删
* 先返回存在与否(不存在就是删除失败),然后删除
*/
public boolean delete(int userId){
// 表示没有,你删错了
if(!userDAO.existsById(userId)){
return false;
}
userDAO.deleteById(userId);
return true;
}
如果只用根据主键查找的话,不用DAO中写东西。
因为有默认的查找主键的方法,findById()
。
这个函数返回一个容器Optional
对象。
optional.orElse(null)
的意思是:
userId
存在,则返回对应的User
对象;orElse()
中的东西,我这里让返回null
。代码:
/*
* 查
* 返回User类
*/
public User findByUserId(User user){
return userDAO.findById(user.getUserId()).orElse(null);
}
不用DAO中写东西,用默认的findAll()
userDAO.findAll()
按照findByXXX
,组合列名和逻辑旧行了,都不用实现。比如,
public interface UserDAO extends JpaRepository<User,Integer> {
// 根据userName查找
List<User> findAllByName(String name);
// 根据userId和name一起查找都符合的
User findByUserIdAndName(int userId,String name);
}
直接用默认的existsByXXX()
和saveAndFlush()
。
/*
* 改
* saveAndFlush()本来就能做到不存在插入新的,存在更新旧的。
* 我们只想更新一个旧值,而不是整一个新的输错的值。
*/
public boolean edit(User user){
if(userDAO.existsById(user.getUserId())){
userDAO.saveAndFlush(user);
return true;
}else {
return false;
}
}
我们之所以不直接使用saveAndFlush()
,是因为它的机制:
userId
,即要插入新记录:那么就会调用DB的insert
语句userId
,即要更新旧记录:那么就会调用DB的update
语句所以,先判断userId
存在吗,再决定更新。
@Query(value = "select * from book",nativeQuery = true)
List<String> myFindCategory();
函数名不要和默认函数重复。
两个:value
是sql语句和nativeQuery=true
表示使用sql原生语句
@Query(value = "select * from book where book.bookname = '高数1'", nativeQuery = true)
List<Book> findAllByBookName(String bookName);
将其值用''
包括起来。
@Query(value = "select * from book where bookid = ?1",nativeQuery = true)
List<String> myFindCategory(int bookid);
?1
就是函数传进来的第一个参数,以此类推?2
……
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。