JPA用户表的对象我能理解
package com.neo.model;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Entity
public class UserInfo implements Serializable {
@Id
@GeneratedValue
private Integer uid;
@Column(unique =true)
private String username;//帐号
private String name;//名称(昵称或者真实姓名,不同系统不同定义)
private String password; //密码;
private String salt;//加密密码的盐
private byte state;//用户状态,0:创建未认证(比如没有激活,没有输入验证码等等)--等待验证的用户 , 1:正常状态,2:用户被锁定.
@ManyToMany(fetch= FetchType.EAGER)//立即从数据库中进行加载数据;
@JoinTable(name = "SysUserRole", joinColumns = { @JoinColumn(name = "uid") }, inverseJoinColumns ={@JoinColumn(name = "roleId") })
private List<SysRole> roleList;// 一个用户具有多个角色
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public byte getState() {
return state;
}
public void setState(byte state) {
this.state = state;
}
public List<SysRole> getRoleList() {
return roleList;
}
public void setRoleList(List<SysRole> roleList) {
this.roleList = roleList;
}
/**
* 密码盐.
* @return
*/
public String getCredentialsSalt(){
return this.username+this.salt;
}
//重新对盐重新进行了定义,用户名+salt,这样就更加不容易被破解
}
这里也能明白就是继承了这个CrudRepository能让它拥有基本的增删查改操作
也用了自定义的方法。
相当于是select * from userinfo where username = ?
不知道这样的理解是不是正确!
package com.neo.dao;
import com.neo.model.UserInfo;
import org.springframework.data.repository.CrudRepository;
public interface UserInfoDao extends CrudRepository<UserInfo,Long> {
/**通过username查找用户信息;*/
public UserInfo findByUsername(String username);
}
接下来是我不能理解的。
定义了一个接口
package com.neo.sevice;
import com.neo.model.UserInfo;
public interface UserInfoService {
/**通过username查找用户信息;*/
public UserInfo findByUsername(String username);
}
继承了接口并把接口的方法实现了,然后把UserInfoDao 引进来,在方法里把findByUsername返回。。。。。
package com.neo.sevice.impl;
import com.neo.dao.UserInfoDao;
import com.neo.model.UserInfo;
import com.neo.sevice.UserInfoService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Resource
private UserInfoDao userInfoDao;
@Override
public UserInfo findByUsername(String username) {
System.out.println("UserInfoServiceImpl.findByUsername()");
return userInfoDao.findByUsername(username);
}
}
我不明白的是,这样实现一遍在其他地方用的时候调用
@Resource
privete UserInfoService
和我直接调用
@Resource
privete UserInfoDao
这有什么区别吗?
不太明白为什么还要直接换个接口实现一边。
就是Dao层、Service层的问题而已了,当Service只做简单的CRUD时候,确实会疑惑,但还是有必要去做的,一个是事务问题,做好在Service做掉,你放到Controller层不合理,再有,项目做起来后,Service不单单只是CRUD,Service的一个方法就是一个业务逻辑,很可能涉及到多个数据查询、更新、缓存、MQ等等。所以,不要仅仅看Service层的CRUD,做复杂了,比如引入缓存等的,就可以看到区别了