javascript
Spring总结四:JDBC操作
Spring 對 JDBC 的支持
????為了使 JDBC 更加易于使用, Spring 在 JDBC API 上定義了一個抽象層, 以此建立一個 JDBC 存取框架。
????JdbcTemplate(JDBC 模板)作為 Spring JDBC 框架的核心(其實Spring還有一一個常用模板,后面會提到), JDBC 模板的設計目的是為不同類型的 JDBC 操作提供模板方法. 每個模板方法都能控制整個過程, 并允許覆蓋過程中的特定任務. 通過這種方式, 可以在盡可能保留靈活性的情況下, 將數據庫存取的工作量降到最低。
數據源
????介紹JdbcTemplate之前先來介紹一下數據源。
????慣例(數據源的官方概念):
????數據源(Data Source)顧名思義,數據的來源,是提供某種所需要數據的器件或原始媒體。在數據源中存儲了所有建立數據庫連接的信息。就像通過指定文件名稱可以在文件系統中找到文件一樣,通過提供正確的數據源名稱,你可以找到相應的數據庫連接。
????數據源是使用持久化技術必須的,數據源說白了就是數據庫連接池技術的一種具體實現,意義就是我們將與數據庫的連接交給數據源去管理,我們在數據源中配置好信息之后,我們就可以在需要的時候從數據源中取出連接來供我們使用,而我們使用完之后也不用去考慮這個連接是否需要關閉,數據源會自動為我們管理(一般初始的連接不會關閉,跟我們對數據源的配置有關)。
????Spring有默認的數據源,但我們一般不用,以我目前的知識了解到的當前常用的數據源有C3p0、DBCP、JNDI、Druid
以C3P0為例演示配置:
<!-- 導入資源文件 --><context:property-placeholder location="classpath:db.properties"/>數據庫信息配置在配置文件中,我們導入進來,可以通過${}的方式取出配置的值<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property><property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property><property name="driverClass" value="${jdbc.driverClass}"></property><property name="initialPoolSize" value="${jdbc.initPoolSize}"></property><property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property></bean>JdbcTemplate
????先來回顧一下不使用框架 JDBC 的操作流程。
- 首先加載驅動Class.forName(“com.mysql.cj.jdbc.Driver”)
- 獲取連接Drivermanager.getConnection(url,username,password)
- 創建 statement 對象(如果需要動態傳入參數,可以使用preparedStatement對象,推薦都使用這個對象,PreperedStatement對于sql中的參數,允許使用占位符的形式進行替換,Statement會使數據庫頻繁編譯SQL,可能造成數據庫緩沖區溢出。PreparedStatement可對SQL進行預編譯,從而提高數據庫的執行效率,減少數據庫壓力)connection.createStatement()
- 執行 sql 語句得到結果statement.executeQuery(sql),這步驟注意一定要用ResultSet對象來接受結果
- 關閉資源(可以簡單理解為先開的后關),resultSet.close(),statement.close(),connection.close()
????JdbcTemplate封裝了連接等一系列過程,只需要調用該對象的方法并傳入參數就可以完成對數據庫的操作。
????JdbcTemplate 類被設計成為線程安全的, 所以可以在IOC 容器中聲明它的單個實例, 并將這個實例注入到所有的 DAO 實例中.
????JdbcTemplate有許多方法,我當時學習的時候就學了幾個比較典型的,畢竟實際開發也會整合其他框架,很少使用JdbcTemplate,所以只列舉幾個比較常用的方法嗎,如果想了解更多,可以去查一下官方文檔。
簡單使用
- 查詢單行數據
- 查詢多行數據
- 查詢單個列的值或做統計查詢
- 更新數據庫
- 批量操作
????Spring JDBC 框架還提供了一個 JdbcDaoSupport 類來簡化 DAO 實現. 該類聲明了 jdbcTemplate 屬性, 它可以從 IOC 容器中注入, 或者自動從數據源中創建.
配置之后我們就可以直接在類中使用getJdbcTemplate()方法來得到JdbcTemplate,就可以直接調用方法了
NamedParameterJdbcTemplate
???? NamedParameterJdbcTemplate 與 JdbcTemplate最大的區別是,該對象可以使用具名參數,但是它沒有無參的構造器,所以必須配置的時候為其構造器指定參數(配置數據源)
NamedParameterJdbcTemplate的配置:
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><constructor-arg ref="dataSource"></constructor-arg></bean>簡單使用
/*** 可以為參數起名字。* 1、好處:若有多個參數,則不用再去對應位置,直接對應參數名,便于維護* 如果sql中使用了in,那么通過?占位符來傳參是不能解決問題的,直接拼接sql又會有sql注入的風險。* 這種情況下可以使用NamedParameterJdbcTemplate 來解決問題。* 具名參數:SQL 按名稱(以冒號開頭)而不是按位置進行指定. 具名參數更易于維護, 也提升了可讀性. 具名參數由框架類在運行時用占位符取代* 2、缺點:較為麻煩* 在 SQL 語句中使用具名參數時, 可以在一個 Map 中提供參數值, 參數名為鍵* 也可以使用 SqlParameterSource 參數* 批量更新時可以提供 Map 或 SqlParameterSource 的數組*/@Testpublic void testNameParameterJdbcTemplate() {String sql="insert into account values(:id,:un,:bal)";Map<String,Object> paramMap=new HashMap<String,Object>();paramMap.put("id", 21);paramMap.put("un", "liqiye");paramMap.put("bal", 88);nameParameterJdbcTemplate.update(sql, paramMap);} /*** 使用具名參數時,可以使用 update(String sql, SqlParameterSource paramSource) 方法進行更新操作* 1、SQL 語句中的參數名和類的屬性一致!* 2、使用 SqlParameterSource 的 BeanPropertySqlParameterSource 實現類作為參數*/@Testpublic void testNameParameterJdbcTemplate2() {String sql="insert into account(id,username,balance) values(:id,:userName,:balance)";User user=new User();user.setId(22);user.setUserName("帝釋");user.setBalance(33);SqlParameterSource paramSource=new BeanPropertySqlParameterSource(user);nameParameterJdbcTemplate.update(sql, paramSource);}總結
以上是生活随笔為你收集整理的Spring总结四:JDBC操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你有用过Type-C接口的手电筒吗?
- 下一篇: HTML+JavaScript简单搜索功