key words:Spring,jdbcTemplate
注:因為Spring是以后的一個趨勢,Hibernate的集成已經很好了,對于單獨的jdbc的操作用DBUtils感覺已經沒有什么必要,不如全部轉到Spring的jdbc支持,從成本來考慮似乎更合適。
本文轉自 這里
前言:
本文指在介紹
Spring
框架中的
JdbcTemplate
類的使用方法,涉及基本的
Spring
反轉控制的使用方法和
JDBC
的基本概念。目標是使讀者能夠對
JdbcTemplate
快速地掌握和使用。
??????
準備:
1. Spring
的基本概念
?????? Spring
框架核心的思想就是建立一個
Java
對象的大工廠,用戶只要給工廠一個指令,工廠就能將用戶需要的對象根據配置文件組裝好返還給用戶。用戶需要做的許多工作則可以寫成簡單的配置文件。
?????? 2.
丑陋的
JDBC
代碼
Connection con= null;
PreparedStatement pStmt=null;
ResultSet rs = null;
try{??????????
??????????? con = ods.getConnection();
??????????? String sql = "select * from admin";
??????????? pStmt=con.prepareStatement(sql);???????????
??????????? rs=pStmt.executeQuery();
??????????? while(rs.next())
??????????? {??????????? }
}
catch(Exception ex) {
try{
???????? con.rollback();
??? }catch(SQLException sqlex){
????????? sqlex.printStackTrace(System.out);
???? }
???? ex.printStackTrace();
}finally{
?? try{
??????????? rs.close();
??????????? pStmt.close();
??????????? con.close();
?? }catch(Exception e){e.printStackTrace();}
}
|
??????
以上是常見的
JDBC
代碼,簡單的
select
語句也需要冗長的出錯處理,并且每個函數都不斷地重復同樣的代碼。
?????? 3. JdbcTemplate
的作用
?????? JdbcTemplate
正是為了減少上述繁瑣的代碼而設計出來的。它是對
JDBC
的一種封裝,抽象我們常用的一些方法。
Simple and Stupid
就是它的目標。下面是完成了剛才
JDBC
代碼同樣功能的
JdbcTemplate
的代碼:
String sql = "select * from admin";
jdbcTemplate.query(sql,new RowCallbackHandler() {
???????? public void processRow(ResultSet rs) throws SQLException {???
??????????????? }
??????????? } ); |
??????
環境搭建:
1.
數據庫的配置
??????
本文使用
Oracle
數據庫,新建表
admin
:
create
table admin ( |
?????? 2. Spring
配置
?????? JdbcTemplate
的使用需要有
DataSource
的支持,所以在配置文件中,我們首先要配置一個
OracleDataSource
,然后在將這個
DataSource
配置到
JdbcTemplate
里。接著將
JdbcTemplate
配置進
DAO
層,最后將
DAO
配置進
Model
層。簡要的關系如下:
??????
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
??? "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
??? <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource">
??????? <property name="URL">
??????????? <value>jdbc:oracle:thin:root/123@localhost:1521/XE</value>
??????? </property>
??? </bean>
???
??? <bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
??????? <property name="dataSource"><ref bean="dataSource"/></property>
??? </bean>
??? <bean id="userDAO" class="DAO.Imp.UserDAOImp">
??????? <property name="jdbcTemplate">
<ref bean="jdbcTemplate" />
</property>
??? </bean>
???
??? <bean id="user" class="Model.User">
??????? <property name="dao"><ref bean="userDAO"/></property>
??? </bean>
</beans> |
?????? 3.
環境配置,
如圖:
??????
使用方法:
1.??????
查找
多行查詢:
class UserRowMapper implements RowMapper
{
???????
public Object mapRow(ResultSet rs,int index) throws SQLException
??????? {
??????????? User u = new User();
??????????? u.setId(rs.getString("ID"));
??????????? u.setName(rs.getString("Name"));
??????????? u.setPassword(rs.getString("Password"));
??????????? return u;
??????? }
??? }
public List select(String where)
??? {
??????? List list;???????
??????? String sql = "select * from admin "+where;???????
??????? list = jdbcTemplate.query(sql,new RowMapperResultReader(new UserRowMapper()));
??????? return list;
??? }
|
List
最終返回的是滿足條件的
User
隊列。
單行查詢:
public User selectById(String id){
???
String sql = "select * from admin where id=?";
???
final User u = new User();
???
final Object[] params = new Object[] {id};
???
jdbcTemplate.query(sql, params, new RowCallbackHandler(){
???
??????????????????? public void processRow(ResultSet rs) throws SQLException {
???
???????????????????????????? u.setId(rs.getString("ID"));
???
???????????????????????????? u.setName(rs.getString("NAME"));
???
???????????????????????????? u.setPassword(rs.getString("PASSWORD"));
???
??????????????????? }??? ?????????????????
???
});??? ?????
???
return u;
}
|
2.??????
插入
public void insert(User u)
{
???? String sql = "insert into admin (ID,NAME,PASSWORD) values (admin_id_seq.nextval,?,?)";
???? Object[] params = new Object[] {
???????????????????????????
???????
??????????? u.getName(),
???????????????????????????
???????
??????????? u.getPassword() };
???? jdbcTemplate.update(sql,params);
?} |
admin_id_seq.nextval
為
Oracle
設置好的序列,問號“
?
”被
params
里的數據依次替代,最終執行
sql
。
3.??????
修改
非常簡單:
public void update(String how)
{
??????? jdbcTemplate.update(how);
??? } |
源代碼:
User.class:
package Model;
import java.util.List;
import DAO.UserDAO;
/**
?*? Model
層
?*
?*
?* @author
李嘉陵
?* @since 2006-4-30 12:10:30
?* @version
?**/
public class User {
??? private String name;
??? private String id;
??? private String password;
??? private UserDAO dao;
???
??? public User()
??? {
???
??
??? }
???
??? public User(String name, String password)
??? {
???
?? this.name = name;
???
?? this.password = password;
??? }
???
??? public void setDao(UserDAO dao)
??? {
??????? this.dao = dao;
??? }
??? public String getId() {
??????? return id;
??? }
???
??? public void setId(String id) {
??????? this.id = id;
??? }
???
??? public String getName() {
??????? return name;
??? }
???
??? public void setName(String name) {
??????? this.name = name;
??? }
???
??? public String getPassword() {
??????? return password;
??? }
???
??? public void setPassword(String password) {
??????? this.password = password;
??? }
???
??? public void getInfo(String id)
??? {
??????? List list = dao.select("where id="+id);
??????? User u = (User) list.get(0);
???????
??????? this.id=id;
??????? this.name = u.getName();
??????? this.password = u.getPassword();
???????
??? }
???
??? public void insert()
??? {
??????? dao.insert(this);
??? }
???
??? public void update(String how)
??? {
??????? dao.update(how);
??? }
???
??? public void update()
??? {
??????? dao.update("update admin set name='"+name+"', password='"+password+"' where id="+id);
??? }
???
??? public List selectWithTemp(String where)
??? {
??????? return dao.select(where);
??? }
???
??? public void selectWithTemp()
??? {
??????? dao.selectWithTemp();
??? }
???
??? public User selectById(String id)
??? {
???
?? return dao.selectById(id);
??? }
?
??
??? public void insertUsers(List users)
??? {
???
?? dao.insertUsers(users);
??? }
} |
UserDAO.class :
package DAO;
import java.util.List;
import Model.User;
/**
?* DAO
層接口
?*
?*
?* @author
李嘉陵
?* @since 2006-4-30 8:40:56
?* @version
?**/
public interface UserDAO {
??? public void select();
??? public void test();
??? public void selectWithTemp();
??? public List select(String where);
??? public void update(String how);
??? public void insert(User u);
??? public User selectById(String id);
??? public int[] insertUsers(final List users);
???
}
|
UserDAOImp.class:
package DAO.Imp;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.RowMapperResultReader;
import DAO.UserDAO;
import Model.User;
/**
?*? DAO
層的實現
?*
?*
?* @author
李嘉陵
?* @since 2006-4-30 8:41:26
?* @version
?**/
public class UserDAOImp implements UserDAO{
???
??? private JdbcTemplate jdbcTemplate;
???
??? public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
??? {
??????? this.jdbcTemplate = jdbcTemplate;
??? }
???
??? class UserRowMapper implements RowMapper
??? {
??????? public Object mapRow(ResultSet rs,int index) throws SQLException
??????? {
??????????? User u = new User();
??????????? u.setId(rs.getString("ID"));
??????????? u.setName(rs.getString("Name"));
??????????? u.setPassword(rs.getString("Password"));
??????????? return u;
??????? }
??? }
???
??? public void selectWithTemp()
??? {
??????? String sql = "select * from admin";
??????????????
??????? jdbcTemplate.query(sql,new RowCallbackHandler() {
??????????????? public void processRow(ResultSet rs) throws SQLException {
???????????????
System.out.println("ID: "+rs.getString("ID")+"?? Name: "+rs.getString("name"));
??????????????? }
??????????? } );
??? }
???
??? public List select(String where)
??? {
??????? List list;
??????? String sql = "select * from admin "+where;
??????? list = jdbcTemplate.query(sql,new RowMapperResultReader(new UserRowMapper()));
??????? return list;
??? }
???
??? public User selectById(String id)
??? {
???
?? String sql = "select * from admin where id=?";
???
?? final User u = new User();
???
?? final Object[] params = new Object[] {id};
???
??
???
?? jdbcTemplate.query(sql,params, new RowCallbackHandler(){
???
???????????????????? public void processRow(ResultSet rs) throws SQLException {
???
?????????????????????????????? u.setId(rs.getString("ID"));
???
?????????????????????????????? u.setName(rs.getString("NAME"));
???
?????????????????????????????? u.setPassword(rs.getString("PASSWORD"));
???
???????????????????? }
??
????});
???
??
???
?? return u;
??? }
???
??? public void update(String how)
??? {
??????? String sql = how;
??????? jdbcTemplate.update(sql);
??? }
???
??? public void insert(User u)
??? {
??????? String sql = "insert into admin (ID,NAME,PASSWORD) values (admin_id_seq.nextval,?,?)";
??????? Object[] params = new Object[] {
???????????????????????????
???????
?????????????? u.getName(),
????????
??????????????????
???????
?????????????? u.getPassword()};
??????? jdbcTemplate.update(sql,params);
??? }
??
}
|
UserAction.class:
//
測試類
public class UserAction {
??? public static void main(String[] args)
??? {
??????? Resource resource=new ClassPathResource("beans.xml");
??????? BeanFactory factory = new XmlBeanFactory(resource);???????
??????? User user = (User) factory.getBean("user");???
???????
??????
?user.selectWithTemp();
??? }
} |