目前市场上的持久化技术框架有: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张表,其主键的制定也是有一定讲究,详细内容可参考:《淘宝高性能架构简介》