Spring 中的数据访问对象 (DAO) 支持旨在以一致的方式轻松使用数据访问技术(例如 JDBC、Hibernate 或 JPA)。这使您可以相当轻松地在上述持久性技术之间切换,并且还可以让您编写代码而不必担心捕获每种技术特定的异常。
保证您的数据访问对象 (DAO) 或存储库提供异常转换的最佳方法是使用@Repository注释。此注释还允许组件扫描支持查找和配置您的 DAO 和存储库,而无需为它们提供 XML 配置条目。
任何 DAO 或存储库实现都需要访问持久性资源,具体取决于所使用的持久性技术。例如,基于 JDBC 的存储库需要访问 JDBC DataSource,而基于 JPA 的存储库需要访问 EntityManager. 完成此 *** 作的最简单方法是使用 、 或 注释之一注入此资源@Autowired依赖@Inject项 。以下示例适用于 JPA 存储库:@Resource``@PersistenceContext
@Repository public class JpaMovieFinder implements MovieFinder { @PersistenceContext private EntityManager entityManager; // ... }
如果您使用经典的 Hibernate API,则可以注入SessionFactory,如以下示例所示:
@Repository public class HibernateMovieFinder implements MovieFinder { private SessionFactory sessionFactory; @Autowired public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } // ... }
我们在这里展示的最后一个示例是针对典型的 JDBC 支持。您可以将 DataSource注入注入到初始化方法或构造函数中,您可以在其中 使用 this创建一个JdbcTemplate和其他数据访问支持类(例如和其他) 。以下示例自动装配 a :SimpleJdbcCall``DataSource``DataSource
@Repository public class JdbcMovieFinder implements MovieFinder { private JdbcTemplate jdbcTemplate; @Autowired public void init(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } // ... }
简化实例
倘若肯再多写一点样板代码,就可以把AbstractDao改成泛型,并实现getById(),getAll(),deleteById()这样的通用方法:
public abstract class AbstractDaoextends JdbcDaoSupport { private String table; private Class entityClass; private RowMapper rowMapper; public AbstractDao() { // 获取当前类型的泛型类型: this.entityClass = getParameterizedType(); this.table = this.entityClass.getSimpleName().toLowerCase() + "s"; this.rowMapper = new BeanPropertyRowMapper<>(entityClass); } public T getById(long id) { return getJdbcTemplate().queryForObject("SELECT * FROM " + table + " WHERe id = ?", this.rowMapper, id); } public List getAll(int pageIndex) { int limit = 100; int offset = limit * (pageIndex - 1); return getJdbcTemplate().query("SELECt * FROM " + table + " LIMIT ? OFFSET ?", new Object[] { limit, offset }, this.rowMapper); } public void deleteById(long id) { getJdbcTemplate().update("DELETE FROM " + table + " WHERe id = ?", id); } ... }
这样,每个子类就自动获得了这些通用方法:
@Component @Transactional public class UserDao extends AbstractDao{ // 已经有了: // User getById(long) // List getAll(int) // void deleteById(long) } @Component @Transactional public class BookDao extends AbstractDao { // 已经有了: // Book getById(long) // List getAll(int) // void deleteById(long) }
可见,DAO模式就是一个简单的数据访问模式,可以基于泛型实现更通用、更简洁的DAO模式。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)