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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

spring(10)通过spring 和 JDBC征服数据库

發布時間:2023/12/3 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring(10)通过spring 和 JDBC征服数据库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README 1)本文部分文字描述轉自:“Spring In Action(中/英文版)”,旨在review ?“spring(10)通過spring 和 JDBC征服數據庫”?的相關知識;
【1】 spring 的數據訪問哲學 1)intro:spring的目標之一是允許我們在開發應用程序的時候,能夠遵循面向對象原則中的“針對接口編程”; 2)為了避免持久化的邏輯分散到應用的各個組件中,最好將數據訪問的功能放到一個或多個專注于此項任務的組件中。這樣的組件通常稱為數據訪問對象(data accwss object,DAO) 或 Repository;(干貨——引入了 DAO 和 Repository) 3)為了避免應用與特定的數據訪問策略耦合在一起,編寫良好的 Repository應該以接口的方式暴露功能,下圖展現了設計數據訪問層的合理方式: (t3) 【1.2】數據訪問模板化 1)intro:spring將數據訪問過程中固定的和可變的部分明確劃分為兩個不同 的類: 模板(template) 和 回調(callback);模板管理過程中固定的部分,而回調處理自定義的數據訪問代碼。下圖展現了這兩個類的職責:(干貨——引入了模板和回調) (t4) 2)針對不同的持久化平臺,spring 提供了多個可選的模板。如果直接使用 JDBC,那你可以選擇 JdbcTemplate。如果你希望使用對象關系映射框架,那 HibernateTemplate 或 JpaTemplate 可能會適合你。下表列出了 spring 所提供的所有數據訪問模板及其用途: (t5) Attention)spring所支持的大多數持久化功能都依賴于 數據源。因此,在聲明模板和 Repository之前,需要在spring 中配置一個 數據源用來連接數據庫;
【2】配置數據源 1)intro:spring 提供了在 spring上下文中配置數據源bena 的多種方式: way1)通過JDBC 驅動程序定義的數據源; way2)通過JNDI 查找的數據源; way3)連接池的數據源;
【2.1】使用JNDI 數據源 1)intro to jndi :http://blog.csdn.net/pacosonswjtu/article/details/51644550 2)利用spring,可以像使用 spring bean 那樣配置 JNDI 中數據源的引用并將其裝配到需要的類中; 3)使用 java配置 將 JNDI數據源裝配到需要的類中:(for spec info ,please visit ?tomcat中配置jndi數據源以便spring獲取) @Bean // 使用JNDI 數據源.public DataSource dataSource() {JndiTemplate jndiTemplate = new JndiTemplate();DataSource dataSource = null;try {dataSource = (DataSource) jndiTemplate.lookup("java:comp/env/jdbc/spring");} catch (NamingException e) {e.printStackTrace();}return dataSource;} 【2.2】使用數據源連接池(strongly recommended) 1)intro:直接在spring中配置數據源,但spring并沒有提供數據源連接池的實現,但可以有多項可用方案:(schema) scheme1)Apache Commons DBCP(http://commons.apache.org/proper/commons-dbcp/configuration.html scheme2)c3p0(https://sourceforge.net/projects/c3p0/ scheme3)BoneCP(http://www.jolbox.com/ 2)看個荔枝:配置DBCP BasicDataSource: @Beanpublic BasicDataSource getDataSource() {BasicDataSource ds = new BasicDataSource();ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/t_spring");ds.setUsername("root");ds.setPassword("root");return ds;} 3)BasicDataSource的連接池配置屬性如下所示: (t6)
【2.3】基于JDBC 驅動的數據源 1)intro:在spring中,通過JDBC驅動定義數據源是最簡單的配置方式,spring提供了3個這樣的數據源類以供選擇: type1)DriverManagerDataSource:在每個連接請求時都會返回一個新建的連接。與 DBCP 的?BasicDataSource 不同,由DriverManagerDataSource 提供的連接并沒有進行池化管理;(干貨——引入了池化管理) type2)SimpleDriverDataSource:它直接使用 JDBC驅動,來解決再特定環境下的類加載問題,這樣的環境包括 OSGi 容器; type3)SingleConnectionDataSource: 在每個連接請求時都會返回同一個的連接。盡管?SingleConnectionDataSource不是嚴格意義上的連接池數據源,但是你可以將其視為只有一個連接的池;
【3】在spring中使用 JDBC 【3.2】使用 JDBC模板 1)spring將數據訪問的樣本代碼抽象到 模板類中,spring為jdbc提供了3個模板類選擇:分別是 JdbcTemplate, NamedParameterJdbcTemplate 和 SimpleJdbcTemplate(已經被棄用),而原書作者推薦了?JdbcTemplate;(干貨——原書作者推薦了?JdbcTemplate) 2)intro to?JdbcTemplate:最基本的spring jdbc模板,支持簡單的JDBC數據庫訪問功能以及基于索引參數的查詢;
【3.2.1】使用 JdbcTemplate來插入數據 1)為了使其正常工作,只需要為其設置 DataSource就可以了; (for org.springframework.jdbc.core.JdbcOperations API ?, 參見 ?JdbcTemplate API)
@Configuration public class RepositoryConfig {@Beanpublic BasicDataSource getDataSource() {BasicDataSource ds = new BasicDataSource();ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/t_spring");ds.setUsername("root");ds.setPassword("root");return ds;}@Beanpublic JdbcTemplate getJdbcTemplate(DataSource ds) {return new JdbcTemplate(ds);} } 2)使用JdbcTemplate 來讀取數據
@Repository public class SpittleRepositoryImpl implements SpittleRepository {private JdbcOperations jdbc;@Autowiredpublic SpittleRepositoryImpl(JdbcOperations jdbc) {this.jdbc = jdbc;}public List<Spittle> findSpittles(long limit, int offset) {return jdbc.query("select id, name from t_two limit ? offset ?", new SpittleRowMapper(), limit, offset);}private static class SpittleRowMapper implements RowMapper<Spittle> {public Spittle mapRow(ResultSet rs, int rowNum) throws SQLException {return new Spittle(rs.getInt("id"), rs.getString("name"));}}@Overridepublic Spittle findSpittle(int id) {return jdbc.queryForObject("select id,name,address from t_two where id=?", new RowMapper<Spittle>() { // �����?���@Overridepublic Spittle mapRow(ResultSet rs, int rowNum) throws SQLException {return new Spittle(rs.getInt("id"), rs.getString("name"),rs.getString("address"));}}, id);}@Overridepublic int getItemSum() {return (int) jdbc.queryForObject("select count(*) as item_sum from t_two", new RowMapper<Object>() {@Overridepublic Object mapRow(ResultSet rs, int rowNum) throws SQLException {return rs.getInt("item_sum");}});} } 對以上代碼的分析(Analysis):這個findOne()方法 使用了 JdbcTemplate.queryForObject() 方法來從數據庫查詢 Spitter;queryForObject() 方法有三個參數: parameter1)String對象:包含了要從數據庫中查找數據的SQL; parameter2)RowMapper對象:用來從 ResultSet 中提取數據并構建域對象; parameter3)可變參數列表:列出了要綁定到查詢上的索引參數值;(Prepared Statement==預備語句) Attention)值得注意的是 SpitterRowMapper對象中,它實現了 RowMapper接口。對于查詢返回的每一行數據,JdbcTemplate 將會調用 RowMapper.mapRow()方法,并傳入一個 ResultSet 和 包含行號的整數。在 SpitterRowMapper.mapRow()方法中,我們創建了 Spitter對象并將 ResultSet中的值填充進去;
【3.2.2】使用命名參數 1)intro:命名參數可以賦予SQL 中的每個參數一個明確的名字,在綁定值到查詢語句的時候就通過該名字來引用參數。 2)看個荔枝:若某個sql 查詢語句定義如下: private static final String SQL_INSERT_SPITTER ="insert into spitter (username, password, fullname) " +"values (:username, :password, :fullname)"; 對以上代碼的分析(Analysis):使用命名參數查詢,綁定值的順序就不重要了,可以按照名字來綁定值;如果查詢語句發生了變化導致參數的順序與之前不一致,我們不需要修改綁定的代碼;
Attention)NamedParameterJdbcTemplate 是一個特殊的 JDBC模板類,它支持使用命名參數;其聲明方式通過 JdbcTemplate:(干貨——NamedParameterJdbcTemplate 支持命名參數 @Bean public NamedParameterJdbcTemplate jdbcTemplate(DataSource dataSource) {return new NamedParameterJdbcTemplate(dataSource); } 3)看個荔枝:我們將 NamedParameterJdbcOperations(NamedParameterJdbcTemplate所實現的接口)注入到 Repository中,用它來替代 JdbcOperations,現在的addSpitter()方法如下所示:

private static final String INSERT_SPITTER ="insert into Spitter " +" (username, password, fullname, email, updateByEmail) " +"values " +" (:username, :password, :fullname, :email, :updateByEmail)"; public void addSpitter(Spitter spitter) {Map<String, Object> paramMap = new HashMap<String, Object>();paramMap.put("username", spitter.getUsername());paramMap.put("password", spitter.getPassword());paramMap.put("fullname", spitter.getFullName());paramMap.put("email", spitter.getEmail());paramMap.put("updateByEmail", spitter.isUpdateByEmail());jdbcOperations.update(INSERT_SPITTER, paramMap); }

總結

以上是生活随笔為你收集整理的spring(10)通过spring 和 JDBC征服数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

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