从这一讲开始,需要用到数据库,你先要确保你有一个数据库可以供你测试,本章用到一个表叫做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的文章.