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 , 这里有一个例子让你回忆起来。
- 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 ,它们学习起来应该不难, 就不一一介绍了.
- Spring Jdbc入门
- Spring Jdbc入门
- Spring JDBC入门
- Spring JDBC 使用入门(1)
- Spring入门第3天--JDBC Template开发入门
- spring学习笔记 (五)Spring&Jdbc整合入门
- Spring 入门案例(含IOC、AOP、SpringMVC、Spring JDBC)
- Spring学习-23:Spring中的JDBC Template(JDBC模板)快速入门
- JDBC 入门
- JDBC 入门
- JDBC入门
- JDBC入门
- JDBC入门
- JDBC入门
- JDBC入门
- JDBC入门
- JDBC入门
- JDBC入门
- ANDROID平台移应该做的两步工作
- Struts2+Spring 整合成功测试案例----利用Dojo实现简单的Ajax的效果(一) .
- 单子(Singleton)设计模式
- Android的多线程
- 数据库备份文件自动压缩脚本
- Spring Jdbc入门
- C# 中的委托和事件
- 802.11n无线局域网设计最佳实践
- 金山快盘使用的一些注意
- 分而治之:架构与管理的异曲同工之妙
- Android教程----Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)!
- Java 获取字符串中第N次出现的字符位置
- 本地配置二级域名,url静态重写
- SQL2005压缩清除日志