日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring总结四:JDBC操作

發布時間:2024/1/8 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,所以只列舉幾個比較常用的方法嗎,如果想了解更多,可以去查一下官方文檔。

簡單使用
  • 查詢單行數據
從數據庫中獲取一條記錄,示意得到對應的一個對象 1、其中的 RowMapper 指定如何去映射結果集的行,常用的實現類的 BeanPropertyRowMapp(從這個類的名字就可以看出這個類的作用是將數據庫行的屬性值映射到Bean實體類的屬性上)用法實例:RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);結果集的行中的各列會映射到實體類對應的屬性中。 2、使用 sql 中列的別名完成列名和類的屬性名的映射,例如 username userName 3、不支持級聯屬性, JdbcTemplate 到底是 JDBC 的小工具,而不是 ORM 框架由于使用了泛型,所以我們可以直接得到對應的對象String sql="select id,username,balance from account where id=?";User user=jdbcTemplate.queryForObject(sql, rowMapper, 1);1代表要傳入的參數,參數個數與寫的sql語句有關
  • 查詢多行數據
String sql="select id,username,balance from account where id>?"; List<User> userList=new ArrayList<User>(); RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class); userList=jdbcTemplate.query(sql, rowMapper,3);這里注意 query方法返回的是 List<T> 類型的對象
  • 查詢單個列的值或做統計查詢
String sql="select count(id) from account"; long count=jdbcTemplate.queryForObject(sql, Long.class); 第二個參數是要查詢的列屬性的類類型
  • 更新數據庫
String sql="update account set username=? where balance=?"; jdbcTemplate.update(sql, "Jack",99);
  • 批量操作

String sql="insert into account values(default,?,?)"; List<Object[]> batchArgs=new ArrayList<Object[]>(); batchArgs.add(new Object[] {"AA",12}); batchArgs.add(new Object[] {"BB",24}); batchArgs.add(new Object[] {"CC",48}); batchArgs.add(new Object[] {"DD",96}); batchArgs.add(new Object[] {"EE",192}); jdbcTemplate.batchUpdate(sql,batchArgs);專門的批量操作方法可以提高效率 注意:可以看到在sql的參數中使用到了default,這個是告訴數據庫采用默認的值,如果是主鍵的話,會自增,這樣的好處是當我們只需要按照當前對象的序列來唯一標識這個數據的話,就不用先去查詢數據庫中原來有多少條數據去確定該數據的主鍵了。

????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操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。