1. 程式人生 > >Spring學習筆記 Spring JDBC框架

Spring學習筆記 Spring JDBC框架

Spring JDBC簡介

先來看看一個JDBC的例子。我們可以看到為了執行一條SQL語句,我們需要建立連線,建立語句物件,然後執行SQL,然後操縱結果集獲取資料。

try(Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD)){
    List<User> users = new ArrayList<>();
    try (Statement statement = connection.createStatement()) {
        try (ResultSet rs = statement.executeQuery("SELECT *FROM user"
)) { while (rs.next()) { User user = new User(); user.setId(rs.getInt(1)); user.setUsername(rs.getString(2)); user.setPassword(rs.getString(3)); user.setNickname(rs.getString(4)); user.setBirthday(rs.getDate(5
)); users.add(user); } } } }

其實這些步驟中有很多步驟都是固定的,Spring JDBC框架將這些操作封裝起來, 我們只需要關注業務邏輯點即可。在Spring JDBC框架中,我們要做的事情如下:

  • 定義連線字串引數。
  • 指定SQL語句。
  • 宣告引數和引數型別。
  • 每次迭代結果集的操作。

Spring會幫我們完成以下事情:

  • 開啟連線。
  • 準備和執行SQL語句。
  • 在需要的情況下迭代結果集。
  • 處理異常。
  • 操作事務。
  • 關閉結果集、語句和資料庫連線。

使用JdbcTemplate

JdbcTemplate是Jdbc框架最重要的類,提供了較為底層的Jdbc操作。其它幾個類都是在JdbcTemplate基礎上封裝了相關功能。

新增依賴

要在Gradle專案中使用Spring JDBC框架,新增如下一段。由於Spring JDBC的主要類JdbcTemlate需要一個數據源用來初始化,所以還需要一個數據源的實現。

compile group: 'org.springframework', name: 'spring-jdbc', version: '4.3.5.RELEASE'
compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.1.1'

如果要使用Spring框架的其他功能,可能還需要新增對應的依賴。

建立Jdbc Template Bean

首先需要建立一個數據源Bean。為了將配置分離,我們先新建一個jdbc.properties檔案。

jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=12345678

然後建立一個Spring配置檔案jdbc.xml。這裡用到了<context:property-placeholder>節點來匯入其它配置檔案。然後用這些屬性建立一個數據源Bean,然後再利用資料來源Bean來建立一個JdbcTemplate。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg ref="dataSource"/>
    </bean>
    <context:property-placeholder location="jdbc.properties"/>
</beans>

JdbcTemplate操作

註冊了JdbcTemplate之後,就可以將它注入到任何地方來使用了。首先它可以使用execute方法,執行任何SQL語句。這裡建立了一個簡單的MySQL使用者表,只有主鍵和使用者名稱。

jdbcTemplate.execute("CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) UNIQUE)");

它還可以使用update方法執行增加、更新和刪除操作。

jdbcTemplate.update("INSERT INTO user(name) VALUES(?)", "yitian");
jdbcTemplate.update("INSERT INTO user(name) VALUES(?)", "zhang2");
jdbcTemplate.update("UPDATE user SET name=? WHERE name=?", "zhang3", "zhang2");
jdbcTemplate.update("DELETE FROM user WHERE name=?", "zhang3");

查詢操作也很簡單,使用queryForObject方法,傳入SQL字串和結果型別即可。

int count = jdbcTemplate.queryForObject("SELECT count(*) FROM user", Integer.class);
System.out.println("記錄數目是:" + count);
String name = jdbcTemplate.queryForObject("SELECT name FROM user WHERE id=1", String.class);
System.out.println("姓名是:" + name);

如果要查詢整條記錄也可以。Spring提供了一個介面RowMapper,只需要實現該介面的mapRow方法,即可將結果集的一條記錄轉化為一個Java物件,該方法的第二個引數是當前行的行數。下面是一個RowMapper實現。

public class UserRowMapper implements RowMapper<User> {

    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        return new User(rs.getInt(1), rs.getString(2));
    }
}

User實體類對應於上面建立表時簡單的使用者表(其他方法已省略)。

public class User {
    private int id;
    private String name;
}

實現了RowMapper介面之後,我們就可以查詢一條記錄並轉化為Java物件了。

User user = jdbcTemplate.queryForObject("SELECT id,name FROM user WHERE id=?", new UserRowMapper(), 1);
System.out.println(user);

查詢多條記錄也可以,這時候需要使用query方法。

List<User> users = jdbcTemplate.query("SELECT id,name FROM usr", new UserRowMapper());
System.out.println(users);

還有一個通用方法queryForList,返回一個List,每一個元素都是一個Map,在Map中存放著列名和值組成的鍵值對。

List<Map<String, Object>> results = jdbcTemplate.queryForList("SELECT id,name FROM user");
System.out.println(results);

使用NamedParameterJdbcTemplate

前面的JdbcTemplate提供了非常方便的JDBC操作封裝,但是在繫結引數的時候只能採用萬用字元?方式以順序方式繫結引數。如果SQL語句比較複雜,引數比較多,那麼這種方式顯得不太方便。因此Spring提供了一個更加方便的類NamedParameterJdbcTemplate,它可以以命名方式繫結SQL語句引數。NamedParameterJdbcTemplate在內部使用一個JdbcTemplate,你也可以呼叫getJdbcOperations方法獲取底層的JdbcTemplate物件,然後用前面的方法進行基本操作。

建立NamedParameterJdbcTemplate和JdbcTemplate相同,只需要傳入一個數據源即可。

<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

NamedParameterJdbcTemplate和JdbcTemplate的大部分操作相同,這裡僅介紹繫結命名引數的部分。首先,SQL語句必須使用:引數名稱的形式作為引數。然後,我們建立一個MapSqlParameterSource物件,它的內部使用了一個Map儲存的命名引數的名稱和值。然後我們使用它的addValue方法傳遞需要的命名引數的名稱和值,這個方法還可以接受第三個引數指定引數型別,這個型別以java.sql.Types的一些公共欄位的形式給出。最後,將MapSqlParameterSource傳遞給相應的方法執行即可。

String sql = "SELECT id,name FROM user WHERE name=:name AND id<:user_id";
MapSqlParameterSource namedParameters = new MapSqlParameterSource();
namedParameters.addValue("name", "test");
namedParameters.addValue("user_id", 100, Types.INTEGER);
User user = namedParameterJdbcTemplate.queryForObject(sql, namedParameters, new UserRowMapper());
System.out.println(user);

如果不想建立MapSqlParameterSource物件,還可以直接使用一個Map傳遞命名引數的名稱和值。

Map<String, Object> map = new HashMap<>();
map.put("user_id", 100);
map.put("name", "test");
List<User> users = namedParameterJdbcTemplate.query(sql, map, new UserRowMapper());
System.out.println(users);

上面討論的MapSqlParameterSource實際上實現了SqlParameterSource介面,上面的幾個方法簽名也是接受SqlParameterSource介面。這個介面表示用來傳遞命名引數和值的集合。除了MapSqlParameterSource之外,還有另外一個常用的實現,BeanPropertySqlParameterSource,這個類接受一個Java Bean物件,然後使用Bean的屬性名和值作為命名引數的名稱和值。這一點需要注意。

User bean = new User(100, "test");
SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(bean);
users = namedParameterJdbcTemplate.query(sql, parameterSource, new UserRowMapper());
System.out.println(users);

使用SimpleJdbc類

前面所說的JdbcTemplate封裝了一些功能,讓我們方便的使用JDBC。Spring還提供了幾個更高階、功能更具體的SimpleJdbc類。這些類會讀取JDBC的元資料Metadata,使用起來更加方便。

SimpleJdbcInsert

SimpleJdbcInsert類用來插入資料。簡單的使用方法如下。SimpleJdbcInsert需要一個數據源來建立,withTableName方法指定要插入的表名,usingGeneratedKeyColumns指定設定了主鍵自增的列名。其他使用方法和前面所說的類類似。executeAndReturnKey這個方法很特別,它會將資料插入資料庫並返回該條記錄對應的自增鍵。有時候我們可能希望使用自增主鍵來插入一條資料,由於主鍵是資料庫自動生成的,我們必須再次查詢資料庫才能獲得主鍵。這種情況下使用executeAndReturnKey非常方便。注意這個方法返回的是java.lang.Number型別,可以呼叫其XXXvalue方法轉換成各種數值。

SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(dataSource)
        .withTableName("user")
        .usingGeneratedKeyColumns("id");
User user = new User();
user.setName("test");
Map<String, Object> params = new HashMap<>();
params.put("names", user.getName());
int id = simpleJdbcInsert.executeAndReturnKey(params).intValue();
System.out.println("simpleJdbcInsert" + user);

SimpleJdbcCall

SimpleJdbcCall類用來呼叫儲存過程的。使用方法類似。這裡就直接給出Spring官方文件的示例程式碼了。

MySQL儲存過程。

CREATE FUNCTION get_actor_name (in_id INTEGER)
RETURNS VARCHAR(200) READS SQL DATA
BEGIN
    DECLARE out_name VARCHAR(200);
    SELECT concat(first_name, ' ', last_name)
        INTO out_name
        FROM t_actor where id = in_id;
    RETURN out_name;
END;

SimpleJdbcCall呼叫儲存過程。

public class JdbcActorDao implements ActorDao {

    private JdbcTemplate jdbcTemplate;
    private SimpleJdbcCall funcGetActorName;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.setResultsMapCaseInsensitive(true);
        this.funcGetActorName = new SimpleJdbcCall(jdbcTemplate)
                .withFunctionName("get_actor_name");
    }

    public String getActorName(Long id) {
        SqlParameterSource in = new MapSqlParameterSource()
                .addValue("in_id", id);
        String name = funcGetActorName.executeFunction(String.class, in);
        return name;
    }

    // ... additional methods

}

如果要從儲存過程獲取記錄的話,可以這樣。以下是一個MySQL儲存過程。

CREATE PROCEDURE read_all_actors()
BEGIN
 SELECT a.id, a.first_name, a.last_name, a.birth_date FROM t_actor a;
END;

相對應的Java程式碼。

public class JdbcActorDao implements ActorDao {

    private SimpleJdbcCall procReadAllActors;

    public void setDataSource(DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.setResultsMapCaseInsensitive(true);
        this.procReadAllActors = new SimpleJdbcCall(jdbcTemplate)
                .withProcedureName("read_all_actors")
                .returningResultSet("actors",
                BeanPropertyRowMapper.newInstance(Actor.class));
    }

    public List getActorsList() {
        Map m = procReadAllActors.execute(new HashMap<String, Object>(0));
        return (List) m.get("actors");
    }

    // ... additional methods

}

將JDBC操作轉化為Java物件

org.springframework.jdbc.object包下提供了一組類,讓我們用更加面向物件的方式來操作資料庫。我們可以將SQL查詢轉化為一組業務物件,也可以方便的進行查詢、更新和執行儲存過程的操作。

MappingSqlQuery

MappingSqlQuery是一個抽象類,繼承自SQLQuery。我們在使用這個類的時候需要建立一個自定義類,繼承自MappingSqlQuery,然後在其構造方法中初始化一個查詢字串,並在這裡設定查詢引數;然後需要實現該類的mapRow方法,將結果集的行轉化為實體類物件。下面是一個例子。構造方法中定義的查詢字串會被建立為PreparedStatement,因此可以在查詢字串中使用佔位符?。對於每個出現的佔位符,我們都必須呼叫declareParameter方法宣告引數,該方法接受一個SqlParameter物件,該物件需要引數名和型別兩個引數。最後需要呼叫compile方法編譯和準備查詢。該類是執行緒安全的,因此可以安全的在多個執行緒之間共享物件。

public class UserMappingSqlQuery extends MappingSqlQuery<User> {
    public UserMappingSqlQuery(DataSource ds) {
        super(ds, "SELECT id,name FROM user WHERE id=:id");
        super.declareParameter(new SqlParameter("id", Types.INTEGER));
        compile();
    }

    @Override
    protected User mapRow(ResultSet rs, int rowNum) throws SQLException {
        return new User(rs.getInt(1), rs.getString(2));
    }
}

然後我們建立一個物件,呼叫findObject方法並傳入查詢引數,即可獲得結果物件。

@Test
public void testMappingSqlQuery() {
    MappingSqlQuery<User> mappingSqlQuery = new UserMappingSqlQuery(dataSource);
    User user = mappingSqlQuery.findObject(1);
    logger.debug(user);
}

如果查詢要返回一組記錄並傳遞多個查詢引數。需要呼叫相應的execute方法。一下是另一個MappingSqlQuery,以及其測試程式碼。

public class UsersMappingSqlQuery extends MappingSqlQuery<User> {
    public UsersMappingSqlQuery(DataSource ds) {
        super(ds, "SELECT id,name FROM user WHERE id<? AND name LIKE ?");
        super.declareParameter(new SqlParameter("id", Types.INTEGER));
        super.declareParameter(new SqlParameter("name", Types.VARCHAR));
        compile();
    }

    @Override
    protected User mapRow(ResultSet rs, int rowNum) throws SQLException {
        return new User(rs.getInt(1), rs.getString(2));
    }
}
//獲取多個物件
mappingSqlQuery = new UsersMappingSqlQuery(dataSource);
List<User> users = mappingSqlQuery.execute(100, "test");
logger.debug(users);

使用SqlUpdate

這個類的使用方法和SqlQuery類似,但是由於它是一個具體類,因此不需要定義子類即可使用。下面是它的簡單使用方法。為了更新具體的資料(例如一個Java Bean物件),你也可以繼承該類,並提供自己的更新方法,就和上面一樣。

@Test
public void testSqlUpdate() {
    SqlUpdate sqlUpdate = new SqlUpdate(dataSource, "INSERT INTO user(name) VALUES(?)");
    sqlUpdate.declareParameter(new SqlParameter("name", Types.VARCHAR));
    sqlUpdate.compile();
    sqlUpdate.update("wang5");

    List<User> users = jdbcTemplate.query("SELECT id,name FROM user", new UserRowMapper());
    logger.debug(users);
}

使用StoredProcedure

StoredProcedure是關係資料庫中儲存過程概念的抽象類,提供了一組方便的受保護方法。因此在使用該類的時候需要我們建立一個子類,繼承該類。在使用這個類的時候我們需要使用setSql方法設定資料庫中儲存過程的名稱。在傳遞引數的時候,使用SqlParameter傳遞IN引數,使用SqlOutParameter傳遞OUT引數,使用SqlInOutParameter傳遞INOUT引數。

以下是Spring官方文件的一個例子。

class GetSysdateProcedure extends StoredProcedure {

    private static final String SQL = "sysdate";

    public GetSysdateProcedure(DataSource dataSource) {
        setDataSource(dataSource);
        setFunction(true);
        setSql(SQL);
        declareParameter(new SqlOutParameter("date", Types.DATE));
        compile();
    }

    public Date execute() {
        // the 'sysdate' sproc has no input parameters, so an empty Map is supplied...
        Map<String, Object> results = execute(new HashMap<String, Object>());
        Date sysdate = (Date) results.get("date");
        return sysdate;
    }
}

其他知識

提供SQL引數資訊

一般情況下Spring可以自行決定SQL引數的型別,但是有時候或者說最好由我們提供準確的SQL引數資訊。

  • JdbcTemplate的很多查詢和更新方法包含一個額外的引數,一個int陣列,該陣列應該是java.sql.Types指定的一些常量,表明SQL引數的型別。
  • 可以使用SqlParameterValue來設定引數的值,在建立該物件的時候提供引數的值和型別。
  • 如果使用具有命名引數功能的類時,使用SqlParameterSource類(BeanPropertySqlParameterSourceMapSqlParameterSource)來指定命名引數和其型別。

資料來源

我們在學習JDBC的時候,基本上都是從DriverManager類建立一個數據庫連線。在實際環境中,我們應該使用資料來源(DataSource)來建立資料庫連線。資料來源將建立資料庫的職責和應用程式碼分離,資料來源可以交給資料庫管理員來設定,程式設計師只需要獲取資料來源物件,然後開發相關程式碼。

在上面的例子中我們使用的是Apache的commons-dbcp2資料來源,Spring自己也實現了幾個資料來源方便我們開發和測試。

DriverManagerDataSource是一個簡單的資料來源,每次請求都會返回一個新的資料庫連線。它使用資料庫驅動來建立資料來源,就像我們使用DriverManager那樣。這是一個簡單的測試類,可以幫助我們在不借助任何Java EE容器的情況下獲取資料來源。但是由於使用commons-dbcp2這樣的成熟資料來源也很容易,所以其實我們只需要使用commons-dbcp2即可。

SingleConnectionDataSource也是一個數據源,它包裝了一個單獨的資料庫連線,在每次請求都會返回同一個資料庫連線物件。和DriverManagerDataSource相比它更輕量,因為沒有建立額外資料庫連線的開銷。

初始化資料來源

在建立資料來源的時候我們可以在Spring配置檔案中設定資料來源的初始化指令碼。

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="classpath:com/foo/sql/db-schema.sql"/>
    <jdbc:script location="classpath:com/foo/sql/db-test-data.sql"/>
</jdbc:initialize-database>

有時候我們希望在初始化資料的時候刪除上一次的測試資料。但是如果資料庫不支援類似DROP TABLE IF EXISTS這樣的語法,那麼我們就必須在初始化指令碼中新增一些DROP語句。這些刪除語句可能會失敗(如果沒有測試資料的情況下執行刪除),這時候就可以忽略刪除失敗。當初始化指令碼出現錯誤的時候就會丟擲異常,但是如果設定了忽略刪除失敗,Spring就會直接忽略這些失敗而不丟擲異常。ignore-failures屬性還可以取另外兩個值NONEALL,分別表示不忽略失敗和忽略所有失敗。

<jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
    <jdbc:script location="..."/>
</jdbc:initialize-database>

我們還可以設定初始化指令碼的間隔符。

<jdbc:initialize-database data-source="dataSource" separator="@@">
    <jdbc:script location="classpath:com/foo/sql/db-schema.sql" separator=";"/>
    <jdbc:script location="classpath:com/foo/sql/db-test-data-1.sql"/>
    <jdbc:script location="classpath:com/foo/sql/db-test-data-2.sql"/>
</jdbc:initialize-database>

工具類

org.springframework.jdbc.datasource.DataSourceUtils,這是一個方便的工具類,包含了一組和資料來源相關的工具方法。

org.springframework.jdbc.support.JdbcUtils類提供了一些方法來操作JDBC,在Spring內部使用,也可以用於自己的JDBC操作。

還有幾個工具類主要由Spring內部使用,這裡就不列舉了。

嵌入式資料庫支援

我們在開發資料庫應用的時候需要安裝某種型別的資料庫,比如MySQL等等。但是這樣就需要額外的專案依賴。這樣一個產品級的資料庫軟體動輒上G,安裝、測試都不方便。這時候我們可以使用嵌入式資料庫進行開發和測試。嵌入式資料庫具有佔用小、啟動快、配置簡單等特點,非常適合開發測試。而且由於嵌入式資料庫系統佔用低,在一些裝置上還可以直接作為儲存資料庫使用。例如輕量級嵌入式資料庫Sqlite,就安裝在每個安卓手機中,用於儲存資料。

在Spring中建立一個嵌入式資料庫,在XML中新增如下一段。這樣創建出來的資料庫可以直接作為javax.sql.DataSource型別的Spring Bean使用。最好設定generate-name="true"生成一個唯一名稱。預設情況下建立的是HSQL嵌入式資料庫。當然別忘了新增相應嵌入式資料庫的依賴項。

<jdbc:embedded-database id="dataSource" generate-name="true">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>

當然還可以以程式設計方式建立嵌入式資料庫。下面是上面等價的程式設計方式。

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .generateUniqueName(true)
            .setType(H2)
            .setScriptEncoding("UTF-8")
            .ignoreFailedDrops(true)
            .addScript("schema.sql")
            .addScripts("user_data.sql", "country_data.sql")
            .build();
    }
}

除了HSQL,Spring還支援H2和Derby兩種嵌入式資料庫(值得一提的是,現在的JDK分發包中附帶了一個Java DB資料庫,在安裝了JDK之後可以在JDK安裝目錄中看到db資料夾,這裡面存放的其實就是Derby資料庫)。要指定資料庫型別,在上面的XML片段中新增embedded-database屬性並設定HSQLH2Derby。如果使用程式設計方式,在EmbeddedDatabaseBuilder上呼叫setType(EmbeddedDatabaseType)方法,該方法的引數指定一個列舉,指定這三種類型。

上面的generate-name="true"或者generateUniqueName(true)挺重要的。如果不指定這個屬性。在多次呼叫嵌入式資料庫之後,可能會生成多個數據庫例項。為了避免這種情況發生,需要設定這個屬性。設定之後,如果已經存在了資料庫例項,就會使用這個已存在的例項,而不是設定新的例項。這個屬性是在Spring 4.2中增加的。使用以下幾個方法都可以設定該屬性。

  • EmbeddedDatabaseFactory.setGenerateUniqueDatabaseName()
  • EmbeddedDatabaseBuilder.generateUniqueName()
  • <jdbc:embedded-database generate-name="true" …​ >

參考資料

專案程式碼在Csdn程式碼庫,有興趣的同學可以看看。

最後祝大家新年快樂!

相關推薦

Spring學習筆記 Spring JDBC框架

Spring JDBC簡介 先來看看一個JDBC的例子。我們可以看到為了執行一條SQL語句,我們需要建立連線,建立語句物件,然後執行SQL,然後操縱結果集獲取資料。 try(Connection connection = DriverManager.ge

Spring學習筆記——Spring Scope(作用域)詳解

引言 在Spring學習筆記 —— 從IOC說起中,曾經提到過Spring中的Bean是根據Scope(作用域)來生成的,但是一直都沒有詳細解釋過,除了Singleton(單例)和prototype(原型)作用域之外,另外一種重要的作用域——使用者自定義

spring學習筆記——spring Hello world 普通java專案版 分析類的載入與裝配

上一篇展示了spring的web版hello world,本篇來一個普通java專案中運用spring的demo,裡面有對singleton與prototype的討論,可以很清晰的看到spring對實體的注入策略。 因為是個demo,後來看工廠後處理器以及bean前、bea

Spring學習筆記-Spring容器中的Bean

1.Spring容器中的Bean 從本質上來看Spring容器就是一個超級大工廠,Bean就是工廠的產品,能產生哪些產品是根據我們配置檔案的配置來的。對於我們開發者來說,使用Spring容器主要做兩件事:1,定義自己的Bean,2配置Bean。對於Spring

Spring學習筆記(五):Spring JDBC 框架及應用示例

JDBC 框架概述 在使用普通的 JDBC 資料庫時,就會很麻煩的寫不必要的程式碼來處理異常,開啟和關閉資料庫連線等。但 Spring JDBC 框架負責所有的低層細節,從開始開啟連線,準備和執行 SQL 語句,處理異常,處理事務,到最後關閉連線。 所以當從資料庫中獲取資

Spring Cloud學習筆記之Eureka框架的原理

Eureka 服務發現與註冊:我們在呼叫微服務的時候,如果我們的微服務部署了多份,我們應該如何去呼叫?這裡就涉及到了服務發現與註冊。服務發現就是程式如何通過一個標誌來獲取服務列表,並且這個服務列表是能夠隨著服務的狀態而動態變更的。 Spring Cloud提供了多種註冊中心的支援:如Eur

spring學習筆記(22)聲明式事務配置,readOnly無效寫無異常

lin top post 處理 ast cannot pro ever 也不會 在上一節內容中。我們使用了編程式方法來配置事務,這種優點是我們對每一個方法的控制性非常強。比方我須要用到什麽事務,在什麽位置假設出現異常須要回滾等。能夠進行非常細粒度的配置。

Spring學習筆記(一)

分布式 ransac 解析 工具 files 分布 工廠 根據 使用 Spring學習筆記(一) 因為最近在看《Spring 技術內幕-深入解析Spring 架構與設計原理》,相當於做了個筆記,以及把自己理解的東西記錄下來。 Spring整體架構圖 1.Spring子項目

Spring 學習筆記(五)—— Bean之間的關系、作用域、自動裝配

mar byname pps etc 有時 sysman 對象實例 構造 encoding 繼承   Spring提供了配置信息的繼承機制,可以通過為<bean>元素指定parent值重用已有的<bean>元素的配置信息。 <?xml

Spring 學習筆記(七)—— 切入點表達式

service string 出現 targe || 參數 public 例如 語法   為了能夠靈活定義切入點位置,Spring AOP提供了多種切入點指示符。 execution———用來匹配執行方法的連接點   

spring學習筆記(3)——bean配置細節註意

collect 1.5 之前 ice ble person name return 引用 1. 一個bean引用另外一個bean 當Person類中有一個屬性是Car,那麽該如何配置呢 person: package com.zj.spring; public class

Spring學習筆記之BeanDefinition

spring bean definition 在Spring容器中,Bean的實例以BeanDefinition來表示的。一個BeanDefinition描述了一個Bean實例。本文出自 “十裏稻花香” 博客,請務必保留此出處http://5880861.blog.51cto.com/587086

Spring學習筆記之BeanFactory

spring bean factory BeanFactory是一個頂級接口,下面看下它是幹什麽的。這裏說了,它是訪問Spring Bean容器的根接口,是Bean容器的基本視圖。它的一些子接口,比如ListableBeanFactory和ConfigurableBeanFactory都有特別的而

Spring學習筆記之ApplicationContext

spring application context 對於一個Application提供配置的核心接口,在應用運行的時候它是只讀的。一個ApplicationContext提供以下能力:1、可以通過BeanFactory中的方法訪問應用組件2、可以加載文件資源3、可以給已經註冊的監聽器發送事件4、

Spring學習筆記之啟動

spring 原理 啟動分析今天,以ClassPathXmlApplicationContext為例來看一下,Spring啟動的時候都做了什麽重點看refresh()方法refresh()方法是在AbstractApplicationContext類中定義的ClassPathXmlApplicationCo

spring學習筆記四:spring常用註解總結

bean logs single 配置文件 屬性註入 ring 如果 let ons 使用spring的註解,需要在配置文件中配置組件掃描器,用於在指定的包中掃描註解 <context:component-scan base-package="xxx.xxx.xxx

spring學習筆記(一) Spring概述

數據庫 spring容器 oot 基礎知識 spa 遠程 組合 主動 拓展 博主Spring學習筆記整理大部分內容來自Spring實戰(第四版)這本書. 強烈建議新手購入或者需要電子書的留言. 在學習Spring之前,我們要了解這麽幾個問題:什麽是Spring?Sprin

(來換項目系列)Spring學習筆記(2)

servlet span on() 購物車 集成 因此 proxy center str 3.1.1 配置profile bean 使用@profile 註解 例如 @Configuration @Profile("dev") public class xxxConfig{

Spring學習筆記(1)

作用域 構造器 上下文 實例 pojo bean 不同的 宋體 單例 激發pojo的潛能,不會讓pojo類繼承實現或導入與Spring API相關的任何東西 那麽spring怎麽裝配pojo呢-------->依賴註入(最大好處:松耦合) 耦合具有兩面性: 一方面

Spring Boot學習筆記——Spring Boot與Redis的集成

pac urn prope web property static 接口 per select 一.添加Redis緩存 1.添加Redis起步依賴 在pom.xml中添加Spring Boot支持Redis的依賴配置,具體如下: <dependency>