目前市场上的持久化技术框架有: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. 关闭各种连接资源
我们可以将上面的数据访问流程固化到模板类中,将其中的固定部分和变化部分分开,变化的部分可以通过回调接口(比如匿名内部类方式)开放出来,根据业务单独实现。提高开发效率的同时又保证了资源使用的正确性。
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;
}
}
此外还提供了支持命名参数绑定的NamedParameterJDBCTemplate,以减少code的出错机率;SimpleJDBCTemplate类隐藏使用几率不高的方法,暴露使用机率高的方法,更加人性化。
表主键,根据创建者角度不同可以分为:应用层主键,由应用层负责(可以通过规则自由控制、灵活方便);另一种是数据层主键,比如oracle的sequence。
随着大数据时代的来临,数据层主键的缺点越发明显:
1. 不方便全局管理,系统丧失灵活性
2. 不方便数据的整合和迁移
3. 不方便后续的分库、分表操作
主键的设定很有讲究的,就比如固定电话都有区号一样
主键id=数字(规则1)+数字(规则2)+。。。
目前淘宝订单有4096张表,其主键的制定也是有一定讲究,详细内容可参考:《淘宝高性能架构简介》