`
阿尔萨斯
  • 浏览: 4184241 次
社区版块
存档分类
最新评论

浅谈spring——DAO管理(十)

 
阅读更多

目前市场上的持久化技术框架有:Hibernate、ibatis、JDO、JPA、TOPLink等。由于框架繁杂,spring需要提供模板类简化各种持久化技术的使用(设计模式方面使用:模板模式、适配器模式),体现了“开-闭原则”


spring提供了很多的模板类支持不同框架的dao操作,比如ibatis的org.springframework.orm.ibatis.SqlMapClientTemplate


如果直接使用模板类,我们必须在DAO接口实现类中定义一个模板对象并提供数据资源,为了解决这个问题,spring提供了支持类,可以直接将所需资源(比如:dataSource、sqlMapClient)注入支持类中(最终还是封装到Template类中)

ibatis的支持类:org.springframework.orm.ibatis.support.SqlMapClientDaoSupport

其它框架的支持类在上图的各自的support包中

关于dbcp数据源的配置,可以访问链接


上面的ORM框架是一种很流行的方式,也是一种主流方式 ,其底层实现原理依然是JDBC


JDBC数据访问操作流程:

1. 获取数据库连接

2. 开启事务

3.获得prepareStatement执行功能,预加载sql语句,设置参数,执行,对ResultSet结果集处理(变化部分)

4. 事务提交

5. 回滚事务(与步骤4互斥)

6. 关闭各种连接资源

我们可以将上面的数据访问流程固化到模板类中,将其中的固定部分和变化部分分开,变化的部分可以通过回调接口(比如匿名内部类方式)开放出来,根据业务单独实现。提高开发效率的同时又保证了资源使用的正确性。


Spring JDBC通过模板和回调机制大大降低了使用JDBC的复杂度,借助JDBCTemplate只要编写很少代码就可以进行数据库操作。


xml配置

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close"
		p:driverClassName="${jdbc.driverClassName}"
		p:url="${jdbc.url}"
		p:username="${jdbc.username}"
		p:password="${jdbc.password}" />

	<bean id="jdbcTemplate" 
	      class="org.springframework.jdbc.core.JdbcTemplate"
	      p:dataSource-ref="dataSource"/>

调用类

@Repository
public class ForumDao {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	/**
	 * 批量更新数据
	 * 
	 * @param forums
	 */
	public void addForums(final List<Forum> forums) {
		final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)";
		jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
			public int getBatchSize() {
				return forums.size();
			}

			public void setValues(PreparedStatement ps, int index)
					throws SQLException {
				Forum forum = forums.get(index);
				ps.setString(1, forum.getForumName());
				ps.setString(2, forum.getForumDesc());
			}
		});
	}

	/**
	 * 根据ID获取Forum对象
	 * 
	 * @param forumId
	 * @return
	 */
	public Forum getForum(final int forumId) {
		String sql = "SELECT forum_name,forum_desc FROM t_forum WHERE forum_id=?";
		final Forum forum = new Forum();

		jdbcTemplate.query(sql, new Object[] { forumId },
				new RowCallbackHandler() {
					public void processRow(ResultSet rs) throws SQLException {
						forum.setForumId(forumId);
						forum.setForumName(rs.getString("forum_name"));
						forum.setForumDesc(rs.getString("forum_desc"));
					}
				});
		return forum;
	}
}


JDBCTemplate提供数据库的增、删、改、查、存储过程等常见的数据库操作。

此外还提供了支持命名参数绑定的NamedParameterJDBCTemplate,以减少code的出错机率;SimpleJDBCTemplate类隐藏使用几率不高的方法,暴露使用机率高的方法,更加人性化。

表主键,根据创建者角度不同可以分为:应用层主键,由应用层负责(可以通过规则自由控制、灵活方便);另一种是数据层主键,比如oracle的sequence。

随着大数据时代的来临,数据层主键的缺点越发明显:

1. 不方便全局管理,系统丧失灵活性

2. 不方便数据的整合和迁移

3. 不方便后续的分库、分表操作

主键的设定很有讲究的,就比如固定电话都有区号一样

主键id=数字(规则1)+数字(规则2)+。。。

目前淘宝订单有4096张表,其主键的制定也是有一定讲究,详细内容可参考:《淘宝高性能架构简介


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics