applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <context:annotation-config /> <context:component-scan base-package="dao.impl" /> <bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource" p:driverClassName="oracle.jdbc.driver.OracleDriver" p:url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" p:username="username" p:password="password" /> <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="ds" /> </beans>
IDepDAO.java
public interface IDeptDAO { public static final String PK_SQL = "SELECT DEPT_SEQ.NEXTVAL FROM DUAL"; public Long get(); public int save(Long deptno, String dname, String loc); }
DeptDAOImpl.java
@Repository public class DeptDAOImpl implements IDeptDAO { @Autowired private JdbcTemplate jt; public DeptDAOImpl() { } public DeptDAOImpl(JdbcTemplate jt) { this.jt = jt; } @Override public Long get() { return jt.queryForObject(PK_SQL, Long.class); } @Override public int save(Long deptno, String dname, String loc) { String sql = "INSERT INTO DEPT VALUES (?, ?, ?)"; return jt.update(sql, deptno, dname, loc); } }
測試類
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); for (String s : ctx.getBeanDefinitionNames()) { System.out.println(s); } IDeptDAO dao = ctx.getBean("deptDAOImpl", IDeptDAO.class); int success = dao.save(dao.get(), "業務部", "芝加哥"); System.out.println("成功新增" + success + "筆!"); ((ClassPathXmlApplicationContext) ctx).close();
這次的專案圖
這邊有個小技巧,注意DeptDAOImpl.java的圖示,右上角有個「S」,表示使用getBean可以抓的到
官方的${}是在外面新增一個檔案,然後抓進去用的,如下:
xxx.properties
jdbc.d=oracle.jdbc.driver.OracleDriver jdbc.u1=jdbc:oracle:thin:@127.0.0.1:1521:orcl jdbc.u2=username jdbc.p=password
applicationContext.xml
<context:property-placeholder location="classpath:xxx.properties" /> <bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource" p:driverClassName="${jdbc.d}" p:url="${jdbc.u1}" p:username="${jdbc.u2}" p:password="${jdbc.p}" />
※DBCP和C3P0的支援
官網可複製,快到14.3.2的上面兩張表applicationContext.xml
<context:property-placeholder location="classpath:xxx.properties" /> <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.d}" /> <property name="url" value="${jdbc.u1}" /> <property name="username" value="${jdbc.u2}" /> <property name="password" value="${jdbc.p}" /> </bean> <bean id="ds2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc.d}" /> <property name="jdbcUrl" value="${jdbc.u1}" /> <property name="user" value="${jdbc.u2}" /> <property name="password" value="${jdbc.p}" /> </bean>
pom.xml
<dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>
※以上是基本設定,還有很多設定:
DBCP的文件可參考這裡,而API可參考這裡,
C3P0的文件可參考這裡,而API可參考這裡,package是com.mchange.v2.c3p0,class是ComboPooledDataSource
※JdbcDaoSupport
JdbcDaoSupport可以幫我們取得JdbcTemplate,所以原來的程式碼還可以再改成如下的寫法@Repository public class DeptDAOImpl extends JdbcDaoSupport implements IDeptDAO { public DeptDAOImpl() {} @Autowired public DeptDAOImpl(JdbcTemplate jt) { super.setJdbcTemplate(jt); } @Override public Long get() { return super.getJdbcTemplate().queryForObject(PK_SQL, Long.class); } @Override public int save(Long deptno, String dname, String loc) { String sql = "INSERT INTO DEPT VALUES (?, ?, ?)"; return super.getJdbcTemplate().update(sql, deptno, dname, loc); } }
※繼承了JdbcDaoSupport以後,原本的JdbcTemplate統統都用super取得了
沒有留言:
張貼留言