每日一得

          不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發
          最近關心的內容:SSH,seam,flex,敏捷,TDD
          本站的官方站點是:顛覆軟件

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks

          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 (
          ?????? IDnumber(
          10 ) primarykey,
          ?????? NAMEvarchar2(
          64 ),
          ?????? PASSWORDvarchar2(
          64 )
          )

          ?

          ?

          ?????? 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 0.10a

          ?**/

          ?

          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 0.10a

          ?**/

          ?

          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 0.10a

          ?**/

          ?

          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();

          ??? }

          }

          ?

          posted on 2006-10-16 16:28 Alex 閱讀(2749) 評論(0)  編輯  收藏 所屬分類: Spring
          主站蜘蛛池模板: 达日县| 九江市| 定日县| 阿合奇县| 台中县| 双峰县| 桑日县| 子长县| 定兴县| 大庆市| 郓城县| 高青县| 高密市| 利辛县| 嘉定区| 盐城市| 师宗县| 十堰市| 隆回县| 金山区| 全州县| 舟山市| 金昌市| 菏泽市| 行唐县| 慈溪市| 拜城县| 寿宁县| 邵阳市| 曲沃县| 阳信县| 若尔盖县| 克什克腾旗| 商河县| 井研县| 麻栗坡县| 河北区| 河南省| 大安市| 新巴尔虎左旗| 门头沟区|