<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的漫漫程序之旅

    專注于JavaWeb開發
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數據加載中……

    Spring2.5 jdbc Annotation 事務配置

    1.對異常的處理
          spring中提供了DataAccessException,這個異常類是對現有多數據庫拋出異常的封裝,并可以對不同數據庫拋出異常的狀態碼進行解釋。因此,在業務層中方法聲明throws DataAccessException,可以不必擔心拋出我們沒有捕獲到的數據庫操作異常,把精力放在“業務異常”上面。
     
    2.模板類
          spring設計為了更好的管理異常、事務,避免業務方法中重復的try/catch塊,設計出模板類,最重要的兩個為JdbcTemplate,HibernateTemplate,spring的模板類都是線程安全的,由ThreadLocal進行資源管理。
     
          使用JdbcTemplate必須注入DateSource通過構造方法注入。例:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop
    ="http://www.springframework.org/schema/aop"
        xmlns:jee
    ="http://www.springframework.org/schema/jee"
        xmlns:tx
    ="http://www.springframework.org/schema/tx"
        xmlns:context
    ="http://www.springframework.org/schema/context"
        xsi:schemaLocation
    ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
        default-lazy-init
    ="true">

        
    <description>Spring公共配置文件</description>

        
    <!-- 定義受環境影響易變的變量 -->
        
    <bean
            
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            
    <property name="systemPropertiesModeName"
                value
    ="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
            
    <property name="ignoreResourceNotFound" value="true" />
            
    <property name="locations">
                
    <list>
                    
    <!-- 標準配置 -->
                    
    <value>classpath:config/application.properties</value>
                    
    <!-- 服務器生產環境配置 -->
                    
    <!-- <value>file:/var/myapp/application.server.properties</value> -->
                
    </list>
            
    </property>
        
    </bean>

        
    <context:annotation-config />

        
    <!-- 使用annotation 自動注冊bean,并保證@Required,@Autowired的屬性被注入 -->
        
    <context:component-scan
            
    base-package="org.eline.dao,org.eline.service,orm.CoreJdbcSupport;" />

        
    <!-- 數據源配置,使用應用內的DBCP數據庫連接池 -->
        
    <bean id="dataSource"
            class
    ="org.apache.commons.dbcp.BasicDataSource"
            destroy-method
    ="close">
            
    <!-- Connection Info -->
            
    <property name="driverClassName" value="${jdbc.driver}" />
            
    <property name="url" value="${jdbc.url}" />
            
    <property name="username" value="${jdbc.username}" />
            
    <property name="password" value="${jdbc.password}" />

            
    <!-- Connection Pooling DBCP -->
            
    <property name="initialSize" value="5" />
            
    <property name="maxActive" value="100" />
            
    <property name="maxIdle" value="30" />
            
    <property name="maxWait" value="1000" />
            
    <property name="poolPreparedStatements" value="true" />
            
    <property name="defaultAutoCommit" value="false" />
        
    </bean>
        
    <!-- 為dao操作模型設置數據源 -->
        
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            
    <constructor-arg><ref bean="dataSource"/></constructor-arg>
         
    </bean>
         
         
    <bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
            
    <constructor-arg><ref bean="dataSource"/></constructor-arg>
         
    </bean>
         
        
    <bean id="jdbcDaoSupport" class="org.springframework.jdbc.core.support.JdbcDaoSupport">
           
    <property name="jdbcTemplate"><ref bean = "jdbcTemplate"/></property>
        
    </bean>
        
    <!-- 聲明事務,自動管理配置數據源 -->
        
    <bean id="transactionManager"
            class
    ="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            
    <property name="dataSource">
                
    <ref local="dataSource" />
            
    </property>
        
    </bean>

        
    <!-- 用注解來實現事務管理 -->
        
    <tx:annotation-driven transaction-manager="transactionManager" />

    </beans>

    jdbcTemplate,simpleJdbcTeplate 用法:
    **
     
    * 封閉Spring JDBC的核心基類
     
    * 
     
    * 無需關心數據庫連接的開啟和關閉,封閉常用CRUD方法,簡化應用
     
    * 
     
    * @author zdw
     
    * 
     
    */
    @SuppressWarnings(
    "unchecked")
    public abstract class CoreJdbcSupport
    {
        @Autowired
        
    protected JdbcTemplate jdbcTemplate;
        @Autowired
        
    protected SimpleJdbcTemplate simpleJdbcTemplate;

        
    /**
         * 高效率的oracle分頁sql
         * 
         * 
    @param querySql
         *            查詢語句
         * 
    @param countSql
         *            統計語句
         * 
    @param pageNo
         *            當前頁
         * 
    @param pageSize
         *            頁大小
         * 
    @param clazz
         *            要自動賦值的實體類
         * 
    @return
         
    */

        
    protected Page pageQuery(String querySql, String countSql, int pageNo,
                
    int pageSize, Class clazz)
        
    {
            
    // 設置page信息
            Page page = new Page();
            page.setPageNo(pageNo);
            page.setPageSize(pageSize);
            
    // 統計總記錄數
            int size = jdbcTemplate.queryForInt(countSql);
            page.setTotalCount(size);
            List list 
    = this.simpleJdbcTemplate.query(querySql,
                    ParameterizedBeanPropertyRowMapper.newInstance(clazz),
                    page.getLast(), page.getFirst());
            
    // 設置結果集
            page.setResult(list);
            
    return page;
        }


        
    /**
         * 分頁查詢,不需要自動set值
         * 
         * 
    @param querySql
         * 
    @param countSql
         * 
    @param pageNo
         * 
    @param pageSize
         * 
    @return
         
    */

        
    protected Page pageQuery(String querySql, String countSql, int pageNo,
                
    int pageSize)
        
    {
            
    // 設置page信息
            Page page = new Page();
            page.setPageNo(pageNo);
            page.setPageSize(pageSize);
            
    // 統計總記錄數
            int size = this.jdbcTemplate.queryForInt(countSql);
            page.setTotalCount(size);
            List list 
    = this.simpleJdbcTemplate.queryForList(querySql,
                    page.getLast(), page.getFirst());
            
    // 設置結果集
            page.setResult(list);
            
    return page;
        }


        
    /***************************************************************************
         * 主要用于更新操作的自動匹配列
         * 
         * 
    @param obj
         *            對象實體
         * 
         
    */

        
    protected List<String> getCols(Object obj)
        
    {
            List
    <String> list = new ArrayList<String>();
            Class c 
    = obj.getClass();
            Field fileds[] 
    = c.getDeclaredFields();
            
    try
            
    {
                
    for (int i = 0; i < fileds.length; i++)
                
    {
                    Field f 
    = fileds[i];
                    f.setAccessible(
    true);
                    
    if (f.get(obj) != null)
                    
    {
                        list.add(
    " " + f.getName() + "=:" + f.getName());
                    }

                }

            }

            
    catch (Exception e)
            
    {
                e.printStackTrace();
            }

            
    return list;
        }


        
    /***************************************************************************
         * 主要用于更新操作的自動匹配列
         * 
         * 
    @param obj
         *            對象實體
         * 
    @param flag
         *            是否忽略整形值0
         * 
         
    */

        
    protected List<String> getCols(Object obj, boolean flag)
        
    {
            List
    <String> list = new ArrayList<String>();
            Class c 
    = obj.getClass();
            Field fileds[] 
    = c.getDeclaredFields();
            
    try
            
    {
                
    for (int i = 0; i < fileds.length; i++)
                
    {
                    Field f 
    = fileds[i];
                    f.setAccessible(
    true);
                    
    if (flag)
                    
    {
                        
    if (f.get(obj) != null)
                        
    {
                            
    if (Integer.valueOf(f.get(obj).toString()) != 0)
                            
    {
                                list.add(
    " " + f.getName() + "=:" + f.getName());
                            }

                        }

                    }

                    
    else
                    
    {
                        
    if (f.get(obj) != null)
                        
    {
                            list.add(
    " " + f.getName() + "=:" + f.getName());
                        }

                    }

                }

            }

            
    catch (Exception e)
            
    {
                e.printStackTrace();
            }

            
    return list;
        }


        
    /**
         * 
         * 
    @param obj
         *            要更新的對象
         * 
    @param tableName
         *            表名稱
         * 
    @param sid
         *            標識列名稱
         * 
    @return
         
    */

        
    protected String getUpdateSql(Object obj, String tableName, String sid)
        
    {
            List
    <String> cols = this.getCols(obj);
            String sql 
    = StringUtils.join(new String[]
            
    "update " + tableName + " set ",
                    StringUtils.join(cols.toArray(), 
    ","),
                    
    " where " + sid + "=:" + sid + "" }
    );
            
    return sql;
        }


    }


    dao:
    package org.eline.dao.user;

    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.List;
    import org.eline.vo.User;
    import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
    import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
    import org.springframework.stereotype.Repository;
    import org.springframework.transaction.annotation.Transactional;

    import orm.CoreJdbcSupport;
    import orm.Page;
    import utils.MD5Utils;

    /**
     * 用戶管理DAO
     * 
     * 
    @author zdw
     * 
     
    */

    @Repository
    @SuppressWarnings(
    "unchecked")
    @Transactional
    public class UserDao extends CoreJdbcSupport
    {
        
    /**
         * 用戶登錄的方法
         * 
         * 
    @param username
         *            用戶名
         * 
    @param password
         *            密碼
         * 
    @return
         
    */

        
    public int login(String username, String password)
        
    {
            
    // 轉換成md5形式
            password = MD5Utils.getInstance().getMD5ofStr(password);
            String sql 
    = "select count(userid) from usr_user where username = ? and password = ?";
            
    return simpleJdbcTemplate.queryForInt(sql, username, password);
        }

        
        
        
    /**
         * 添加用戶的方法
         * 
         * (注意sql語句的寫法和new BeanPropertySqlParameterSource(user)直接把bean轉成輸入參數)
         * 
         * 
    @param user
         *            用戶實體
         * 
    @return
         
    */

        
    public int save(User user)
        
    {
            String sql 
    = "insert into usr_user(userid,username,password) values(:userid,:username,:password)";
            
    return this.simpleJdbcTemplate.update(sql,
                    
    new BeanPropertySqlParameterSource(user));
        }


        
    /**
         * 修改用戶的方法
         * 
         * 
    @param user
         *            用戶實體
         * 
    @return
         
    */

        
    public int update(User user)
        
    {
            
    // 獲取要更新的列,null值不更新,保留原值
            String sql = this.getUpdateSql(user, "usr_user""userid");
            
    return this.simpleJdbcTemplate.update(sql,
                    
    new BeanPropertySqlParameterSource(user));
        }


        
    /**
         * 刪除用戶的方法
         * 
         * 
    @param id
         *            要刪除的用戶id
         * 
    @return
         
    */

        
    public int delete(int userid)
        
    {
            
    // ? 也可寫成:userid的形式
            String sql = "delete from usr_user where userid = ?";
            
    return this.simpleJdbcTemplate.update(sql, userid);
        }


        
    /**
         * 查詢用戶名是否存在
         * 
         * 
    @return
         
    */

        
    public boolean exist(String username)
        
    {
            String sql 
    = "select count(userid) from usr_user where username = ?";
            
    int rows = this.simpleJdbcTemplate.queryForInt(sql, username);
            
    return rows > 0 ? true : false;
        }


        
    /**
         * 查詢單個用戶
         * 
         * 
    @param userid
         *            用戶id
         * 
    @return
         
    */

        
    public User queryOne(int userid)
        
    {
            String sql 
    = "select * from usr_user where userid = ?";
            
    return this.simpleJdbcTemplate.queryForObject(sql,
                    ParameterizedBeanPropertyRowMapper.newInstance(User.
    class),
                    userid);
        }


        
    /**
         * 查詢多個用戶
         * 
         * 
    @param userid
         *            用戶id
         * 
    @return
         
    */

        
    public List<User> queryList()
        
    {
            
    return this.simpleJdbcTemplate.query("SELECT * from usr_user",
                    ParameterizedBeanPropertyRowMapper.newInstance(User.
    class));
        }


        
    /**
         * oracle分頁sql
         * 
         * 
    @param currentNum
         *            第幾頁
         * 
    @param pagesize
         *            頁大小
         * 
    @return
         
    */

        
    public Page pageQuery(int pageNo, int pageSize)
        
    {
            String querySql 
    = "SELECT * FROM(SELECT A.*, ROWNUM RN  FROM (SELECT * FROM usr_user) A  WHERE ROWNUM <= ?) WHERE RN >= ?";
            String countSql 
    = "select count(userid) from usr_user";
            
    return this.pageQuery(querySql, countSql, pageNo, pageSize, User.class);
        }


        
    public static void main(String[] args) throws Exception
        
    {
            User user 
    = new User();
            user.setUserid(
    3);
            user.setUsername(
    "angle");
            user.setPassword(
    "admin");
            List list 
    = new ArrayList();
            Class c 
    = User.class;
            Field fileds[] 
    = c.getDeclaredFields();
            
    for (int i = 0; i < fileds.length; i++)
            
    {
                Field f 
    = fileds[i];
                f.setAccessible(
    true);
                
    if (f.get(user) != null)
                
    {
                    list.add(
    " " + f.getName() + "=:" + f.getName());
                    System.out.println(
    " " + f.getName() + "=:" + f.getName());
                }

            }


        }

        
    }


    網上關于怎么配置和使用的大多記錄不全,特在此mark一下。


    posted on 2009-04-14 10:05 々上善若水々 閱讀(4365) 評論(6)  編輯  收藏 所屬分類: Spring

    評論

    # re: Spring2.5 jdbc Annotation 事務配置  回復  更多評論   

    你好,請把page類發給我,謝謝。ly0318@gmail.com
    2009-04-21 21:12 | ly

    # re: Spring2.5 jdbc Annotation 事務配置  回復  更多評論   

    @ly
    已發
    2009-04-22 09:34 | 々上善若水々

    # re: Spring2.5 jdbc Annotation 事務配置  回復  更多評論   

    寫得太好了 我正在學習這方面的東西
    2009-10-22 17:42 | 我愛EE

    # re: Spring2.5 jdbc Annotation 事務配置  回復  更多評論   

    事務倒是配置了,但哪段代碼使用事務了?
    2011-06-02 08:58 | 黃山

    # re: Spring2.5 jdbc Annotation 事務配置  回復  更多評論   

    很細致,感謝樓主的發帖了。 又學到了。
    近來在做一個跨3個數據庫的項目,在學怎么用這個spring jdbctemaplate 跨多數據庫 ,可是總是出錯。 樓主如果可以的話,指導下。 我QQ286250574 郵箱lqmoai@163.com
    2011-06-17 21:56 | 今夜有點冷

    # re: Spring2.5 jdbc Annotation 事務配置  回復  更多評論   

    發覺回滾不了。
    2011-09-03 17:03 | canca
    主站蜘蛛池模板: 特级毛片aaaa免费观看| 亚洲影院在线观看| 免费乱码中文字幕网站| 四虎成人精品一区二区免费网站| 成年女人18级毛片毛片免费观看| 免费国产黄线在线观看| 在线观看特色大片免费视频| 性生交片免费无码看人| 好男人看视频免费2019中文| 毛片a级毛片免费观看免下载| 在线精品免费视频无码的| 成人午夜免费福利| 国产无遮挡裸体免费视频| 日韩亚洲国产二区| 国产精品亚洲玖玖玖在线观看| 久久久久亚洲精品天堂久久久久久| 伊人久久综在合线亚洲91| 亚洲成AV人在线观看天堂无码| 精品日韩亚洲AV无码一区二区三区 | 性一交一乱一视频免费看| 蜜臀91精品国产免费观看| www亚洲一级视频com| 中文字幕亚洲日韩无线码| 久热综合在线亚洲精品| 亚洲日韩中文字幕| 亚洲中文无码亚洲人成影院| 黄页网站在线免费观看| 最新亚洲成av人免费看| 7x7x7x免费在线观看| 性感美女视频在线观看免费精品 | 成人免费无毒在线观看网站| 国产成人免费片在线视频观看| 久久久久亚洲精品男人的天堂| 色噜噜综合亚洲av中文无码| 亚洲欧洲无卡二区视頻| j8又粗又长又硬又爽免费视频| 99爱在线精品视频免费观看9| 在线免费观看污网站| 国产亚洲大尺度无码无码专线 | 亚洲视频免费在线看| 欧美日韩亚洲精品|