11. DAO使用进阶


1. 不是基于SQLMap的DAO实现


1.1 Hibernate版本的DAO实现


1. 定义DAO上下文


Dao.xml中定义使用Hibernate的DAO上下文:

<context id="hibernate">
	<transactionManager type="HIBERNATE">
		<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
		<property name="hibernate.connection.url" value="jdbc:postgresql:ibatisdemo" />
		<property name="hibernate.connection.username" value="ibatis" />
		<property name="hibernate.connection.password" value="ibatis" />
		<property name="hibernate.connection.pool_size" value="5" />
		<property name="hibernate.dialect" value="net.sf.hibernate.dialect.PostgreSQLDialect" />
		<property name="map.Account" value="${DaoHomeRes}/hibernate/Account.hbm.xml" />
	</transactionManager>
	<dao interface="${DaoHome}.AccountDao" implementation="${DaoHome}.hibernate.AccountDaoImpl" />
</context>

2. 映射Account表


hibernate映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
	<class name="org.apache.mapper2.examples.bean.Account" table="Account">
		<id name="accountId" type="int" column="accountid">
			<generator class="sequence">
				<param name="sequence">account_accountid_seq</param>
			</generator>
		</id>
		<property name="username" />
		<property name="password" />
		<property name="firstName" />
		<property name="lastName" />
		<property name="address1" />
		<property name="address2" />
		<property name="city" />
		<property name="state" />
		<property name="postalCode" />
		<property name="country" />
	</class>
</hibernate-mapping>


3. 实际的DAO实现


<pre name="code" class="java">public class AccountDaoImpl extends HibernateDaoTemplate implements AccountDao {
	private static final Log log = LogFactory.getLog(AccountDaoImpl.class);

	public AccountDaoImpl(DaoManager daoManager) {
		super(daoManager);
		if (log.isDebugEnabled()) {
			log.debug("Creating instance of " + getClass());
		}
	}

	public Integer insert(Account account) {
		try {
			getSession().save(account);
		} catch (HibernateException e) {
			log.error(e);
			throw new DaoException(e);
		}
		return account.getAccountId();
	}

	public int update(Account account) {
		try {
			getSession().save(account);
		} catch (HibernateException e) {
			log.error(e);
			throw new DaoException(e);
		}
		return 1;
	}

	public int delete(Account account) {
		try {
			getSession().delete(account);
		} catch (HibernateException e) {
			log.error(e);
			throw new DaoException(e);
		}
		return 1;
	}

	public int delete(Integer accountId) {
		Account account = new Account();
		account.setAccountId(accountId);
		return delete(account);
	}

public List<Account> getAccountListByExample(
Account acct) {
List accountList;
Session session = this.getSession();
Criteria criteria =
session.createCriteria(Account.class);
if (!nullOrEmpty(acct.getCity())) {
criteria.add(
Expression.like("city", acct.getCity())
);
}
If (!nullOrEmpty(acct.getAccountId())) {
criteria.add(
Expression.eq("accountId", acct.getAccountId())
);
}
try {
accountList = criteria.list();
} catch (HibernateException e) {
log.error(
"Exception getting list: " +
		e.getLocalizedMessage(), e);
		throw new DaoException(e);
		}
		return (List<Account>)accountList;
		}

	public List<Map<String, Object>> getMapListByExample(Account account) {
		List<Account> accountList = getAccountListByExample(account);
		List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
		for (Account acctToAdd : accountList) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("accountId", acctToAdd.getAccountId());
			map.put("address1", acctToAdd.getAddress1());
			map.put("address2", acctToAdd.getAddress2());
			map.put("city", acctToAdd.getCity());
			map.put("country", acctToAdd.getCountry());
			map.put("firstName", acctToAdd.getFirstName());
			map.put("lastName", acctToAdd.getLastName());
			map.put("password", acctToAdd.getPassword());
			map.put("postalCode", acctToAdd.getPostalCode());
			map.put("state", acctToAdd.getState());
			map.put("username", acctToAdd.getUsername());
			mapList.add(map);
		}
		return mapList;
	}

	public List<IdDescription> getIdDescriptionListByExample(Account exAcct) {
		List<Account> acctList = getAccountListByExample(exAcct);
		List<IdDescription> idDescriptionList = new ArrayList<IdDescription>();
		for (Account acct : acctList) {
			idDescriptionList
					.add(new IdDescription(acct.getAccountId(), acct.getFirstName() + " " + acct.getLastName()));
		}
		return idDescriptionList;
	}

	public Account getById(Integer accountId) {
		Session session = this.getSession();
		try {
			return (Account) session.get(Account.class, accountId);
		} catch (HibernateException e) {
			log.error(e);
			throw new DaoException(e);
		}
	}

	public Account getById(Account account) {
		return getById(account.getAccountId());
	}
}




1.2 JDBC版本的DAO实现


dao.xml配置文件

<context id="jdbc">
	<transactionManager type="JDBC">
		<property name="DataSource" value="SIMPLE" />
		<property name="JDBC.Driver" value="org.postgresql.Driver" />
		<property name="JDBC.ConnectionURL" value="jdbc:postgresql:ibatisdemo" />
		<property name="JDBC.Username" value="ibatis" />
		<property name="JDBC.Password" value="ibatis" />
		<property name="JDBC.DefaultAutoCommit" value="true" />
	</transactionManager>
	<dao interface="${DaoHome}.AccountDao" implementation="${DaoHome}.jdbc.AccountDaoImpl" />
</context>


2. 为其他数据源使用DAO模式


2.1  示例:为LDAP使用DAO


2.2 示例:为Web服务使用DAO


3. 使用Spring DAO


3.1  编写代码


Spring框架通过一个针对数据访问对象的模板模式来支持ibatis,即, DAO实现可以从扩展Spring框架中一个现成的SqlMapClientTemplate开始


SQLMap的Account DAO的Spring版本:

public class AccountDaoImplSpring extends SqlMapClientTemplate implements AccountDao {
	public Integer insert(Account account) {
		return (Integer) insert("Account.insert", account);
	}

	public int update(Account account) {
		return update("Account.update", account);
	}

	public int delete(Account account) {
		return delete(account.getAccountId());
	}

	public int delete(Integer accountId) {
		return delete("Account.delete", accountId);
	}

	public List<Account> getAccountListByExample(Account account) {
		return queryForList("Account.getAccountListByExample", account);
	}

	public List<Map<String, Object>> getMapListByExample(Account account) {
		return queryForList("Account.getMapListByExample", account);
	}

	public List<IdDescription> getIdDescriptionListByExample(Account account) {
		return queryForList("Account.getIdDescriptionListByExample", account);
	}

	public Account getById(Integer accountId) {
		return (Account) queryForObject("Account.getById", accountId);
	}

	public Account getById(Account account) {
		return (Account) queryForList("Account.getById", account);
	}
}



























内容概要:文章以“智能网页数据标注工具”为例,深入探讨了谷歌浏览器扩展在毕业设计中的实战应用。通过开发具备实体识别、情感分类等功能的浏览器扩展,学生能够融合前端开发、自然语言处理(NLP)、本地存储与模型推理等技术,实现高效的网页数据标注系统。文中详细解析了扩展的技术架构,涵盖Manifest V3配置、内容脚本与Service Worker协作、TensorFlow.js模型在浏览器端的轻量化部署与推理流程,并提供了核心代码实现,包括文本选择、标注工具栏动态生成、高亮显示及模型预测功能。同时展望了多模态标注、主动学习与边缘计算协同等未来发展方向。; 适合人群:具备前端开发基础、熟悉JavaScript和浏览器机制,有一定AI模型应用经验的计算机相关专业本科生或研究生,尤其适合将浏览器扩展与人工智能结合进行毕业设计的学生。; 使用场景及目标:①掌握浏览器扩展开发全流程,理解内容脚本、Service Worker与弹出页的通信机制;②实现在浏览器端运行轻量级AI模型(如NER、情感分析)的技术方案;③构建可用于真实场景的数据标注工具,提升标注效率并探索主动学习、协同标注等智能化功能。; 阅读建议:建议结合代码实例搭建开发环境,逐步实现标注功能并集成本地模型推理。重点关注模型轻量化、内存管理与DOM操作的稳定性,在实践中理解浏览器扩展的安全机制与性能优化策略。
基于Gin+GORM+Casbin+Vue.js的权限管理系统是一个采用前后端分离架构的企业级权限管理解决方案,专为软件工程和计算机科学专业的毕业设计项目开发。该系统基于Go语言构建后端服务,结合Vue.js前端框架,实现了完整的权限控制和管理功能,适用于各类需要精细化权限管理的应用场景。 系统后端采用Gin作为Web框架,提供高性能的HTTP服务;使用GORM作为ORM框架,简化数据库操作;集成Casbin实现灵活的权限控制模型。前端基于vue-element-admin模板开发,提供现代化的用户界面和交互体验。系统采用分层架构和模块化设计,确保代码的可维护性和可扩展性。 主要功能包括用户管理、角色管理、权限管理、菜单管理、操作日志等核心模块。用户管理模块支持用户信息的增删改查和状态管理;角色管理模块允许定义不同角色并分配相应权限;权限管理模块基于Casbin实现细粒度的访问控制;菜单管理模块动态生成前端导航菜单;操作日志模块记录系统关键操作,便于审计和追踪。 技术栈方面,后端使用Go语言开发,结合Gin、GORM、Casbin等成熟框架;前端使用Vue.js、Element UI等现代前端技术;数据库支持MySQL、PostgreSQL等主流关系型数据库;采用RESTful API设计规范,确保前后端通信的标准化。系统还应用了单例模式、工厂模式、依赖注入等设计模式,提升代码质量和可测试性。 该权限管理系统适用于企业管理系统、内部办公平台、多租户SaaS应用等需要复杂权限控制的场景。作为毕业设计项目,它提供了完整的源码和论文文档,帮助学生深入理解前后端分离架构、权限控制原理、现代Web开发技术等关键知识点。系统设计规范,代码结构清晰,注释完整,非常适合作为计算机相关专业的毕业设计参考或实际项目开发的基础框架。 资源包含完整的系统源码、数据库设计文档、部署说明和毕
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值