当前位置: 首页 > news >正文

paoding-rose 框架BaseDAO

版本:

<dependency>
    <groupId>net.paoding</groupId>
    <artifactId>paoding-rose-jade</artifactId>
    <version>2.0.u01</version>
</dependency>
<dependency>
    <groupId>net.paoding</groupId>
    <artifactId>paoding-rose-web</artifactId>
    <version>2.0.u01</version>
</dependency>


用的paoding-rose 久了,感觉DAO层书写还是挺方便的.

但是在其他非rose项目中各种baseDAO 用起来挺舒服的。

每每想到rose中update语句,因为修改字段或条件不同就要创建一个方法,就感觉疲惫...

下面是我写的通用DAO,希望对用rose的人提供方便,大家如果有好的建议也可以分享下..


其中:

$table:为子类中的表名

$field:为子类中的查询字段


在baseDAO 中没有save 需要自己在子类中自己实现


baseDAO<T>:

import java.util.List;
import java.util.Map;

import net.paoding.rose.jade.annotation.SQL;
import net.paoding.rose.jade.annotation.SQLParam;

/**
 * 公共dao
 * @author Administrator
 *
 *	实现一些共有方法
 */
public interface CommonDAO<T> {

	@SQL("select $field from $table where id=:id")
	T byId(@SQLParam("id")long id);
	
	/**
	 * 修改 
	 * 为了形成sql 方便 sql语句的实现都加了  update table set id=id...  ,"id=id"表明每个表都要有id字段。
	 * @param modField  需要修改的字段 key为字段名,value为要改变的值 字段不能为null
	 * @param condField 条件字段 key为字段名,value为要改变的值,该字段不能为null
	 * @param cIsEmpty  默认写:false  为了防止condField为空 造成修改全表。在condField为true时可以修改全表
	 * @return
	 */
	@SQL("update $table set id=id "
			+ "#for(key in :m.keySet()){ ,##(:key) = #(:m[:key]) }"
			+ "#if(:c==null || :c.keySet().size()==0){"
			+ " #if(:cIsEmpty){}#else{ where 1=2}"
			+ "}#else{"
			+ "	where 1=1  #for(key in :c.keySet()){ and ##(:key) = #(:c[:key]) }"
			+ "}"
			)
	int update(@SQLParam("m")Map<String, Object> modField,
	@SQLParam("c")Map<String, Object> condField,@SQLParam("cIsEmpty")boolean cIsEmpty);
	
	
	
	
	/**
	 * 分页
	 * 
	 * @param condField 条件字段
	 * @param start  开始数
	 * @param size   每页个数
	 * @param orderField  排序的字段 
	 * @param direction  正序(asc),倒序(desc)
	 * @return
	 */
	@SQL("select $field from $table "
			+ "#if(:c!=null || :c.keySet().size()>0){"
			+ "	where 1=1  #for(key in :c.keySet()){ and ##(:key) = #(:c[:key]) }"
			+ "}"
			+ " order by ##(:orderField) ##(:direction)"
			+ " limit :start,:size ")
	List<T> FindPage(@SQLParam("c")Map<String, Object> condField,@SQLParam("start")long start
			,@SQLParam("size")int size,@SQLParam("orderField")String orderField,
			@SQLParam("direction")String direction);
	
	/**
	 * 条件查询 总数量
	 * @return
	 */
	@SQL("select count(*) from $table "
			+ "#if(:c!=null || :c.keySet().size()>0){"
			+ "	where 1=1  #for(key in :c.keySet()){ and ##(:key) = #(:c[:key]) }"
			+ "}")
	int FindCount(@SQLParam("c")Map<String, Object> condField);
	
	
	/**
	 * 根据条件查找一个
	 * @param condField
	 * @return    条件为空 返回空
	 */
	@SQL("select $field from $table "
			+ "#if(:c!=null || :c.keySet().size()>0){"
			+ "	where 1=1  #for(key in :c.keySet()){ and ##(:key) = #(:c[:key]) }"
			+ "}#else{ where 1=2}")
	T findOne(@SQLParam("c")Map<String, Object> condField);
	
	/**
	 * 根据条件查找
	 * @param condField
	 * @return   条件为空 返回空
	 */
	@SQL("select $field from $table "
			+ "#if(:c!=null || :c.keySet().size()>0){"
			+ "	where 1=1  #for(key in :c.keySet()){ and ##(:key) = #(:c[:key]) }"
			+ "}#else{ where 1=2}")
	List<T> find(@SQLParam("c")Map<String, Object> condField);
	
}


子类:


@DAO
public interface ProductDAO extends CommonDAO<Product> {

	
	String table="t_product";
	
	String field="id,name";
	
	@SQL("insert into $table(name)"
			+ " values(:p.name)")
	int save(@SQLParam("p")Product p);
	
	
}


调用:

@Service
public class ProductService {

	@Autowired
	ProductDAO productDAO;
	
	
	public Product detail(int id){
		return productDAO.byId(id);
	}
	
	
}


相关文章:

  • jetty应用服务初步使用
  • centos7 Minimal +VM VirtualBox 网络链接
  • Docker fastdfs 【单机】
  • windows下java工程运行(非jar)
  • win 快速安装mysql5.7
  • jpa @query 动态表名
  • springboot 长连接 keepalive 记录
  • ping 命令打印日志
  • .bat批处理出现中文乱码的情况
  • dos命令把ping内容保存在文本中
  • 解决git:'instaweb' 不是一个 git 命令。参见 'git --help'。问题
  • yii gridview 根据字段值不同 显示不同样式及文字
  • python is 和 “==”的区别
  • mysql无符号和有符号的区别
  • mysql 偏移量 OFFSET和 limit的区分
  • 《深入 React 技术栈》
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • hadoop集群管理系统搭建规划说明
  • HTML中设置input等文本框为不可操作
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • javascript面向对象之创建对象
  • Markdown 语法简单说明
  • MySQL QA
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • spring学习第二天
  • Travix是如何部署应用程序到Kubernetes上的
  • vagrant 添加本地 box 安装 laravel homestead
  • 成为一名优秀的Developer的书单
  • 对象管理器(defineProperty)学习笔记
  • 关于extract.autodesk.io的一些说明
  • 机器学习中为什么要做归一化normalization
  • 基于web的全景—— Pannellum小试
  • 看域名解析域名安全对SEO的影响
  • 三分钟教你同步 Visual Studio Code 设置
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 在Docker Swarm上部署Apache Storm:第1部分
  • mysql面试题分组并合并列
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​520就是要宠粉,你的心头书我买单
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Linux(make工具和makefile文件以及makefile语法)
  • #Spring-boot高级
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (2)STM32单片机上位机
  • (7)STL算法之交换赋值
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (转)http-server应用
  • (转)http协议
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • . NET自动找可写目录
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 中什么样的类是可使用 await 异步等待的?