使用Spring JDBC包装基本的CRUD操作

想起来Spring的JDBC还不错,就拿起来研究了一下,顺便也写了个小例子,希望对初学者有点用处

主要注意以下几点:
1. 对于一些特定的小项目中,很多的工作量都在增删改上,而这些代码当然是惊人地相似,所以对5个简单的
方法抽象了一下,以达到共用的目的
2. 主要文件:applicationContext.xml, BaseDAO.java, BaseDAOImp.java, DAORowMapper.java
3. 在BaseDAOImp.java里有一个Main方法可以做测试
4. DB中只要一个表,表名:users, 三个列:id(int,主键),name(varchar), email(varchar)

这只是一个初稿,后面再做修改再与大家分享

applicationContext.xml

代码




  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  

  3.   

  4. <beans>  

  5.     <bean id="userDAO" class="com.xxxxx.dao.BaseDAOImp" singleton="false">  

  6.         <property name="jdbcTemplate">  

  7.             <ref bean="jdbcTemplate" />  

  8.         </property>  

  9.         <property name="tableName" value="users"></property>  

  10.         <property name="objectClass" value="com.xxxxx.admin.vo.UserVO"></property>  

  11.         <property name="keyColumn" value="id"></property>  

  12.     </bean>  

  13.   

  14.     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  

  15.         <constructor-arg>  

  16.             <ref bean="datasource" />  

  17.         </constructor-arg>  

  18.     </bean>  

  19.     <bean id="datasource"    

  20.   

  21. class="org.springframework.jdbc.datasource.DriverManagerDataSource">  

  22.         <property name="driverClassName"    

  23. value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />  

  24.         <property name="url" value="jdbc:sqlserver://localhost;databaseName=testdb" />  

  25.         <property name="username" value="sa" />  

  26.         <property name="password" value="admin" />  

  27.     </bean>  

  28. </beans>  





BaseDAO.java


代码




  1. package com.xxxxx.dao;   

  2.   

  3. import java.util.List;   

  4.   

  5. public interface BaseDAO {   

  6.     public int insert(Object obj);   

  7.     public int update(Object obj);   

  8.     public int delete(Object id);   

  9.     public Object findByID(Object id);   

  10.     public List findAll();   

  11. }   






BaseDAOImp.java

代码




  1. package com.xxxxx.dao;   

  2.   

  3. import java.util.List;   

  4.   

  5. import org.springframework***ans.factory.xml.XmlBeanFactory;   

  6. import org.springframework.core.io.ClassPathResource;   

  7. import org.springframework.jdbc.core.JdbcTemplate;   

  8.   

  9. import com.xxxxx.admin.vo.UserVO;   

  10. import com.xxxxx.common.utils.SQLUtils;   

  11.   

  12. public class BaseDAOImp implements BaseDAO {   

  13.     private JdbcTemplate jdbcTemplate;   

  14.     private String tableName;   

  15.     private Class objectClass;   

  16.     private String keyColumn;   

  17.        

  18.     public void setKeyColumn(String keyColumn) {   

  19.         this.keyColumn = keyColumn;   

  20.     }   

  21.   

  22.     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {   

  23.         this.jdbcTemplate = jdbcTemplate;   

  24.     }   

  25.   

  26.     public void setObjectClass(Class objectClass) {   

  27.         this.objectClass = objectClass;   

  28.     }   

  29.   

  30.     public void setTableName(String tableName) {   

  31.         this.tableName = tableName;   

  32.     }   

  33.   

  34.     public int delete(Object id) {   

  35.         String sql = "delete from " + tableName + " where "+keyColumn+"=?";   

  36.         return jdbcTemplate.update(sql, new Object[]{id});   

  37.     }   

  38.   

  39.     public List findAll() {   

  40.         String sql = "select * from " + tableName;   

  41.         return jdbcTemplate.query(sql, new DAORowMapper(objectClass));   

  42.     }   

  43.   

  44.     public Object findByID(Object id) {   

  45.         String sql = "select * from " + tableName + " where " + keyColumn + "=?";   

  46.         return jdbcTemplate.queryForObject(sql, new Object[]{id}, new DAORowMapper   

  47.   

  48. (objectClass));   

  49.     }   

  50.   

  51.     /*  

  52.      * 这里用的Database的主键自增策略,如果想自己实现可以去看看Hibernate的主键生成方法  

  53.      * 其实简单一点可以在server起来的时候定义一个存放主键的Map,然后让这些主键值递增就可以了  


  54.  

  55.      * 只是要注意一下并发问题  

  56.      */  

  57.     public int insert(Object obj) {   

  58.         Object[] sqlAndParams = SQLUtils.generateInsert(obj, tableName);   

  59.         return jdbcTemplate.update((String)sqlAndParams[0], (Object[])sqlAndParams[1]);   

  60.     }   

  61.   

  62.     public int update(Object obj) {   

  63.         Object[] sqlAndParams = SQLUtils.generateUpdate(obj, tableName, keyColumn);   

  64.         return jdbcTemplate.update((String)sqlAndParams[0], (Object[])sqlAndParams[1]);   

  65.     }   

  66.            

  67.     public static void main(String[] args){   

  68.         // init factory:   

  69.         XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource   

  70.   

  71. ("applicationContext.xml"));   

  72.   

  73.         BaseDAO userDAO = (BaseDAO)factory.getBean("userDAO");   

  74.         // find all   

  75.         List list = userDAO.findAll();   

  76.         System.out.println("user count: "+list.size());   

  77.         // find by id   

  78.         UserVO userVO = (UserVO)userDAO.findByID(new Integer(2));   

  79.         System.out.println("Ginger's Email: "+userVO.getEmail());   

  80.         // insert   

  81.         userVO = new UserVO();   

  82.         userVO.setName("tester1");   

  83.         userVO.setEmail("tester@gmail.com");   

  84.         Object insertResult = userDAO.insert(userVO);   

  85.         System.out.println("insert returned: "+insertResult);   

  86.         //update   

  87.         userVO = new UserVO();   

  88.         userVO.setId(new Integer(3));   

  89.         userVO.setName("tester33");   

  90.         userVO.setEmail("tester33@gmail.com");   

  91.         Object updateResult = userDAO.update(userVO);   

  92.         System.out.println("update returned: "+updateResult);   

  93.         //delete   

  94.         Object deleteResult = userDAO.delete(new Integer(4));   

  95.         System.out.println("delete returned: "+deleteResult);   

  96.     }   

  97. }   






DAORowMapper.java

代码


  1. package com.xxxxx.dao;   

  2.   

  3. import java.sql.ResultSet;   

  4. import java.sql.SQLException;   

  5.   

  6. import org.springframework.jdbc.core.RowMapper;   

  7. import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSetMetaData;   

  8.   

  9. import com.xxxxx.common.utils.ReflectionUtils;   

  10.   

  11. public class DAORowMapper implements RowMapper {   

  12.     private Class rowObjectClass;   

  13.        

  14.     public DAORowMapper(Class rowObjectClass){   

  15.         this.rowObjectClass = rowObjectClass;   

  16.     }   

  17.        

  18.     public Object mapRow(ResultSet rs, int index) throws SQLException {   

  19.         Object object;   

  20.         try {   

  21.             object = rowObjectClass.newInstance();   

  22.         } catch (Exception e) {   

  23.             throw new RuntimeException(e);   

  24.         }   

  25.            

  26.         ResultSetWrappingSqlRowSetMetaData wapping = new    

  27.   

  28. ResultSetWrappingSqlRowSetMetaData(rs.getMetaData());   

  29.         for(int i=1;i<=wapping.getColumnCount();i++){   

  30.             String name = wapping.getColumnName(i);   

  31.             Object value = rs.getObject(i);   

  32.             ReflectionUtils.setFieldVlaue(object, name, value);   

  33.         }   

  34.   

  35.         return object;   

  36.     }   

  37.   

  38. }

AddThis Social Bookmark Button

相关文档(Relevant Entries)
Spring 的微内核与FactoryBean扩展机制
Spring+Hibernate 复杂查询分页
Spring+hibernate分页查询
hibernate+spring的一个简单分页实现
一个关于spring+hibernate的例子
Secrets of lightweight development success, Part 3: The emergence of Spring
Secrets of lightweight development success, Part 2: How to lighten up your containers
Secrets of lightweight development success, Part 1: Core principles and philosophies
Posted on April 13, 2007 3:40 PM | | | | TrackBacks (0)

引用地址(TRACKBACKS)
 
TrackBack URL for this entry:
http://www.wujianrong.com/mt-tb.cgi/5013

发布评论(ADD YOUR COMMENTS)
 
感谢您参与评论;发表您的意见时请保持文章的相关性;不相关的或是单纯宣传的内容可能会被删掉。您的E-mail只是用来确认您发表的文章,不会出现在网页上。
Please keep your comments relevant to this blog entry. Email addresses are never displayed, but they are required to confirm your comments.

称呼(Name):      记住我的个人信息(Remember)
邮箱(Email):
网址(URL):
评论(Add your comments):

相关内容