Spring JDBC juni 30, 2005 1 Doel Database acties Flexibel Gecontroleerd Productief juni 30, 2005 2 Database acties CRUD stored procedures Lob ... juni 30, 2005 3 Flexibel jdbc ORM framework connection pooling datasource testen outside container mock objecten Database onafhankelijk (?!) juni 30, 2005 4 Gecontroleerd Exception handling Connection leaking juni 30, 2005 5 Productief gericht op functie geen plumbing juni 30, 2005 6 Architectuur Domain Object Domain Object Value Object JNDI Service DAO juni 30, 2005 7 SIDE STEP - Architectuur issue Hoe implementeer je de emp – dept en emp – mgr relatie in de domein objecten? Hoe ga je met die relatie om in DAO’s? ORM taak Department Employee lazy loading vs ... juni 30, 2005 8 Example import java.sql.*; import javax.sql.*; public class EmpDao { public List getAllEmployees() { Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; List emps = new ArrayList(); try { con = getConnection(); pstmt = con.prepareStatement ("select * from emp"); rs = pstmt.executeQuery(); while (rs.next()) { Employee e = new Employee(); e.setId (rs.getLong(1)); e.setName (rs.getString(2)); // ... emps.add(e); } } catch (SQLException e) { // handle exception } finally { try { rs.close(); pstmt.close(); con.close(); } catch (SQLException e1) { // no action needed } } return emps; } } private Connection getConnection() throws SQLException { try { Context ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup ("java:comp/env/jdbc/myDatabase"); return ds.getConnection(); } catch (NamingException e) { // handle exception return null; } } juni 30, 2005 private Connection getConnection() throws SQLException { try { DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); return DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:orcl“ ,"scott", "tiger"); } catch (SQLException sqle) { // handle exception return null; } } 9 How can Spring help? Make life easier: DAO Support JDBC, Hibernate, Toplink, iBatis, JDO, ... Dependency Injection Jdbc helper classes Exception Handling MockObjects juni 30, 2005 10 Spring Architectuur Domain Object Domain Object Domain Object DAO Interface XXDAO Support JdbcDaoSupport HibernateDaoSupport TopLinkDaoSupport ... Service DAO ApplicationContext-jdbc juni 30, 2005 11 Example A public interface empDao { public List getAllEmployees (); } public class EmployeeJdbcDao extends JdbcDaoSupport implements EmpDao { public List getAllEmployees() { JdbcTemplate jt = getJdbcTemplate(); return jt.queryForList (“select * from emp”); } } <bean id="dataSourceDBDirect" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:BAARSJES1" /> <property name="username" value="scott" /> <property name="password" value="tiger" /> </bean> <bean id="employeeDAO" class="nl.amis.demo.dao.jdbc.EmployeeJdbcDao" > <property name="dataSource"> <ref local="dataSourceDBDirect" /> </property> </bean> juni 30, 2005 12 Exception Handling RuntimeException ipv checked SQLException DataAccessException SQLException Translation DataIntegrityViolationException DataRetrievalFailureException CannotGetJdbcConnectionException ... juni 30, 2005 13 jdbc helper classes JdbcTemplate query, queryForList, queryForInt, queryFor.. ArrayList (per row) of HashMaps (column name as key) RowMapper PreparedStatementCreator/Callback MappingSQLQuery ... juni 30, 2005 14 Testen en MockObjects public class TestEmployeeDao extends AbstractDependencyInjectionSpringContextTests { private EmployeeDao employeeDAO; public void setEmployeeDAO(EmployeeDao employeeDAO) { this.employeeDAO = employeeDAO; } protected String[] getConfigLocations() { return new String[] {"nl/amis/demo/dao/jdbc/applicationContext-jdbc.xml"}; } public void testFindEmployeeById () { Employee emp = employeeDAO.getEmployeeById(7839); assertEquals("KING", emp.getName()); assertEquals("PRESIDENT", emp.getJob()); // ... } <bean id="employee7839" class="nl.amis.demo.domain.Employee"> <property name="name" value="KING" /> <property name="employeeNumber" value="7839" /> <property name="job" value="PRESIDENT" /> </bean> } <bean id="employeeMockDAO" class="nl.amis.demo.dao.EmployeeMockDao"> <property name="emp"> <ref local="employee7839" /> </property> </bean> juni 30, 2005 15