# 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`