Spring Jdbc入门

来源:互联网 发布:java反射获得属性值 编辑:程序博客网 时间:2024/04/30 23:17

Spring Jdbc入门

从这一讲开始,需要用到数据库,你先要确保你有一个数据库可以供你测试,本章用到一个表叫做book, 建表语句:

create table letter(
  id varchar(20) primary key,
  name varchar(20),
  author varchar(20),
  price float
)

如果你忘记了jdbc , 这里有一个例子让你回忆起来。

[java] view plaincopyprint?
  1. Connection conn;  
  2. PreparedStatement ps;  
  3. try {  
  4.  conn = DriverManager.getConnection("url""username""password");  
  5.  conn.setAutoCommit(false);  
  6.  ps = conn.prepareStatement("insert into etl.book values(?,?,?,?)");  
  7.  ps.setString(1, book.getId());  
  8.  ps.setString(2, book.getName());  
  9.  ps.setString(3, book.getAuthor());  
  10.  ps.setFloat(4, book.getPrice());  
  11.  ps.execute();  
  12.  conn.commit();  
  13. catch (SQLException e) {  
  14.  conn.rollback();  
  15. }  

springjdbc 作了轻量级的包装,对数据库的全部操作都集中在JdbcTemplate 上面。如果你对template 比较陌生,你可以想象一下简历模板,它把大多数的框架性的通用的内容都准备好了, 你只需要填上你自己的特定的信息,一份简历就制作完毕了。JdbcTemplate 也是这样的,它把通用的功能都写好了,只留下特定的方法需要你去实现或拓展。我们先看一个例子,以便对JdbcTemplate 有一个大体的认识:

[java] view plaincopyprint?
  1. package dao;  
  2. import java.util.List;  
  3. import org.springframework.jdbc.core.JdbcTemplate;  
  4. import org.springframework.jdbc.datasource.DriverManagerDataSource;  
  5. public class TestJdbcTemplate {  
  6.  public static void main(String[] args) {  
  7.   JdbcTemplate template = new JdbcTemplate();  
  8.   //SQLServerDriver ddd;   
  9.   //JdbcTemplate需要一个DataSource  
  10.   DriverManagerDataSource ds = new DriverManagerDataSource();  
  11.   ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
  12.   ds.setUrl("jdbc:sqlserver://localhost:1433;selectmethod=cursor;");  
  13.   ds.setUsername("sa");  
  14.   ds.setPassword("123456");  
  15.   template.setDataSource(ds);  
  16.   //现在就可以调用template的方法操作数据库   
  17.   List list = template.queryForList("select * from book");  
  18.   System.out.println(list.size());  
  19.   template.update("insert into book (id, name, author, price) values(?,?,?,?)",   
  20.     new Object[]{"001234","Javascript bible","Jamse Sun",12.3});  
  21.  }  
  22. }  

为了后面的演示,我们先写一个BookDao 接口,规定一些应该实现的功能。

[java] view plaincopyprint?
  1. package dao;  
  2. import java.util.List;  
  3. import model.Book;  
  4. public interface BookDao {  
  5.     public List<Book> list();  
  6.     public Book findById(String id);  
  7.     public void insert(Book book);  
  8.     public void update(Book book);  
  9.     public void delete(String id);  
  10.     public void insert(List<Book> books);  
  11. }  

我们在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
[java] view plaincopyprint?
  1. package dao;  
  2. import java.sql.*;  
  3. import java.util.List;  
  4. import org.springframework.jdbc.core.BatchPreparedStatementSetter;  
  5. import org.springframework.jdbc.core.RowMapper;  
  6. import org.springframework.jdbc.core.support.JdbcDaoSupport;  
  7. import model.Book;  
  8. public class BookJdbcDao extends JdbcDaoSupport implements BookDao{  
  9.  public class BookRowMapper implements RowMapper{  
  10.   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {  
  11.    Book book = new Book();  
  12.    book.setId(rs.getString("id"));  
  13.    book.setName(rs.getString("name"));  
  14.    book.setAuthor(rs.getString("author"));  
  15.    book.setPrice(rs.getFloat("price"));  
  16.    return book;  
  17.   }  
  18.  }  
  19.  public List<Book> list() {  
  20.   String sql = "select * from book";  
  21.   return getJdbcTemplate().query(sql, new BookRowMapper());  
  22.  }  
  23.  public Book findById(String id) {  
  24.   String sql = "select * from book where id=?";  
  25.   return (Book) getJdbcTemplate().queryForObject(sql, new Object[]{}, new BookRowMapper());  
  26.  }  
  27.  public void insert(Book book){  
  28.   String sql = "insert into book (id, name, author, price) values(?,?,?,?)";  
  29.   Object[] args = new Object[]{book.getId(),book.getName(),book.getAuthor(),book.getPrice()};  
  30.   getJdbcTemplate().update(sql, args);  
  31.  }  
  32.  public void update(Book book) {  
  33.   String sql = "update book set name=?, author=?, price=? where id=?";  
  34.   Object[] args = new Object[]{book.getName(),book.getAuthor(),book.getPrice(),book.getId()};  
  35.   getJdbcTemplate().update(sql, args);  
  36.  }  
  37.  public void delete(String id) {  
  38.   String sql = "delete from book where id=?";  
  39.   Object[] args = new Object[]{id};  
  40.   getJdbcTemplate().update(sql, args);  
  41.  }  
  42.  //因为batchUpdate要使用一个实现了BatchPreparedStatementSetter的对象,本例中采用内部类,  
  43.  //方法体中的内部类不能访问非final成员,所以把参数变成final.  
  44.  public void insert(final List<Book> books) {  
  45.   String sql = "insert into book (id, name, author, price) values(?,?,?,?)";  
  46.   getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter(){  
  47.    public void setValues(PreparedStatement ps, int i) throws SQLException {  
  48.     Book book = books.get(i);  
  49.     ps.setString(1, book.getId());  
  50.     ps.setString(2, book.getName());  
  51.     ps.setString(3, book.getAuthor());  
  52.     ps.setFloat(4, book.getPrice());  
  53.    }  
  54.    public int getBatchSize() {  
  55.     return books.size();  
  56.    }});  
  57.  }  
  58. }  

你会注意到,里面用到了一个内部类BookRowMapper implements RowMapper ,这个类的作用就是把结果集映射成java对象.因为考虑到这个Mapper 只有dao用得到, 所以定义为内部类.现在来做一些配置工作,因为JdbcDaoSupport 需要JdbcTemplate ,JdbcTemplate 需要dataSource ,所以要配置dataSource ,JdbcTemplate , 还有刚写的dao .dataSource 的配置我们前面讲过了,我还是把它贴出来,我使用了占位符.

[xhtml] view plaincopyprint?
  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
  2.  <property name="driverClassName" value="${jdbc.driverClassName}" />  
  3.  <property name="url" value="${jdbc.url}" />  
  4.  <property name="username" value="${jdbc.username}"/>  
  5.  <property name="password" value="${jdbc.password}"/>  
  6. </bean>  
  7. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  8.  <property name="dataSource" ref="dataSource"/>  
  9. </bean>  
  10. <bean id="bookDao" class="dao.BookJdbcDao">  
  11.  <property name="jdbcTemplate" ref="jdbcTemplate"/>  
  12. </bean>  

测试:

[java] view plaincopyprint?
  1. public class Test {  
  2.  public static void main(String[] args) throws InterruptedException, SQLException{  
  3.   ApplicationContext c = new ClassPathXmlApplicationContext("spring-test.xml");  
  4.   BookDao dao = (BookDao)c.getBean("bookDao");  
  5.   List<Book> list = dao.list();  
  6.   for(Book b: list){  
  7.    System.out.println(b.toString());  
  8.   }  
  9.   Book book = new Book("321","xxx""www"123.4F);  
  10.   Book book1 = new Book("000001","xxx""www"123.4F);  
  11.   dao.insert(book);  
  12.   //测试批量更新   
  13.   dao.update(book1);  
  14.   List<Book> books = new ArrayList<Book>();  
  15.   books.add(new Book("200","ww1","author1"122));  
  16.   books.add(new Book("201","ww2","author2"122));  
  17.   books.add(new Book("202","ww3","author3"122));  
  18.   books.add(new Book("203","ww4","author4"122));  
  19.   books.add(new Book("204","ww5","author5"122));  
  20.   dao.insert(books);  
  21. }}  

关于spring jdbc 还有一些内容,比如处理blob, 自增主键, SimpleJdbcTemplate ,NameParamterJdbcTemplate ,它们学习起来应该不难, 就不一一介绍了.

原创粉丝点击