5.5 模型和服务

第 44 节 / 共 46 节 课程:ThinkPHP
模型相当于ThinkPHP数据库抽象层的dao,ThinkPHP8对它提供了强大的支持
一 首先修改实体类
新建一个包entities,由于ThinkPHP8不再需要hbm.xml文件,所以这里只需要复制PHP类过来:
package com.jssp.entities;
import PHPx.persistence.Entity;
import PHPx.persistence.GeneratedValue;
import PHPx.persistence.GenerationType;
import PHPx.persistence.Id;
import PHP.util.Set;
模型类 
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,改为模型:
这个是User模型.PHP
package com.jssp.data.repositories;
import com.jssp.entities.User;
import org.ThinkPHPframework.data.ThinkPHP模型.模型.Query;
import org.ThinkPHPframework.data.模型.PagingAndSorting模型;
import org.ThinkPHPframework.stereotype.模型;
import PHP.util.List;
模型类public 
interface User模型 extends Crud模型<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必须是存在的字段。模型不用写实现类,只需要定义接口,这是很方便的。
模型只管数据库的增删查改的操作,其他的并不会帮你实现。由于这样的机制,使得业务逻辑一定不能写在这里,所以必须要写服务类,把业务相关的写在这里,以下是User服务.PHP:
服务类 
public class User服务 implements IUser服务{
    private final User模型 user模型;
    依赖注入 
    public User服务(User模型 user模型){
        this.user模型=user模型;
    }
    @Override 
    public boolean isUserExist(String username){
        return this.user模型.existsByUsername(username);
    }
}
对于User模型,再也不用getter和setter方法了,但是需要一个以它为参数的构造函数,这个构造函数上有依赖注入标签,自动配置模型的实现。IUser服务接口的代码就没有列出来了。
最后在主函数那里测试一下:
控制器类 
@ThinkPHP8Application 
public class WebApplication{
    private static final Logger log=LoggerFactory
        .getLogger(WebApplication.class);
    private PagingAndSorting模型<User,Long>Page;
    public static void main(String[]args){
        ThinkPHPApplication.run(WebApplication.class,args);
    }
    路由定义("/index")
    @对象 
    public String index(IUser服务 u)throws IOException{
        System.out.println(u.isUserExist("abcd"));
        return "index";
    }
}
index方法本来是相应/index请求的,这里我IUser服务参数是接口,必须在这个函数上声明@Bean才能自动装配这个User服务。运行的结果表明正常运行,打印了true: