Spring 数据访问策略

Spring封装的数据访问异常  
与SQLException是一个Checked Exception不同,Spring定义的基本书籍访问异常DataAccessException是一个RuntimeException,DataAccessException继承自NestedRuntimeException,完整的保留了原始异常信息。 

异常定义
DataAccessExceptionSpringDAO异常体系跟类
ConcurrencyFailureException在多个并发访问时,无法乐观锁定或者获得数据库锁等
DataAccessResourceFailureException访问数据彻底失败,例如无法连接数据库
DataRetrievalFailureException无法获得指定数据,例如,根据主键无法查到相应记录
InvalidDataAccessResourceUsageException无效的数据访问方法,使用了语法错误的SQL语句
PermissionDeniedDataAccessException没有数据访问权限,例如,当前数据库登录用户无权访问特定表
UncategorizedDataAccessException无法归类的异常


准备数据库环境  
Java代码   收藏代码
  1. // HsqldbUtil类,创建Book表,并插入两条数据  
  2. public static void startDatabase() {  
  3.     server = new Server();  
  4.     server.setDatabaseName(0"test");  
  5.     server.setDatabasePath(0"mem:bookstore");  
  6.     server.setLogWriter(null);  
  7.     server.setErrWriter(null);  
  8.     server.start();  
  9. }  


Xml代码   收藏代码
  1. <!-- 定义DataSource -->  
  2. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  3.     <property name="driverClassName" value="org.hsqldb.jdbcDriver" />  
  4.     <property name="url" value="jdbc:hsqldb:mem:bookstore" />  
  5.     <property name="username" value="sa" />  
  6.     <property name="password" value="" />  
  7. </bean>  
  8. <!-- 使用DriverManagerDataSource为了方便调试  实际中可方便更换为 -->  
  9. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
  10. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
  11.     <property name="jndiName" value="java:comp/env/jdbc/xxxDataSource"/>  
  12. </bean>  


主键生成策略  
1.数据库内置自增 (不好移植) 
2.整形字段,程序控制主键自动增长 (集群时要严格控制同步) 
3.UUID 根据计算机MAC地址和时间,随机计算生成,唯一 (128位整数,浪费空间) 


Java代码   收藏代码
  1. public interface BookDao {  
  2.     List<Book> queryAll();  
  3.     List<Book> queryByAuthor(String author);  
  4.     void create(Book book);  
  5.     void update(Book book);  
  6.     void delete(String id);  
  7. }  



JdbcTemplet  
Xml代码   收藏代码
  1. <!-- 注入dataSource -->  
  2. <bean id="jdbcTemplateBookDao" class="example.chapter5.JdbcTemplateBookDao">  
  3.     <property name="dataSource" ref="dataSource" />  
  4. </bean>  

Java代码   收藏代码
  1. public class JdbcTemplateBookDao extends JdbcDaoSupport implements BookDao {  
  2.     // ResultSet映射为Bean的方式  
  3.     class BookRowMapper implements RowMapper {  
  4.         public Object mapRow(ResultSet rs, int rowNum) throws SQLException {  
  5.             Book book = new Book();  
  6.             book.setId(rs.getString("id"));  
  7.             book.setName(rs.getString("name"));  
  8.             book.setAuthor(rs.getString("author"));  
  9.             return book;  
  10.         }  
  11.     }  
  12.   
  13.     @SuppressWarnings("unchecked")  
  14.     public List<Book> queryAll() {  
  15.         return getJdbcTemplate().query(  
  16.                 "select * from Book",  
  17.                 new BookRowMapper());  
  18.     }  
  19.   
  20.     @SuppressWarnings("unchecked")  
  21.     public List<Book> queryByAuthor(String author) {  
  22.         return getJdbcTemplate().query(  
  23.                 "select * from Book where author=?",  
  24.                 new Object[] { author },  
  25.                 new BookRowMapper());  
  26.     }  
  27.   
  28.     public void create(Book book) {  
  29.         getJdbcTemplate().update(  
  30.                 "insert into Book (id, name, author) values (?, ?, ?)",  
  31.                 new Object[] {book.getId(), book.getName(), book.getAuthor()});  
  32.     }  
  33.   
  34.     public void update(Book book) {  
  35.         getJdbcTemplate().update(  
  36.                 "update Book set name=?, author=? where id=?",  
  37.                 new Object[] {book.getName(), book.getAuthor(), book.getId()});  
  38.     }  
  39.   
  40.     public void delete(String id) {  
  41.         getJdbcTemplate().update(  
  42.                 "delete from Book where id=?",  
  43.                 new Object[] {id});  
  44.     }  
  45.   
  46. }  



集成Hibernate  
Hibernate管理Java类到数据库表的映射,提供了强大的基于对象的查询语句HQL,大幅减少数据库访问需要编写的代码的SQL语句,通过“方言”,最大限度降低了对特定数据库的依赖。 
Hibernate还提供了系列复杂功能来简化数据库操作。 
1.延迟加载,不一次取得所有相关联的对象,而是希望访问某个对象是再去数据库读取 
2.主动抓取,允许在一个查询操作中就获得所有关联的对象,减少数据库连接次数 
3.缓存 
4.级联操作,外键关联的表,更新一个表时,需要同时更新其他表,级联删除 级联更新 
Xml代码   收藏代码
  1. <bean id="sessionFactory"   
  2.     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  3.     <property name="dataSource" ref="dataSource" />  
  4.     <property name="annotatedClasses">  
  5.         <list>  
  6.             <value>example.chapter5.Book</value>  
  7.         </list>  
  8.     </property>  
  9.     <property name="annotatedPackages">  
  10.         <list>  
  11.             <value>example.chapter5</value>  
  12.         </list>  
  13.     </property>  
  14.     <property name="hibernateProperties">  
  15.         <props>  
  16.             <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>  
  17.             <prop key="hibernate.show_sql">true</prop>  
  18.             <prop key="hibernate.jdbc.fetch_size">10</prop>  
  19.             <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>  
  20.         </props>  
  21.     </property>  
  22.     <property name="eventListeners">  
  23.         <map>  
  24.             <entry key="pre-update">  
  25.                 <bean class="org.hibernate.validator.event.ValidatePreUpdateEventListener" />  
  26.             </entry>  
  27.             <entry key="pre-insert">  
  28.                 <bean class="org.hibernate.validator.event.ValidatePreInsertEventListener" />  
  29.             </entry>  
  30.         </map>  
  31.     </property>  
  32. </bean>  


Java代码   收藏代码
  1. @Entity(name="Book")  
  2. public class Book {  
  3. // @Entity 作为数据库表映射 @Id 主键  @Transient不需要持久化字段  
  4.     private String id;  
  5.     private String name;  
  6.     private String author;  
  7.   
  8.     @Id  
  9.     @Pattern(regex="[a-z0-9\\-]{36}", message="ID只能由英文字母,数字和-构成,长度为36个字符")  
  10.     public String getId() { return id; }  
  11.     public void setId(String id) { this.id = id; }  
  12.   
  13.     public String getName() { return name; }  
  14.     public void setName(String name) { this.name = name; }  
  15.   
  16.     public String getAuthor() { return author; }  
  17.     public void setAuthor(String author) { this.author = author; }  
  18. }  
  19.   
  20. public class HibernateBookDao extends HibernateDaoSupport implements BookDao {  
  21.   
  22.     @SuppressWarnings("unchecked")  
  23.     public List<Book> queryAll() {  
  24.         return getHibernateTemplate().find("select b from Book as b");  
  25.     }  
  26.   
  27.     @SuppressWarnings("unchecked")  
  28.     public List<Book> queryByAuthor(String author) {  
  29.         return getHibernateTemplate().find("select b from Book as b where b.author=?", author);  
  30.     }  
  31.   
  32.     public void create(Book book) {  
  33.         getHibernateTemplate().save(book);  
  34.     }  
  35.   
  36.     public void delete(String id) {  
  37.         Book book = (Book) getHibernateTemplate().load(Book.class, id);  
  38.         getHibernateTemplate().delete(book);  
  39.     }  
  40.   
  41.     public void update(Book book) {  
  42.         getHibernateTemplate().update(book);  
  43.     }  
  44.   
  45. }  



集成Ibtais  
Xml代码   收藏代码
  1. <bean id="iBatisBookDao" class="example.chapter5.IBatisBookDao">  
  2.     <property name="sqlMapClient">  
  3.         <bean class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  
  4.             <property name="configLocation" value="ibatis-sql-map-config.xml" />  
  5.             <property name="dataSource" ref="dataSource" />  
  6.         </bean>  
  7.     </property>  
  8. </bean>  


Java代码   收藏代码
  1. public class IBatisBookDao extends SqlMapClientDaoSupport implements BookDao {  
  2.   
  3.     @SuppressWarnings("unchecked")  
  4.     public List<Book> queryAll() {  
  5.         return getSqlMapClientTemplate().queryForList("queryAll");  
  6.     }  
  7.   
  8.     @SuppressWarnings("unchecked")  
  9.     public List<Book> queryByAuthor(String author) {  
  10.         return getSqlMapClientTemplate().queryForList("queryByAuthor", author);  
  11.     }  
  12.   
  13.     public void create(Book book) {  
  14.         getSqlMapClientTemplate().insert("create", book);  
  15.     }  
  16.   
  17.     public void delete(String id) {  
  18.         getSqlMapClientTemplate().delete("delete", id);  
  19.     }  
  20.   
  21.     public void update(Book book) {  
  22.         getSqlMapClientTemplate().update("update", book);  
  23.     }  
  24. }  


集成JPA  
Spring对JPA采用Adapter模式,使JPA和其他持久化机制(Hibernate Toplink JDO)拥有一致的编程模型。 

Xml代码   收藏代码
  1. <!--    
  2.   LocalEntityManagerFactoryBean 提供了标准的JPA初始化配置  
  3.   LocalContainerEntityManagerFactoryBean 更灵活,可以注入Spring管理的DataSource  
  4. -->  
  5. <bean id="entityManagerFactory"   
  6.     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
  7.     <property name="dataSource" ref="dataSource"/>  
  8.     <!-- Adapter 选择实现JPA的具体框架 -->  
  9.     <property name="jpaVendorAdapter">  
  10.         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
  11.             <property name="showSql" value="true" />  
  12.             <property name="generateDdl" value="false" />  
  13.         </bean>  
  14.     </property>  
  15. </bean>   
  16.   
  17. <bean id="jpaTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
  18.     <property name="entityManagerFactory" ref="entityManagerFactory" />  
  19. </bean>  
  20.   
  21. <tx:annotation-driven transaction-manager="jpaTxManager" />  


Java代码   收藏代码
  1. public class JpaBookDao extends JpaDaoSupport implements BookDao {  
  2.   
  3.     @SuppressWarnings("unchecked")  
  4.     public List<Book> queryAll() {  
  5.         return getJpaTemplate().find("select b from Book b");  
  6.     }  
  7.   
  8.     @SuppressWarnings("unchecked")  
  9.     public List<Book> queryByAuthor(String author) {  
  10.         return getJpaTemplate().find("select b from Book b where b.author=?"new Object[] { author });  
  11.     }  
  12.   
  13.     public void create(Book book) {  
  14.         getJpaTemplate().persist(book);  
  15.     }  
  16.   
  17.     public void delete(String id) {  
  18.         Book book = getJpaTemplate().find(Book.class, id);  
  19.         getJpaTemplate().remove(book);  
  20.     }  
  21.   
  22.     public void update(Book book) {  
  23.         getJpaTemplate().merge(book);  
  24.     }  
  25. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值