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: