1 / 21

Chapter 06 데이터베이스 연동 지원

Chapter 06 데이터베이스 연동 지원. 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일 : 2009.08.26. 목차. 스프링의 데이터베이스 연동 지원 DataSource 설정 스프링의 JDBC 지원 iBATIS / 하이버네이트 /JPA 연동 지원. 1. 스프링의 데이터베이스 연동 지원. 1. 스프링의 데이터베이스 연동 지원. 중복된 코드 제거를 위한 템플릿 클래스 제공 ( GoF 의 템플릿 패턴 ) Connection conn = null; … try {

marcos
Télécharger la présentation

Chapter 06 데이터베이스 연동 지원

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 06 데이터베이스 연동 지원 작성자 : 장은호 소속팀 : 네이버메인개발 작성년월일: 2009.08.26

  2. 목차 • 스프링의 데이터베이스 연동 지원 • DataSource설정 • 스프링의 JDBC 지원 • iBATIS/하이버네이트/JPA연동 지원

  3. 1. 스프링의 데이터베이스 연동 지원

  4. 1. 스프링의 데이터베이스 연동 지원 • 중복된 코드 제거를 위한 템플릿 클래스 제공(GoF의 템플릿 패턴) • Connection conn = null; • … • try { • conn = getConnection(); • stmt = conn.createStatement(); • rs = stmt.executeQuery(“…”); • } catch(SQLException e) { • … • } finally { • … • if(conn != null) conn.close(); • } • DaoSupport: DAO에서 사용하는 기본적인 기능을 제공, 상속받아서 사용 • 구체적인 Exception을발생시킴

  5. 2. DataSource설정

  6. 2.1. 커넥션 풀을 이용한 Datasource설정 <bean id="dataSource” class="org.apache.commons.dbcp.BasicDataSource" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost/test" p:userName="test" p:password="1234" /> • dataSource : DAO가 데이터에 접근하기 위한 포인트 • DBCP(Jakarta Commons Database Connection Pool) API(connection library) 이용

  7. 2.2. JNDI를 이용한 DataSource설정 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-j22-2.5.xsd"> <jee:jndi-lookup id="dataSource" jndi-name="jdbc/guestbook" resource-ref="true" /> <!– JNDI에서 객체를 검색하는 위치 : java:comp/env/jdbc/guestbook --> <bean id="messageDao" class="MessageDao" p:dataSource-ref="dataSource" /> </beans> • JEE App server, Tomcat, Resin 등 web container 사용하는 경우 <jee:jndi-lookup> 태그 사용하여 JNDI에 등록된 객체명 명시

  8. 2.3. DriverManager를 이용한 DataSource설정 <bean id=“dataSource“ class=“org.springframework.jdbc.dataSource.DriverManagerDataSource” p:driverClassName=“com.mysql.jdbc.Driver” p:url=“jdbc:mysql://localhost/test” p:username=“test” p:password=“root” />

  9. 2.4. DataSource로부터 Connection 구하기 public class JdbcMessageDaoomplementsMessageDao { private DataSourcedataSource; public void setDataSource(DataSourcedataSource) { this.dataSource=dataSource; } @Override public intselectCount() { Connection conn=null; try { // conn=dataSource.getConnection(); conn=DataSourceUils.getConnection(dataSource); } finally { // JdbcUtils.closeConnection(conn); datasourceutils.releaseConnection(conn,dataSource); } } } • DataSource로부터 Connection 구하기 • getConnection() 활용하면 되나 스프링이 제공하는 트랜잭션 관리 기능 활용할 수 없음 • 이를 방지하기 위해 DataSourceUtils클래스를 이용하여 connection을 구하고 반환함.

  10. 3. 스프링의 JDBC 지원

  11. 3.1. JdbcTemplate클래스를 이용한 JDBC 프로그래밍 <bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource” p:driverClassName=“com.mysql.jdbc.Driver” p:url=“jdbc:mysql://localhost/test” p:username=“test” p:password=“1234” /> <bean id=“jdbcTemplate” class=“org.springframework.jdbc.core.JdbcTemplate” p:dataSource-ref=“dataSource” /> <bean id=“messageDao” class=“JdbcTemplateMessageDao” p:jdbcTemplate-ref=“jdbcTemplate” /> jdbcTemplate p:dataSource-ref messageDao p:jdbcTemplate-ref dataSource

  12. 3.1. JdbcTemplate클래스를 이용한 JDBC 프로그래밍 private static final String SELECT_SQL = "select * from GUESTBOOK desc limit ?,?"; public List<Message> selectList(intpage,int size) { List<message> list=jdbcTemplate.query(SELECT_SQL,new Object[] {page, size}, new RowMapper(){ @Override public Object mapRow(ResultSetrs, introwNum) throws SQLException { Message message = new Message(); message.setId(rs.getInt("ID")); message.setName(rs.getString("NAME")); message.setContent(rs.getString("CONTENT")); } }); return list; } 결과값을 원하는 방식으로 가공하여 리턴 PrivatestaticfinalstringINSERT_SQL= “insertintoGUESTBOOK” + “(GUEST_NAME,CONTENT) values (?,?)”; Public void insert(Message message){ jdbcTemplate.update(INSERT_SQL, new Object[]{message.getGuestName(),message.getContent()}); } • List query(SQLquery(SELECT), arguments, Results) : Prepared statement • List query(SQLquery(SELECT), Results) : 정적 SQL • int update(SQL query(INSERT, UPDATE, DELETE), (arguments)) :Prepared SQL • intupdate(SQL query(INSERT, UPDATE, DELETE) : static SQL

  13. 3.2. NamedParameterJdbcTemplate클래스를 이용한 JDBC 프로그래밍 private static final String SELECT_SQL = "select * from GUESTBOOK desc limit :startRow, :size"; public List<Message> selectList(intpage,int size) { Map<String,Object> params = new HashMap<String, Object>(); params.put("startRow",startRow); params.put("size",size); List<message> list=jdbcTemplate.query(SELECT_SQL,params, new RowMapper(){ @Override public Object mapRow(ResultSetrs, introwNum) throws SQLException { Message message = new Message(); message.setId(rs.getInt("ID")); message.setName(rs.getString("NAME")); message.setContent(rs.getString("CONTENT")); } }); return list; } • 이름 기반의 파라미터 설정(MAP 형식)

  14. 3.3. SimpleJdbcTemplate클래스를 이용한 JDBC 프로그래밍 private static final String SELECT_SQL = "select * from GUESTBOOK desc limit ?,?"; public List<Message> selectList(intpage,int size) { List<message> list=jdbcTemplate.query(SELECT_SQL,newParameterizedRowMapper<Message>(){ @Override public Message mapRow(ResultSetrs, introwNum) throws SQLException { Message message = new Message(); message.setId(rs.getInt("ID")); message.setName(rs.getString("NAME")); message.setContent(rs.getString("CONTENT")); return message; } }, page, size); return list; } • 이름 기반의 파라미터 사용 : query(SQL, ParameterizedRowMapper<T>, Map args) • 가변 인수 사용 : query(SQL, ParameterizedRowMapper<T>, Object … args)

  15. 4. iBATIS/Hibernate/JPA연동 지원

  16. 4. iBatis sqlMapClient dataSource configLocation sqlMapClient Template sqlMapClient-ref dataSource, iBATIS설정파일 명시 • Template : • 코드 중복을 없애고 • SQLException을 스프링이 제공하는 • 예외 클래스로 변환하고 • - iBATIS의 sqlMapClient와 거의 동일한 메소드 제공 messageDAO sqlMapClient Template-ref sqlMapConfig.xml <sqlMapConfig> 매핑 설정파일을 명시 Template을 이용해서 실제로 iBATIS사용 GuestBook.xml <sqlMap> 매핑할SQL 구문

  17. 4. iBatis <bean id="sqlMapClient” class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" p:dataSource-ref="dataSource” p:configLocation="WEB_INF/sqlMap/sqlMapConfig.xml"> </bean> <bean id="sqlMapClientTemplate” class="org.springframework.orm.ibatis.SqlMapClientTemplate” p:sqlMapClient-ref="sqlMapClient"> </bean> <bean id="messageDao” class="org.springframework.orm.ibatis.iBatisMessageDao” p:sqlMapClientTemplate-ref="sqlMapClientTemplate"> </bean> <!DOCTYPE sqlMapConfig PUBLIC "-//ibais.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig><sqlMap resource="GuestBook.xml" /></sqlMapConfig> <!DOCTYPE sqlMapConfig PUBLIC "-//ibais.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMap namespace="GuestBook" <select id="selectList" resultMap="messageResultMap" resultClass="Message" parameterClass="map"> select * from GUESTBOOK_MESSAGE order by GUESTBOOK_MESSAGE_ID desc limit #startRow#, #size# </select> </sqlMap>

  18. 4. Hibernate Session == connection dataSource, Hibernate설정파일 명시 sessionFactory dataSource mappingResource Hibernate Template sessionFactory-ref messageDAO hibernate Template-ref • Template : • 코드 중복(try-catch) 방지 • 스프링이 제공하는 예외에 맞게 변환 Message.hbm.xml Template을 이용해서 실제로 Hibernate 사용 매핑 정보를 담고 있는 설정파일

  19. 4. Hibernate <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean“ <property name="dataSource" ref="dataSource" /> <property name="mappingResources"> <list><value>hibernate/Message.hbm.xml</value></list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> </props> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate” p:ssesionFactory-ref="ssesionFactory" /> <bean id="messsageDao" class="HibernateMessageDao” p:hibernateTemplate-ref="hibernateTemplate" />

  20. 4. Hibernate • Hibernate Session이 제공하는 메서드 (get(), load(), save() 등)를 동일하게 제공 • Hibernate Query를 생성하지 않고 사용할 수 있는 find() • List find(String queryString) • List findByNamedParam(String queryString, String[] paramNames, Object[] values) • Hibernate의 NamedQuery실행 메소드 • findByNamedQuery(String queryName) • Criteria 실행 메소드 • List findByCriteria(DetachedCriteria criteria)

  21. Thank you.

More Related