從這一講開始,需要用到資料庫,你先要確保你有一個資料庫可以供你測試,本章用到一個表叫做book, 建表語句:
create table letter(
id varchar(20) primary key,
name varchar(20),
author varchar(20),
price float
)
如果你忘記了jdbc, 這裡有一個例子讓你回憶起來。
Connection conn;PreparedStatement ps;try { conn = DriverManager.getConnection("url", "username", "password"); conn.setAutoCommit(false); ps = conn.prepareStatement("insert into etl.book values(?,?,?,?)"); ps.setString(1, book.getId()); ps.setString(2, book.getName()); ps.setString(3, book.getAuthor()); ps.setFloat(4, book.getPrice()); ps.execute(); conn.commit();} catch (SQLException e) { conn.rollback();}
spring對jdbc作了輕量級的封裝,對資料庫的全部操作都集中在JdbcTemplate上面。如果你對template比較陌生,你可以想象一下簡曆模板,它把大多數的架構性的通用的內容都準備好了, 你只需要填上你自己的特定的資訊,一份簡曆就製作完畢了。JdbcTemplate也是這樣的,它把通用的功能都寫好了,只留下特定的方法需要你去實現或拓展。我們先看一個例子,以便對JdbcTemplate有一個大體的認識:
package dao;import java.util.List;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.datasource.DriverManagerDataSource;public class TestJdbcTemplate { public static void main(String[] args) { JdbcTemplate template = new JdbcTemplate(); //SQLServerDriver ddd; //JdbcTemplate需要一個DataSource DriverManagerDataSource ds = new DriverManagerDataSource(); ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ds.setUrl("jdbc:sqlserver://localhost:1433;selectmethod=cursor;"); ds.setUsername("sa"); ds.setPassword("123456"); template.setDataSource(ds); //現在就可以調用template的方法操作資料庫 List list = template.queryForList("select * from book"); System.out.println(list.size()); template.update("insert into book (id, name, author, price) values(?,?,?,?)", new Object[]{"001234","Javascript bible","Jamse Sun",12.3}); }}
為了後面的示範,我們先寫一個BookDao介面,規定一些應該實現的功能。
package dao;import java.util.List;import model.Book;public interface BookDao {public List<Book> list();public Book findById(String id);public void insert(Book book);public void update(Book book);public void delete(String id);public void insert(List<Book> books);}
我們在dao程式中可以直接使用JdbcTemplate,但是更簡單的方法是dao直接繼承自JdbcDaoSupport,因為JdbcDaoSupport裡麵包含一個JdbcTemplat執行個體,看一下用JdbcDaoSupport該怎麼寫DAO,本例中除了普通的crud,還用到了batchUpdate,一次可以插入或跟新多條記錄,如果你沒有使用過jdbc的batchUpdate, 建議你先看看它是怎麼工作的,它能夠大大的提高效能.我有一篇blog介紹了jdbc的batchUpdate.建議你去看一看.http://blog.csdn.net/sunxing007/archive/2009/06/03/4240301.aspx
package dao;import java.sql.*;import java.util.List;import org.springframework.jdbc.core.BatchPreparedStatementSetter;import org.springframework.jdbc.core.RowMapper;import org.springframework.jdbc.core.support.JdbcDaoSupport;import model.Book;public class BookJdbcDao extends JdbcDaoSupport implements BookDao{ public class BookRowMapper implements RowMapper{ public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Book book = new Book(); book.setId(rs.getString("id")); book.setName(rs.getString("name")); book.setAuthor(rs.getString("author")); book.setPrice(rs.getFloat("price")); return book; } } public List<Book> list() { String sql = "select * from book"; return getJdbcTemplate().query(sql, new BookRowMapper()); } public Book findById(String id) { String sql = "select * from book where id=?"; return (Book) getJdbcTemplate().queryForObject(sql, new Object[]{}, new BookRowMapper()); } public void insert(Book book){ String sql = "insert into book (id, name, author, price) values(?,?,?,?)"; Object[] args = new Object[]{book.getId(),book.getName(),book.getAuthor(),book.getPrice()}; getJdbcTemplate().update(sql, args); } public void update(Book book) { String sql = "update book set name=?, author=?, price=? where id=?"; Object[] args = new Object[]{book.getName(),book.getAuthor(),book.getPrice(),book.getId()}; getJdbcTemplate().update(sql, args); } public void delete(String id) { String sql = "delete from book where id=?"; Object[] args = new Object[]{id}; getJdbcTemplate().update(sql, args); } //因為batchUpdate要使用一個實現了BatchPreparedStatementSetter的對象,本例中採用內部類, //方法體中的內部類不能訪問非final成員,所以把參數變成final. public void insert(final List<Book> books) { String sql = "insert into book (id, name, author, price) values(?,?,?,?)"; getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter(){ public void setValues(PreparedStatement ps, int i) throws SQLException { Book book = books.get(i); ps.setString(1, book.getId()); ps.setString(2, book.getName()); ps.setString(3, book.getAuthor()); ps.setFloat(4, book.getPrice()); } public int getBatchSize() { return books.size(); }}); }}
你會注意到,裡面用到了一個內部類BookRowMapper implements RowMapper,這個類的作用就是把結果集映射成java對象.因為考慮到這個Mapper只有dao用得到, 所以定義為內部類.現在來做一些配置工作,因為JdbcDaoSupport需要JdbcTemplate,JdbcTemplate需要dataSource,所以要配置dataSource, JdbcTemplate, 還有剛寫的dao. dataSource的配置我們前面講過了,我還是把它貼出來,我使用了預留位置.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <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"> <property name="dataSource" ref="dataSource"/></bean><bean id="bookDao" class="dao.BookJdbcDao"> <property name="jdbcTemplate" ref="jdbcTemplate"/></bean>
測試:
public class Test { public static void main(String[] args) throws InterruptedException, SQLException{ ApplicationContext c = new ClassPathXmlApplicationContext("spring-test.xml"); BookDao dao = (BookDao)c.getBean("bookDao"); List<Book> list = dao.list(); for(Book b: list){ System.out.println(b.toString()); } Book book = new Book("321","xxx", "www", 123.4F); Book book1 = new Book("000001","xxx", "www", 123.4F); dao.insert(book); //測試批次更新 dao.update(book1); List<Book> books = new ArrayList<Book>(); books.add(new Book("200","ww1","author1", 122)); books.add(new Book("201","ww2","author2", 122)); books.add(new Book("202","ww3","author3", 122)); books.add(new Book("203","ww4","author4", 122)); books.add(new Book("204","ww5","author5", 122)); dao.insert(books);}}
關於spring jdbc還有一些內容,比如處理blob, 自增主鍵, SimpleJdbcTemplate,NameParamterJdbcTemplate,它們學習起來應該不難, 就不一一介紹了.
緊接著本文, 話題突然轉入了Hibernate, 這是因為我寫到這裡之後, 開始了Hibernate的項目, 就順手寫了hibernate的適用心得. 剩餘的spring的話題會接著Hibernate來. 您可以點擊:http://blog.csdn.net/sunxing007/article/category/534073 來查看所有的有關SpringFramework的文章.