一.后台支持(dao与service)
1.1 Dao层
1.1.1 创建BaseRepsitory接口
@NoRepositoryBean :
让Spring管理的时候不要为它创建实现因为其下有多个子接口,创建实现类时,不知道具体创建哪个
/**
* 公共的父Repository
* @param <T>
* @param <ID>
*/
@NoRepositoryBean
public interface BaseRepository<T,ID extends Serializable> extends JpaRepository<T,ID>,JpaSpecificationExecutor<T> {
}
1.1.2 EmployeeRepsitory
注意: 改成继承
BaseRepsitory 加入泛型类型
public interface EmployeeRepository extends BaseRepository<Employee,Long>{
...
}
1.2 Service层
1.2.1 IBaseService:父接口 定义一些方法
/**
* Service的父接口(所有service都有CRUD)
*/
public interface IBaseService<T, ID extends Serializable> {
//添加或者修改
void save(T t);
//删除
/**
* 联合主键
* 在JPA中,要求主键必需实现Serializable接口
* @param id
*/
void delete(ID id);
//根据id查询一条数据
T findOne(ID id);
//查询所有数据
List<T> findAll();
//1.根据查询条件(query对象)查询对应的数据
List<T> queryAll(BaseQuery query);
//2.根据查询条件(query对象)查询对应的分页(排序)数据
Page<T> queryPage(BaseQuery query);
//3.根据JPQL进行查询
/**
*
* @param jpql select o.username,o.age from ... where username like ? and email like ?
* @param params
* @return
*/
List findByJpql(String jpql,Object... params);
}
1.2.2 BaseServiceImpl: 实现
注意整成抽象类,并添加事务;注入BaseRepository时,添加泛型
/**
* 抽象的类是无法创建对象的(只能做父类)
* 实现类无法确定接口中泛型的类型
* @param <T>
* @param <ID>
*/
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
public abstract class BaseServiceImpl<T,ID extends Serializable> implements IBaseService<T,ID> {
/**
* Spring会把相应的BaseRepository<T,ID>实现对象注入进来
* BaseRepository -> EmployeeRepository<Employee,Long>
* DepartmentRepository<Department,Long>
* RoleRepository<Role,Long>
* 我们怎么确定注入的是哪一个对象呢? -> 当用的时候自然就知道了!!
* EmployeeServiceImpl extends BaseServiceImpl<Employee,Long>
* new EmployeeServiceImpl().save();
*/
@Autowired
private BaseRepository<T,ID> baseRepository;
//自动从当前上下文中获取这个对象
@PersistenceContext
private EntityManager entityManager;
@Override
@Transactional
public void save(T t) {
baseRepository.save(t);
}
@Override
@Transactional
public void delete(ID id) {
baseRepository.delete(id);
}
@Override
public T findOne(ID id) {
return baseRepository.findOne(id);
}
@Override
public List<T> findAll() {
return baseRepository.findAll();
}
//根据查询条件(query对象)查询对应的数据
@Override
public List<T> queryAll(BaseQuery query) {
//1.拿到规则
Specification spec = query.createSpec();
//2.根据规则进行查询
return baseRepository.findAll(spec);
}
//根据查询条件(query对象)查询对应的分页数据
@Override
public Page<T> queryPage(BaseQuery query) {
//1.拿到规则
Specification spec = query.createSpec();
//2.拿到排序对象
Sort sort = query.createSort();
//3.拿到分页对象
Pageable pageable = new PageRequest(query.getJpaPage(),query.getPageSize(),sort);
//4.返回分页对象
return baseRepository.findAll(spec,pageable);
}
//执行jpql,就必需要EntityManager对象
/**
* @param jpql select o.username,o.age from ... where username like ? and email like ?
* @param params 对应的是?的值 -> 可变参数就是数组
* @return
*/
@Override
public List findByJpql(String jpql, Object... params) {
//1.获取query对象
Query query = entityManager.createQuery(jpql);
//2.循环params参数(对应的是?的值)
for (int i = 0; i < params.length; i++) {
//这里设置值是从1开始的
query.setParameter(i+1,params[i]);
}
//3.返回数据
return query.getResultList();
}
}
1.2.3 IEmployeeService
/**
* 现在没有代码,不代表以后没有!以后会有一些关于员工的特有的功能
*/
public interface IEmployeeService extends IBaseService<Employee,Long> {
}
1.2.4 EmployeeServiceImpl
@Service
public class EmployeeServiceImpl extends BaseServiceImpl<Employee,Long>
implements IEmployeeService {
}
关注公众号,获取免费软件、资料,笔记等。