1、Spring JDBC 概述
Spring 提供了一個強有力的模板類JdbcTemplate簡化JDBC操做,DataSource,JdbcTemplate均可以以Bean的方式定義在想xml配置文件,JdbcTemplate建立只需注入一個DataSource,應用程序Dao層只須要繼承JdbcDaoSupport, 或者注入JdbcTemplate,即可以獲取JdbcTemplate,JdbcTemplate是一個線程安全的類,多個Dao能夠注入一個JdbcTemplate;
<!-- Oracle數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@oracle.devcake.co.uk:1521:INTL"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- set注入方式獲取jdbcTemplate -->
<bean id="customerDao" class="JdbcCustomerDao" >
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<!-- 注入dataSource,customerDao經過繼承JdbcDaoSupport ,使用this.getJdbcTemplate()獲取JdbcTemplate -->
<bean id="customerDao" class="JdbcCustomerDao" >
<property name="dataSource" ref="dataSource"/>
</bean>
而後將jdbcTemplate對象注入自定義的Dao、或者繼承JdbcDaoSupport,例如:
public class JdbcCustomerDao extends JdbcDaoSupport implements CustomerDao {
}
public class JdbcCustomerDao implements CustomerDao {
private JdbcTemplate jdbcTemplate
public void setJdbcTemplate()JdbcTemplate jdbcTemplate{
this.jdbcTemplate=jdbcTemplate
}
}
2、 JdbcTemplate 提供如下主要方法簡化JDBC操做:
2.一、List query(String sql,Ojbect[] args,RowMapper rowMapper)
說明:經常使用的查詢,sql待執行的sql語句,args是sql語句的參數,rowMapper負責將每一行記錄轉化爲java對象存放在list,並最終返回,例如:
public List<Book> queryByAuthor(String author) {
String sql = "select * from book where author=?";
Collection c = getJdoTemplate().find(sql,
new Object[] { author },new BookRowMapper());
List<Book> books = new ArrayList<Book>();
books.addAll(c);
return books;
}
class BookRowMapper implements RowMapper{
public Object mapRow(ResultSet res, int index) throws SQLException {
Book book = new Book();
book.setId(rs.getInt("id"));
//省略set
return book;
}
}
更新、刪除、其餘查詢操做相似,舉例以下,詳細細節請參考spring api:
//返回值爲一個長整形
public long getAverageAge() {
return getJdbcTemplate().queryForLong("SELECT AVG(age) FROM employee");
}
//返回一個整數
public int getTotalNumberOfEmployees() {
return getJdbcTemplate().queryForInt("SELECT COUNT(0) FROM employees");
}
//更新操做
this.jdbcTemplate.update(
"insert into t_actor (first_name, surname) values (?, ?)",
new Object[] {"Leonor", "Watling"});
2.二、spring 2.5新功能,另類的jdbc ORM:BeanPropertyRowMapper
上面咱們檢索時必須實現RowMapper,將結果集轉化爲java對象。Spring2.5 簡化了這一操做,使得咱們沒必要再實現RowMapper,實現此功能的倆個神奇東東即是:ParameterizedRowMapper,ParameterizedBeanPropertyRowMapper,貌似經過java反射機制實現了將resultset字段映射到java對象,可是數據表的列必須和java對象的屬性對應,沒有研究源碼,有點相似於apache 的BeanUtil,不知爲什麼這部分在spring開發參考手冊沒有,難道不是經典。
//使用ParameterizedBeanPropertyRowMapper
@SuppressWarnings({"unchecked"})
public List<Customer> getAll() {
return getJdbcTemplate().query("select * from t_customer", ParameterizedBeanPropertyRowMapper.newInstance(Customer.class));
}
//使用BeanPropertyRowMapper
@SuppressWarnings({"unchecked"})
public List<Customer> getAll() {
return getJdbcTemplate().query("select * from t_customer", new BeanPropertyRowMapper(Customer.class));
}
注意:ParameterizedBeanPropertyRowMapper是BeanPropertyRowMapper子類。另外表的字段名稱必須和實體類的成員變量名稱一致;
2.三、spring之JDBC批量操做
jdbcTemplate.batchUpdate(final String[] sql) ,API解釋:Issue multiple SQL updates on a single JDBC Statement using batching,翻譯過來大體爲:解決多個sql的插入、更新、刪除操做在一個Statement中。性能通常。
jdbcTemplate.batchUpdate(String sql, final BatchPreparedStatementSetter pss),相似於JDBC的PreparedStatement,性能較上着有所提升。
咱們舉例說明如何使用,示例以下:
final int count = 2000;
final List<String> firstNames = new ArrayList<String>(count);
final List<String> lastNames = new ArrayList<String>(count);
for (int i = 0; i < count; i++) {
firstNames.add("First Name " + i);
lastNames.add("Last Name " + i);
}
jdbcTemplate.batchUpdate(
"insert into customer (id, first_name, last_name, last_login, comments) values (?, ?, ?, ?, ?)",
new BatchPreparedStatementSetter() {
//爲prepared statement設置參數。這個方法將在整個過程當中被調用的次數
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setLong(1, i + 10);
ps.setString(2, firstNames.get(i));
ps.setString(3, lastNames.get(i));
ps.setNull(4, Types.TIMESTAMP);
ps.setNull(5, Types.CLOB);
}
//返回更新的結果集條數
public int getBatchSize() {
return count;
}
});
}
BatchSqlUpdate類是SqlUpdate 的子類,適用於插入、刪除、更新批量操做,內部使用PreparedStatement,因此效率很高,批量語句達到設定的batchSize,或者手動調用flush纔會執行批量操做。注意:此類是非線程安全的,必須爲每一個使用者建立一個實例,或者在同一個線程中使用前調用reset。
下面咱們舉例說明如何使用BatchSqlUpdate,來執行批量操做。示例以下:
class BatchInsert extends BatchSqlUpdate {
private static final String SQL = "insert into t_customer (id, first_name, last_name, last_login, "
+ "comments) values (?, ?, ?, ?, null)";
BatchInsert(DataSource dataSource) {
super(dataSource, SQL);
declareParameter(new SqlParameter(Types.INTEGER));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.TIMESTAMP));
setBatchSize(10);
}
}
int count = 5000;
for (int i = 0; i < count; i++) {
batchInsert.update(new Object[] { i + 100L, "a" + i, "b" + i, null });
}
獲取【下載地址】 java後臺框架 springmvc mybatis(oracle 和 mysql) HTML5 全新高大尚java