# JdbcTemplate 和 SessionFactory的用法
**applicationContext-datasource.xml**
```xml=
<bean id="eeitDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.dataSource.driverClassName}" />
<property name="jdbcUrl" value="${eeit.dataSource.url}" />
<property name="user" value="${eeit.dataSource.username}" />
<property name="password" value="${eeit.dataSource.pawd}" />
<property name="autoCommitOnClose" value="false"/><!-- 連接關閉時默認將所有未提交的操作回滾。 Default: false -->
<!-- 當連接池用完時客戶端調用getConnection()後等待獲取新連接的時間,超時後將拋出SQLException,如設為0則無限期等待。單位毫秒。 Default: 0 -->
<property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"/>
<!-- JDBC的標準參數,用以控制數據源內加載的PreparedStatements數量。
但由於預緩存的statements屬於單個connection而不是整個連接池。
所以設置這個參數需要考慮到多方面的因素。如果maxStatements與maxStatementsPerConnection均為0,則緩存被關閉。 Default: 0-->
<property name="maxStatements" value="0"/>
<property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>
<!-- 連接池中保留的最小連接數。 -->
<property name="minPoolSize" value="${jdbc.minPoolSize}"/>
<!-- 連接池中保留的最大連接數。 Default: 15 -->
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
<!-- 最大空閒時間,180秒內未使用則連接被丟棄。若為0則永不丟棄。 Default: 0 -->
<property name="maxIdleTime" value="180"/>
<property name="maxIdleTimeExcessConnections" value="120"/>
<property name="idleConnectionTestPeriod" value="120"/><!-- 每120秒檢查所有連接池中的空閒連接。Default: 0 -->
<property name="acquireIncrement" value="3"/><!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。 Default: 3 -->
<property name="acquireRetryDelay" value="1000"/><!--兩次連接中間隔時間,單位毫秒。 Default: 1000 -->
<property name="acquireRetryAttempts" value="30"/><!-- 定義在從數據庫獲取新連接失敗後重複嘗試的次數。Default: 30 -->
<!-- 獲取連接失敗將會引起所有等待連接池來獲取連接的線程拋出異常。
但是數據源仍有效 保留,並在下次調用getConnection()的時候繼續嘗試獲取連接。
如果設為true,那麼在嘗試 獲取連接失敗後該數據源將申明已斷開並永久關閉。Default: false -->
<property name="breakAfterAcquireFailure" value="false"/>
<!-- 因性能消耗大請只在需要的時候使用它。如果設為true那麼在每個connection提交的 時候都將校驗其有效性。
建議使用idleConnectionTestPeriod或automaticTestTable等方法來提升連接測試的性能。Default: false -->
<property name="testConnectionOnCheckout" value="false"/>
<!-- 而根據C3P0官方文檔的建議,當你不清楚操作會持續多久時,就不需要配置這個選項的 -->
<!-- property name="unreturnedConnectionTimeout" value="60"/ -->
<property name="debugUnreturnedConnectionStackTraces" value="true"/>
<property name="numHelperThreads" value="6"/>
</bean>
<bean id="eeitSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="eeitDataSource" />
<property name="packagesToScan">
<list>
<value>gov.camiol.domain.eeit</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">${jdbc.dataSource.showSql}</prop>
<prop key="hibernate.dialect">${jdbc.dataSource.dialect}</prop>
</props>
</property>
</bean>
<!-- Creating TransactionManager Bean, since JDBC we are creating of type HibernateTransactionManager -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="eeitSessionFactory" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<description>jdbcTemplate</description>
<property name="dataSource">
<ref bean="eeitDataSource" />
</property>
</bean>
```
**JdbcTemplate**
```java=
@Autowired
protected JdbcTemplate jdbcTemplate;
List<String> param = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
sb.append(" select Name,Age ");
sb.append(" from Student ");
sb.append(" where 1=1 ");
sb.append(" and Id = ? ");
param.add(id);
sb.append(" order by CreateTime desc ");
Object[] params = new Object[param.size()];
params = param.toArray(params);
List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sb.toString(),params);
return resultList;
```
**SessionFactory**
```java=
@Resource(name = "eeitSessionFactory")
private SessionFactory eeitSessionFactory;
protected Session getSession(){
return eeitSessionFactory.getCurrentSession();
}
//主程式
List<Student> resultList = null;
SQLQuery query = null;
try{
StringBuilder sb = new StringBuilder();
sb.append(" select Name,Age ");
sb.append(" from Student ");
sb.append(" where 1=1 ");
sb.append(" and Id = :id ");
sb.append(" and PassportNo in (:passportList) ");
sb.append(" order by CreateTime desc ");
logger.info(sb.toString());
query = getSession().createSQLQuery(sb.toString());
query.setParameterList("passportList",passportList);
query.setString("id",id);
//將得到的結果轉換為Map形式;
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
//如果沒有加這句的話,回傳的結果會是List<Object[]>
List<Map<String,Object>> mapList = query.list();
if(mapList != null && !mapList.isEmpty()){
resultList = new ArrayList<Student>();
for(Map<String,Object> map:mapList){
Student st = new Student();
BeanClone.map2Object(map,st,null);
resultList.add(st);
}
}
}catch(Exception e){
logger.error(e);
throw e;
}
return resultList;
```
###### tags: `hibernate`