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);
	}
}



























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值