1、泛型DAO接口定义
- import java.io.Serializable;
- import java.util.List;
- /**
- * GenericDao DAO层泛型接口,定义基本的DAO功能
- * @author wl
- * @since 0.1
- * @param <T> 实体类
- * @param <PK> 主键类,必须实现Serializable接口
- *
- * @see com.thinkon.commons.dao.GenericIbatisDao
- */
- public abstract interface GenericDao<T, PK extends Serializable> {
- /**
- * 插入一个实体(在数据库INSERT一条记录)
- * @param entity 实体对象
- */
- public abstract void insert(T entity);
- /**
- * 修改一个实体对象(UPDATE一条记录)
- * @param entity 实体对象
- * @return 修改的对象个数,正常情况=1
- */
- public abstract int update(T entity);
- /**
- * 修改符合条件的记录
- * <p>此方法特别适合于一次性把多条记录的某些字段值设置为新值(定值)的情况,比如修改符合条件的记录的状态字段</p>
- * <p>此方法的另一个用途是把一条记录的个别字段的值修改为新值(定值),此时要把条件设置为该记录的主键</p>
- * @param param 用于产生SQL的参数值,包括WHERE条件、目标字段和新值等
- * @return 修改的记录个数,用于判断修改是否成功
- */
- public abstract int update(DynamicSqlParameter param);
- /**
- * 按主键删除记录
- * @param primaryKey 主键对象
- * @return 删除的对象个数,正常情况=1
- */
- public abstract int delete(PK primaryKey);
- /**
- * 删除符合条件的记录
- * <p><strong>此方法一定要慎用,如果条件设置不当,可能会删除有用的记录!</strong></p>
- * @param param 用于产生SQL的参数值,包括WHERE条件(其他参数内容不起作用)
- * @return
- */
- public abstract int delete(DynamicSqlParameter param);
- /**
- * 清空表,比delete具有更高的效率,而且是从数据库中物理删除(delete是逻辑删除,被删除的记录依然占有空间)
- * <p><strong>此方法一定要慎用!</strong></p>
- * @return
- */
- public abstract int truncate();
- /**
- * 查询整表总记录数
- * @return 整表总记录数
- */
- public abstract int count();
- /**
- * 查询符合条件的记录数
- * @param param 查询条件参数,包括WHERE条件(其他参数内容不起作用)。此参数设置为null,则相当于count()
- * @return
- */
- public abstract int count(DynamicSqlParameter param);
- /**
- * 按主键取记录
- * @param primaryKey 主键值
- * @return 记录实体对象,如果没有符合主键条件的记录,则返回null
- */
- public abstract T get(PK primaryKey);
- /**
- * 按主键取记录
- * @param primaryKey 主键值
- * @return 记录实体对象,如果没有符合主键条件的记录,则 throw DataAccessException
- */
- public abstract T load(PK primaryKey) throws DataAccessException;
- /**
- * 取全部记录
- * @return 全部记录实体对象的List
- */
- public abstract List<T> select();
- /**
- * 按条件查询记录
- * @param param 查询条件参数,包括WHERE条件、分页条件、排序条件
- * @return 符合条件记录的实体对象的List
- */
- public abstract List<T> select(DynamicSqlParameter param);
- /**
- * 按条件查询记录,并处理成分页结果
- * @param param 查询条件参数,包括WHERE条件、分页条件、排序条件
- * @return PaginationResult对象,包括(符合条件的)总记录数、页实体对象List等
- */
- public abstract PaginationResult<T> selectPagination(DynamicSqlParameter param);
- /**
- * 按条件查询记录,并把有外键关联的字段的关联对象也处理出来
- * <p>此方法是为了避免1+N而设置的</p>
- * @param param 查询条件参数,包括WHERE条件、分页条件、排序条件<strong>(不包括外键关联表条件)</strong>
- * @return 符合条件记录的实体对象的List
- */
- public abstract List<T> selectFk(DynamicSqlParameter param);
- /**
- * 按条件查询记录,并把有外键关联的字段的关联对象也处理出来,并处理成分页结果
- * <p>此方法是为了避免1+N而设置的</p>
- * @param param 查询条件参数,包括WHERE条件、分页条件、排序条件<strong>(不包括外键关联表条件)</strong>
- * @return PaginationResult对象,包括(符合条件的)总记录数、页实体对象List等
- */
- public abstract PaginationResult<T> selectFkPagination(DynamicSqlParameter param);
- /**
- * 批量插入
- * @param list
- */
- public abstract void batchInsert(final List<T> list);
- /**
- * 批量修改
- * @param list
- */
- public abstract void batchUpdate(final List<T> list);
- /**
- * 批量删除
- * @param list
- */
- public abstract void batchDelete(final List<PK> list);
- }
2、泛型接口的实现类(其他DAO的基类),以iBatis实现:
- import java.io.Serializable;
- import java.sql.SQLException;
- import java.util.List;
- import org.springframework.orm.ibatis.SqlMapClientCallback;
- import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
- import com.ibatis.sqlmap.client.SqlMapExecutor;
- /**
- * iBatis DAO层泛型基类,实现了基本的DAO功能 利用了Spring的DaoSupport功能
- *
- * @author wl
- * @since 0.1
- * @param <T>
- * 实体类
- * @param <PK>
- * 主键类,必须实现Serializable接口
- *
- * @see com.thinkon.commons.dao.GenericDao
- * @see org.springframework.orm.ibatis.support.SqlMapClientDaoSupport
- */
- public abstract class GenericIbatisDao<T, PK extends Serializable> extends
- SqlMapClientDaoSupport implements GenericDao<T, PK> {
- // sqlmap.xml定义文件中对应的sqlid
- public static final String SQLID_INSERT = "insert";
- public static final String SQLID_UPDATE = "update";
- public static final String SQLID_UPDATE_PARAM = "updateParam";
- public static final String SQLID_DELETE = "delete";
- public static final String SQLID_DELETE_PARAM = "deleteParam";
- public static final String SQLID_TRUNCATE = "truncate";
- public static final String SQLID_SELECT = "select";
- public static final String SQLID_SELECT_PK = "selectPk";
- public static final String SQLID_SELECT_PARAM = "selectParam";
- public static final String SQLID_SELECT_FK = "selectFk";
- public static final String SQLID_COUNT = "count";
- public static final String SQLID_COUNT_PARAM = "countParam";
- private String sqlmapNamespace = "";
- /**
- * sqlmapNamespace,对应sqlmap.xml中的命名空间
- *
- * @return
- */
- public String getSqlmapNamespace() {
- return sqlmapNamespace;
- }
- /**
- * sqlmapNamespace的设置方法,可以用于spring注入
- *
- * @param sqlmapNamespace
- */
- public void setSqlmapNamespace(String sqlmapNamespace) {
- this.sqlmapNamespace = sqlmapNamespace;
- }
- /**
- * 数据库方言,缺省为MYSQL
- */
- private String dbDialect = "MYSQL";
- /**
- * 数据库方言dbDialect的get方法
- *
- * @return
- */
- public String getDbDialect() {
- return dbDialect;
- }
- /**
- * 数据库方言dbDialect的set方法
- *
- * @return
- */
- public void setDbDialect(String dbDialect) {
- if (dbDialect == null
- || (!dbDialect.equals("MYSQL") && !dbDialect.equals("ORACLE")))
- throw new DaoException("错误的数据库方言设置:本系统只支持MYSQL和ORACLE");
- this.dbDialect = dbDialect;
- }
- public int count() {
- Integer count = (Integer) getSqlMapClientTemplate().queryForObject(
- sqlmapNamespace + "." + SQLID_COUNT);
- return count.intValue();
- }
- public int count(DynamicSqlParameter param) {
- Integer count = (Integer) getSqlMapClientTemplate().queryForObject(
- sqlmapNamespace + "." + SQLID_COUNT_PARAM, param);
- return count.intValue();
- }
- public int delete(PK primaryKey) {
- int rows = getSqlMapClientTemplate().delete(
- sqlmapNamespace + "." + SQLID_DELETE, primaryKey);
- try {
- getSqlMapClientTemplate().getSqlMapClient().startBatch();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return rows;
- }
- public int delete(DynamicSqlParameter param) {
- int rows = getSqlMapClientTemplate().delete(
- sqlmapNamespace + "." + SQLID_DELETE_PARAM, param);
- return rows;
- }
- public int truncate() {
- int rows = getSqlMapClientTemplate().delete(
- sqlmapNamespace + "." + SQLID_TRUNCATE);
- return rows;
- }
- public T get(PK primaryKey) {
- return (T) getSqlMapClientTemplate().queryForObject(
- sqlmapNamespace + "." + SQLID_SELECT_PK, primaryKey);
- }
- public void insert(T entity) {
- getSqlMapClientTemplate().insert(sqlmapNamespace + "." + SQLID_INSERT,
- entity);
- }
- public T load(PK primaryKey) throws DaoException {
- Object o = getSqlMapClientTemplate().queryForObject(
- sqlmapNamespace + "." + SQLID_SELECT_PK, primaryKey);
- if (o == null)
- throw new DataAccessException("数据查询异常:无法查询出主键数据");
- return (T) o;
- }
- public List<T> select() {
- return getSqlMapClientTemplate().queryForList(
- sqlmapNamespace + "." + SQLID_SELECT);
- }
- public List<T> select(DynamicSqlParameter param) {
- return getSqlMapClientTemplate().queryForList(
- sqlmapNamespace + "." + SQLID_SELECT_PARAM, param);
- }
- public PaginationResult<T> selectPagination(DynamicSqlParameter param) {
- if (param != null)
- param.setDbDialect(this.dbDialect);
- PaginationResult<T> result = new PaginationResult<T>();
- int count = count(param);
- result.setTotalSize(count);
- if (count > 0) {
- List<T> data = getSqlMapClientTemplate().queryForList(
- sqlmapNamespace + "." + SQLID_SELECT_PARAM, param);
- result.setData(data);
- }
- return result;
- }
- public List<T> selectFk(DynamicSqlParameter param) {
- return getSqlMapClientTemplate().queryForList(
- sqlmapNamespace + "." + SQLID_SELECT_FK, param);
- }
- public PaginationResult<T> selectFkPagination(DynamicSqlParameter param) {
- if (param != null)
- param.setDbDialect(this.dbDialect);
- PaginationResult<T> result = new PaginationResult<T>();
- int count = count(param);
- result.setTotalSize(count);
- if (count > 0) {
- List<T> data = getSqlMapClientTemplate().queryForList(
- sqlmapNamespace + "." + SQLID_SELECT_FK, param);
- result.setData(data);
- }
- return result;
- }
- public int update(T entity) {
- return getSqlMapClientTemplate().update(
- sqlmapNamespace + "." + SQLID_UPDATE, entity);
- }
- public int update(DynamicSqlParameter param) {
- if (param == null || param.getUpdateValueList() == null)
- throw new ParameterException(
- "参数设置错误:使用带参数的update必须设定update的column!");
- return getSqlMapClientTemplate().update(
- sqlmapNamespace + "." + SQLID_UPDATE_PARAM, param);
- }
- public void batchInsert(final List<T> list){
- SqlMapClientCallback callback = new SqlMapClientCallback() {
- public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
- executor.startBatch();
- for (T member : list) {
- executor.insert(sqlmapNamespace + "." + SQLID_INSERT, member);
- }
- executor.executeBatch();
- return null;
- }
- };
- this.getSqlMapClientTemplate().execute(callback);
- }
- public void batchUpdate(final List<T> list){
- SqlMapClientCallback callback = new SqlMapClientCallback() {
- public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
- executor.startBatch();
- for (T member : list) {
- executor.update(sqlmapNamespace + "." + SQLID_UPDATE, member);
- }
- executor.executeBatch();
- return null;
- }
- };
- this.getSqlMapClientTemplate().execute(callback);
- }
- public void batchDelete(final List<PK> list){
- SqlMapClientCallback callback = new SqlMapClientCallback() {
- public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
- executor.startBatch();
- for (PK member : list) {
- executor.delete(sqlmapNamespace + "." + SQLID_DELETE, member);
- }
- executor.executeBatch();
- return null;
- }
- };
- this.getSqlMapClientTemplate().execute(callback);
- }
- }
3、某实体的DAO接口:
- public interface UserDao extends GenericDao<User,Integer> {
- //通用方法从GenericDao继承
- //这里可以定义针对此类的特定方法
- }
4、某实体的DAO实现:
- public class UserDaoImpl extends GenericIbatisDao<User,Integer> implements UserDao {
- }
相关推荐
问题描述: 停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入; 当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 1.基本要求 (1)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 (2)每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。 (3)栈以顺序结构实现,队列以链表实现。 2.重点难点 重点:针对停车场问题的特点,利
精选毕设项目-人民好公仆小程序(生活+便民+政务)
精选毕设项目-相册;处理用户信息
精选毕设项目-喵喵小说
精选毕设项目-图片预览带后端
精选项目-爱靓女带后台
在科技与司法的交响曲中,智慧法院应运而生,成为新时代司法服务的新篇章。它不仅仅是一个概念,更是对法院传统工作模式的一次深刻变革。智慧法院通过移动信息化技术,为法院系统注入了强大的生命力,有效缓解了案多人少的矛盾,让司法服务更加高效、便捷。 立案、调解、审判,每一个阶段都融入了科技的智慧。在立案阶段,智慧法院利用区块链技术实现可信存证,确保了电子合同的合法性和安全性,让交易双方的身份真实性、交易安全性得到了有力见证。这不仅极大地缩短了立案时间,还为后续审判工作奠定了坚实的基础。在调解阶段,多元调解服务平台借助人工智能、自然语言处理等前沿技术,实现了矛盾纠纷的快速化解。无论是矛盾类型的多元化,还是化解主体的多元化,智慧法院都能提供一站式、全方位的服务,让纠纷解决更加高效、和谐。而在审判阶段,智能立案、智能送达、智能庭审、智能判决等一系列智能化手段的应用,更是让审判活动变得更加智能化、集约化。这不仅提高了审判效率,还确保了审判质量的稳步提升。 更为引人注目的是,智慧法院还构建了一套完善的执行体系。移动执行指挥云平台的建设,让执行工作变得更加精准、高效。执行指挥中心和信息管理中心的一体化应用,实现了信息的实时传输和交换,为执行工作提供了强有力的支撑。而执行指挥车的配备,更是让执行现场通讯信号得到了有力保障,应急通讯能力得到了显著提升。这一系列创新举措的实施,不仅让执行难问题得到了有效解决,还为构建诚信社会、保障金融法治化营商环境提供了有力支撑。智慧法院的出现,让司法服务更加贴近民心,让公平正义的阳光更加温暖人心。
西门子1200与3台台达DTK温控器通讯程序 功能:实现西门子1200 PLC对3台台达DTK温控器进行485通讯控制,在触摸屏上设定温度,读取温度 器件:西门子1200 1214DC DC DC.昆仑通态TPC7062Ti ,西门子KTP700 Basic PN,台达DTK 4848V12温控器。 说明:的是程序,带详细注释程序,西门子触摸屏程序,PLC设置和温控器设置,接线说明书。 #SIEMENS 西门子
机械设计电阻绕线焊线一体机sw18全套技术资料100%好用.zip
VB6编写的上位机源码,可实时显示曲线图,带有数据库,可以进行历史数据的保存 及 查看历史采集数据。
精选毕设项目-新浪读书
jQuery+Slick插件实现游戏人物轮播展示切换特效源码是一款通过背景图片的切换来显示不同的人物效果,轮播效果通过slick幻灯片插件来制作。效果非常棒,有需要的朋友可以直接下载使用,适应各大网站
精选毕设项目-地图查找附件
(蛐蛐voc数据)农作物病虫害识别目标检测数据集,VOC格式,蛐蛐数据集,纯手动标注,用来进行目标检测代码训练的数据。
MATLAB Simulink仿真模型 双馈风机并网频率控制仿真模型,利用下垂控制与惯性控制结合的综合惯性控制,实现电力系统的频率稳定,两台同步发电机组,具体参数可自行调节,频率波形比较可利用matlab工作区画出。
一、结题报告的类型及主要结构 结题报告是一种专门用于科研课题结题验收的实用性报告类文体,也叫研究报告。它是研究者在课题研究结束后对科研课题研究过程和研究成果进行客观、全面、实事求是的描述,是课题研究所有材料中最主要的材料,也是科研课题结题验收的主要依据。 一篇规范、合格的结题报告,需要回答好3个问题:一是“为什么要选择这项课题进行研究?”二是“这项课题是怎样进行研究的?”三是“课题研究取得哪些研究成果?” 基本结构大致包括以下部分: 第一个问题 “为什么要选择这项课题进行研究?” 1.课题提出的背景;2.课题研究的意义(包括理论意义和现实意义,这个部分也可以合并归入“课题提出的背景”部分);第二个问题“这项课题是怎样进行研究的?”3.文献综述;4.课题研究的理论依据;5.课题研究的目标;6.课题研究的主要内容;7.课题研究的对象;8.课题研究的方法;9. 课题研究的主要过程(研究的步骤); 除了第9部分外,从第1到第8部分在填报课题立项申报表、在制定课题研究方案、在开题报告中,都有要求,内容基本相同。到了撰写结题报告时,只须稍作适当修改就可以了。而第9部分,则需要通过对
内容概要:本文档重点讲述了网络安全应急响应的各项准备工作,涵盖了‘1+X’网络安全应急响应的职业技能等级证书概述、应急响应的基础知识、应急响应组织的建立、风险评估与改进、应急响应预案的制定以及详细的应急响应计划处置样例。文中详细介绍了各级职业技能的要求和任务,尤其关注如何未雨绸缪,制定完善的应急预案以应对潜在的网络安全风险;同时也探讨了如何在网络安全事件发生时,采取及时有效的应急处置措施。 适合人群:从事或有兴趣进入网络安全领域的从业人员,尤其是准备考取‘1+X’网络安全应急响应职业技能等级证书的相关人员。 使用场景及目标:帮助读者了解网络安全应急响应的基本概念及其在整个国家安全框架中的重要地位;指导读者学会如何建立健全高效的应急响应组织结构,如何进行全面的风险评估以及如何编制切实可行的应急预案;通过实例剖析,增强读者应对突发网络安全事件的能力。文档的目标在于提升读者在不同层面的专业技能,包括但不限于系统备份、日志分析、安全漏洞修复等方面的能力。 阅读建议:此文档结构清晰,内容详尽,非常适合有一定基础的技术从业者参考学习。建议读者逐章节深入了解,特别是关注自身岗位对应的技能细分类别。此外,结合实例深入理解和练习如何进行应急处置是非常有价值的,有助于提升自身的实战能力。
电动汽车动力系统匹配计算模型:输入整车参数及性能要求,一键生成驱动系统的扭矩功率峰值转速等参数。 2、整车动力经济性计算模型:包含NEDC WLTC CLTC工况,输入整车参数可生成工况电耗、百公里电耗、匀速工况续航、百公里电耗等信息。 实际项目中使用的计算仿真模型. 两个模型打包
chromedriver-linux64_122.0.6254.0
SRS构型七自由度冗余机械臂运动学建模全套matlab代码 代码主要功能: [1]. 基于臂角参数化方法求解机械臂在给定末端位姿和臂角下的关节角度; [2]. 求解机械臂在给定末端位姿下的有效臂角范围,有效即在该区间内机械臂关节角度不会超出关节限位; [3]. 以避关节限位为目标在有效臂角区间内进行最优臂角的选取,进而获取机械臂在给定末端位姿下的最优关节角度。 购前须知: 1. 代码均为个人手写,主要包含运动学建模全套代码; 2. 代码已经包含必要的注释; 包含原理推导文档,不包含绘图脚本以及urdf;