5.5 repository和service
repository相当于hibernate的dao,SpringBoot对它提供了强大的支持
一 首先修改实体类
新建一个包entities,由于springboot不再需要hbm.xml文件,所以这里只需要复制java类过来:
package com.jssp.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Set;
@Entity
public class User{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private String username;
private String password;
private String role;
private String nickname;
private String createDate;
private String wxOpenid;
public User(){
}
public User(String username){
super();
this.username=username;
}
public User(String username,String password,String role,String nickname,String createDate){
this.username=username;
this.password=password;
this.role=role;
this.nickname=nickname;
this.createDate=createDate;
}
public String getUsername(){
return this.username;
}
public void setUsername(String username){
this.username=username;
}
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password=password;
}
public String getRole(){
return this.role;
}
public void setRole(String role){
this.role=role;
}
public String getNickname(){
return this.nickname;
}
public void setNickname(String nickname){
this.nickname=nickname;
}
public String getCreateDate(){
return this.createDate;
}
public void setCreateDate(String createDate){
this.createDate=createDate;
}
public String getWxOpenid(){
return wxOpenid;
}
public void setWxOpenid(String wxOpenid){
this.wxOpenid=wxOpenid;
}
}
为了简单,先运行起来,删除因为外键引用生成的集合,然后修改dao,改为repository:
这个是UserRepository.java
package com.jssp.data.repositories;
import com.jssp.entities.User;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repositorypublic
interface UserRepository extends CrudRepository<User,String>{
public User findByUsername(String username);
/**
* 通过微信公众号查找用户 * @param wxopenid * @return
*/
List<User>findByWxOpenid(String wxopenid);
/**
根据账号查找role
*/
@Query(value="SELECT u
.role FROM User u WHERE u
.username=:name")public String queryRoleByName(String name);
/**
根据role查找用户
*/
List findByRole(String role);
/**
保存用户
*/
User save(User user);
/**
删除用户
*/
void delete(User user);
/**
查询用户是否存在
*/
boolean existsByUsername(String username);
这里的方法,都需要符合规范,例如:findByXXX,xxx必须是存在的字段。repository不用写实现类,只需要定义接口,这是很方便的。
repository只管数据库的增删查改的操作,其他的并不会帮你实现。由于这样的机制,使得业务逻辑一定不能写在这里,所以必须要写service类,把业务相关的写在这里,以下是UserService.java:
@Service
public class UserService implements IUserService{
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository){
this.userRepository=userRepository;
}
@Override
public boolean isUserExist(String username){
return this.userRepository.existsByUsername(username);
}
}
对于UserRepository,再也不用getter和setter方法了,但是需要一个以它为参数的构造函数,这个构造函数上有@Autowired标签,自动配置repository的实现。IUserService接口的代码就没有列出来了。
最后在主函数那里测试一下:
@Controller
@SpringBootApplication
public class WebApplication{
private static final Logger log=LoggerFactory
.getLogger(WebApplication.class);
private PagingAndSortingRepository<User,Long>Page;
public static void main(String[]args){
SpringApplication.run(WebApplication.class,args);
}
@GetMapping("/index")
@Bean
public String index(IUserService u)throws IOException{
System.out.println(u.isUserExist("abcd"));
return "index";
}
}
index方法本来是相应/index请求的,这里我IUserService参数是接口,必须在这个函数上声明@Bean才能自动装配这个UserService。运行的结果表明正常运行,打印了true: