Java 仓储模式
使用的Spring boot +Jpa
项目层级:
common里包含了model,以及一些viewModel等等

下面就是设计的仓储模式
先看下SysUser:
@MappedSuperclass
public class SuperBaseModel {
//基本属性
}
@MappedSuperclass
public class BaseModel extends SuperBaseModel {
//枚举值:https://blog.csdn.net/hanjun0612/article/details/72845960
private Integer isValid =EnumList.ValidEnum.Valid.getEnumItem().getItemKey(); @Column(name="IsValid")
public Integer getIsValid() {
return isValid;
} public void setIsValid(Integer isValid) {
this.isValid = isValid;
} }
@Entity
@Table(name = "sys_user", catalog = "kps_business")
@DynamicUpdate
public class SysUser extends BaseModel implements java.io.Serializable {
//get set
}
枚举值,请查看 https://blog.csdn.net/hanjun0612/article/details/72845960
一,dao创建MyJpa
@NoRepositoryBean
public interface MyJpaRepository<T,ID extends Serializable> extends JpaRepository <T,ID>,JpaSpecificationExecutor<T>{ }
接着创建一个 SysUserDao,里面额外创建了3个方法。
@Repository
public interface SysUserDao extends MyJpaRepository<SysUser, String>{
public SysUser getByAccount(String account);
public SysUser getByAccountAndPlatformUUID(String account,String platformUUID);
public SysUser getByUserUUId(String userUUId);
}
这里MyJpaRepository<SysUser,String>
首先传入的是对象SysUser,其次传入了一个String 的UUID
如果你是Integer,那你自行修改就可以了。
二,service
先创建BaseSuperService
public interface BaseSuperService<T extends SuperBaseModel,ID extends Serializable> extends MyJpaRepository<T, ID> {
/**
* 分页查询
*/
PageResult<T> pagedList(T entity,Integer currentPage,Integer pageSize,Order...orders);
PageResult<T> pagedList(T entity,Integer currentPage,Order...orders);
}
接着创建BaseService
public interface BaseService<T extends BaseModel,ID extends Serializable> extends BaseSuperService<T, ID> {
/**
* 分页查询(有效的记录)
*/
PageResult<T> pagedListForVaild(T entity,Integer currentPage,Integer pageSize,Order...orders) throws Exception;
PageResult<T> pagedListForVaild(T entity,Integer currentPage,Order...orders) throws Exception;
}
这里,你可以只创建一个BaseService。我是由于后期有两个领域模型
第一个领域模型,只需要BaseSuperService的pagedList方法
第二个领域模型,需要BaseSuperService的pagedList方法,以及BaseService的PagedListForVaild方法
因此才创建了两个层级。
最后创建UserService
public interface SysUserService extends BaseService<SysUser,String>{
public SysUser getByAccountAndPlatformUUID(String account,String platformUUID);
public SysUser getByAccount(String account);
public SysUser getByUserUUId(String userUUID);
}
三,创建Impl
首先创建BaseSuperServiceImpl
@SuppressWarnings({"unchecked", "rawtypes"})
public class BaseSuperServiceImpl< K extends MyJpaRepository<T,ID>, T extends SuperBaseModel,ID extends Serializable> implements BaseSuperService<T,ID> {
protected Class<T> clazz;
protected String keyName; //主键属性名
protected Method getMethod; //得到主键对应的get方法
protected String sortName="createTime"; //默认字段排序 由于个别表key为UUID,不能按key排序
@Value("${isDebug}")
protected boolean isDebug;
@Autowired
protected K dao;
@Autowired
protected StringRedisTemplate redisTemplate;
@PersistenceContext
protected EntityManager em;// 类似hibernate session
public BaseSuperServiceImpl() {
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
clazz = (Class<T>) type.getActualTypeArguments()[1];
getMethod = HibernateUtil.getKeyMethod(clazz);
String idname =getMethod.getName().substring(3);
idname = idname.substring(0, 1).toLowerCase() + idname.substring(1);
keyName = idname; //得到主键id名
}
@Override
public List<T> findAll() {
return dao.findAll();
}
@Override
public List<T> findAll(Sort sort) {
return dao.findAll(sort);
}
@Override
public Page<T> findAll(Pageable pageable) {
return dao.findAll(pageable);
}
@Override
public List<T> findAll(Iterable<ID> integers) {
return dao.findAll(integers);
}
@Override
public long count() {
return dao.count();
}
@Override
public void delete(ID id) {
dao.delete(id);
}
@Override
public void delete(T entity) {
dao.delete(entity);
}
@Override
public void delete(Iterable<? extends T> entities) {
dao.delete(entities);
}
@Override
public void deleteAll() {
dao.deleteAll();
}
@Override
public <S extends T> S save(S entity) {
try {
SysUser curUser = WebUtil.getCurrentUser(isDebug);
ID id = (ID) getMethod.invoke(entity);
//如果新增,reateTime,createUserUUID没给值,统一赋值
if(id==null){
if(entity.getCreateTime()==null) entity.setCreateTime(DateUtil.getCurDate());
if(entity.getCreateUserUUID()==null) entity.setCreateUserUUID(curUser.getUserUUId());
}
return dao.save(entity);
} catch (Exception e) {
LogerHelper.error(e);
}
return null;
}
@Override
public <S extends T> List<S> save(Iterable<S> entities) {
return dao.save(entities);
}
@Override
public T findOne(ID id) {
return dao.findOne(id);
}
@Override
public boolean exists(ID id) {
return dao.exists(id);
}
@Override
public void flush() {
dao.flush();
}
@Override
public <S extends T> S saveAndFlush(S entity) {
return dao.saveAndFlush(entity);
}
@Override
public void deleteInBatch(Iterable<T> entities) {
dao.deleteInBatch(entities);
}
@Override
public void deleteAllInBatch() {
dao.deleteAllInBatch();
}
@Override
public T getOne(ID id) {
return dao.getOne(id);
}
@Override
public <S extends T> S findOne(Example<S> example) {
return dao.findOne(example);
}
@Override
public <S extends T> List<S> findAll(Example<S> example) {
return dao.findAll(example);
}
@Override
public <S extends T> List<S> findAll(Example<S> example, Sort sort) {
return dao.findAll(example,sort);
}
@Override
public <S extends T> Page<S> findAll(Example<S> example, Pageable pageable) {
return dao.findAll(example, pageable);
}
@Override
public <S extends T> long count(Example<S> example) {
return dao.count(example);
}
@Override
public <S extends T> boolean exists(Example<S> example) {
return dao.exists(example);
}
@Override
public PageResult<T> pagedList(T entity, Integer currentPage, Integer pageSize, Order... orders) {
Sort s = null;
if (orders != null && orders.length > 0) {
s = new Sort(orders);
} else {
s = new Sort(new Order(Direction.DESC, sortName));
}
PageRequest pr = new PageRequest(currentPage - 1, pageSize, s);
Page<T> p = this.findAll(pr);
Integer fromItem = PageUtil.getOffset(currentPage, pageSize);
return new PageResult<T>(currentPage, pageSize, p.getContent(), (int)p.getTotalElements(), p.getTotalPages(), fromItem, p.getContent().size());
}
@Override
public PageResult<T> pagedList(T entity, Integer currentPage, Order... orders) {
return this.pagedList(entity, currentPage,PageUtil.PAGE_SIZE,orders);
}
protected List<Map> exectSqlMap(Query query) {
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return query.getResultList();
}
protected Map exectSqlMap2(Query query) {
List<Map> list = exectSqlMap(query);
return ListUtil.notEmpty(list)?list.get(0):null;
}
protected PageResult<T> gerPageResult(Integer currentPage, Integer pageSize,
Specification<T> sf,Order... orders) {
//构建分页信息
Sort s = null;
if (orders != null && orders.length > 0) {
s = new Sort(orders);
} else {
s = new Sort(new Order(Direction.DESC, sortName));
}
PageRequest pr = new PageRequest(currentPage - 1, pageSize, s);
Page<T> p = sf==null?this.findAll(pr):this.findAll(sf,pr);
Integer fromItem = PageUtil.getOffset(currentPage, pageSize);
return new PageResult<T>(currentPage, pageSize, p.getContent(), (int)p.getTotalElements(), p.getTotalPages(), fromItem, p.getContent().size());
}
@Override
public T findOne(Specification<T> spec) {
return dao.findOne(spec);
}
@Override
public List<T> findAll(Specification<T> spec) {
return dao.findAll(spec);
}
@Override
public Page<T> findAll(Specification<T> spec, Pageable pageable) {
return dao.findAll(spec, pageable);
}
@Override
public List<T> findAll(Specification<T> spec, Sort sort) {
return dao.findAll(spec, sort);
}
@Override
public long count(Specification<T> spec) {
return dao.count(spec);
}
}
基本上,重写了所有的方法。
然后创建:BaseServiceImpl
public class BaseServiceImpl<K extends MyJpaRepository<T,ID>,T extends BaseModel,ID extends Serializable> extends BaseSuperServiceImpl<K,T,ID> implements BaseService<T,ID> {
@Override
public PageResult<T> pagedListForVaild(T entity, Integer currentPage, Integer pageSize, Order... orders) throws Exception {
Sort s = null;
if (orders != null && orders.length > 0) {
s = new Sort(orders);
} else {
s = new Sort(new Order(Direction.DESC, sortName));
}
PageRequest pr = new PageRequest(currentPage - 1, pageSize, s);
T model = clazz.newInstance();
model.setIsValid(EnumList.ValidEnum.Valid.getEnumItem().getItemKey());
Example<T> example = Example.of(model);
Page<T> p = dao.findAll(example, pr);
Integer fromItem = PageUtil.getOffset(currentPage, pageSize);
return new PageResult<T>(currentPage, pageSize, p.getContent(), (int)p.getTotalElements(), p.getTotalPages(), fromItem, p.getContent().size());
}
@Override
public <S extends T> S save(S entity) {
//如果isValid没给值,统一赋值
if(entity.getIsValid()==null) entity.setIsValid(EnumList.ValidEnum.Valid.getEnumItem().getItemKey());
return super.save(entity);
}
@Override
public PageResult<T> pagedListForVaild(T entity, Integer currentPage, Order... orders) throws Exception {
return this.pagedListForVaild(entity, currentPage,PageUtil.PAGE_SIZE,orders);
}
}
最后创建UserServiceImpl
@Service("userService")
public class SysUserServiceImpl extends BaseServiceImpl<SysUserDao,SysUser,String> implements SysUserService {
public SysUser getByUserUUId(String userUUId){
return dao.getByUserUUId(userUUId);
}
@Override
public SysUser getByAccountAndPlatformUUID(String account,String platformUUID) {
return dao.getByAccountAndPlatformUUID(account,platformUUID);
}
@Override
public SysUser getByAccount(String account) {
return dao.getByAccount(account);
}
@Override
public PageResult<SysUser> pagedList(SysUser entity, Integer currentPage, Integer pageSize, Order... orders) {
if(entity==null){
return super.pagedList(entity, currentPage, pageSize, orders);
}
//构建查询条件
Specification<SysUser> sf = new Specification<SysUser>(){
@Override
public Predicate toPredicate(Root<SysUser> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
String name = entity.getUserNameCn();
Integer isValid = entity.getIsValid();
List<Predicate> list = new ArrayList<Predicate>();
if (StringUtils.isNotBlank(name)) {
name = name.toLowerCase();
Predicate p1 = cb.like(cb.lower(root.get("userNameCn")), "%" + name + "%");
Predicate p2 = cb.like(cb.lower(root.get("userNameEn")), "%" + name + "%");
Predicate p3 = cb.like(cb.lower(root.get("account")), "%" + name+ "%");
list.add(cb.or(p1,p2,p3));
}
if(isValid!=null){
list.add(cb.equal(root.get("isValid"),isValid));
}
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
}
};
return super.gerPageResult(currentPage, pageSize,sf,orders);
}
}
这里,我额外演示一下重写了PagedList方法。
四,测试调用
@RunWith(value=SpringRunner.class)
@SpringBootTest(classes={WebAPISYSApp.class})
public class SysUserTest{
@Autowired
private SysUserService userService; @Test
public void findUser(){
SysUser user = userService.findOne("0c867aca-d1eb-11e8-9aa5-0022198292f8");
logger.info(user.getAccount()); } }
Java 仓储模式的更多相关文章
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 《JAVA与模式》之观察者模式
转自:http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...
- JAVA的模式对话框和非模式对话框
周末的时候,一位网友让我帮他把他的无模式对话框改成有模式对话框. 界面是由swing制作的,都是JFrame,我从来没有接触过swing编程.大致的代码还是看的懂,很多都和C#很相似. 然后就去查资料 ...
- java工厂模式
(1)概念大白话:java工厂模式就是客户端(main函数)要创建对象觉得麻烦就让另外一个叫工厂的类帮它创建,然后自己每次要创建对象就叫工厂帮它弄,举个例子,在没有工厂这个"手下" ...
- ASP.NET Mvc实用框架(一)Ioc、仓储模式和单元工作模式
Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下 ...
- 《JAVA与模式》之单例模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...
- MVC5+EF6 入门完整教程十一:细说MVC中仓储模式的应用
摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...
随机推荐
- 文本表征:SoW、BoW、TF-IDF、Hash Trick、doc2vec、DBoW、DM
原文地址:https://www.jianshu.com/p/2f2d5d5e03f8 一.文本特征 (一)基本文本特征提取 词语数量 常,负面情绪评论含有的词语数量比正面情绪评论更多. 字符数量 常 ...
- 注解@Override
Android的开发者对@Override肯定是非常熟悉,不管是自己的代码中还是书上都会出现,但是他是什么意思呢?如下: @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: ...
- mariadb入门
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方 ...
- 认识AppDomain类
原文:认识AppDomain类 表示应用程序域,它是一个应用程序在其中执行的独立环境. 创建新的 AppDomain,在该新建 AppDomain 中实例化类型,以及与该类型的对象通信. usingn ...
- LNMP之PHP
PHP LNMP环境下的PHP安装 CGI指的是通用网关接口,为HTTP服务器与其他机器上的程序服务通信交流的一种工具,性能差,所以被淘汰了. FastCGI,是一个可以伸缩.高速的在HTTP服务器和 ...
- SQLite 小调研
一. 概况: SQLite 是 D. Richard Hipp 于 2000 年采用 C 语言编写的一个轻量级.跨平台的关系型数据库,支持大部分 SQL92 标准(比如视图.事务.触发器.blob 数 ...
- java反射机制以及应用
JAVA反射机制+动态运行编译期不存在的JAVA程序 一.有关JAVA反射 在运行期间,在不知道某个类A的内部方法和属性时,能够动态的获取信息.获取类或对象的方法.属性的功能,称之为反射. 1.相关类 ...
- 判断访问浏览器客户端类型(pc,mac,ipad,iphone,android)
<script type="text/javascript"> //平台.设备和操作系统 var system = { win: false, mac: false, ...
- 微信小程序布局篇
刚刚接触小程序,小程序与HTML5有一定的差别,小程序就几个标签,而HTML5一大堆标签,还不断更新,但是新增标签功能强大.做一下微信小程序的布局练练手.感觉还是挺不错的,也封装了很多东西功能出来,与 ...
- NX二次开发-UFUN选择草图对话框UF_UI_select_sketch
#include <uf.h> #include <uf_ui.h> UF_initialize(); //选择草图对话框 char sMessage[] = "选择 ...