dbUtil與案例

1.tomcat內置連接池管理
tomcat內置連接池使用的是dbcp。

問題1:tomcat怎樣管理連接池?(配置)
要想將一個dbcp連接池讓 tomcat管理,只需要創建一個context.xml配置文件,在配置文件中
配置相關信息,

在這種服務裏,對象不但有名稱,還有屬性。

2.元數據
問題:元數據是什麼,有什麼作用?
元數據(metaData) 指數據庫中 庫、表、列的定義信息

    1.DataBaseMetaData 數據庫元數據(瞭解)
        問題:怎樣獲取一個DataBaseMetaData?

            Connection接口中定義了一個方法 getMetaData();

        問題:常用API

            String driverName = dmd.getDriverName(); //獲取驅動名稱
            System.out.println(driverName);             
            String userName = dmd.getUserName();//獲取用戶名
            System.out.println(userName);               
            String url = dmd.getURL();//獲取url
            System.out.println(url);                
            String databaseProductName = dmd.getDatabaseProductName(); //獲取數據庫名稱
            System.out.println(databaseProductName);                
            String databaseProductVersion = dmd.getDatabaseProductVersion();//獲取數據庫版本.
            System.out.println(databaseProductVersion);

            ResultSet getPrimaryKeys(String catalog,
                     String schema,
                     String table)
                     throws SQLException
            獲取表中主鍵相關描述
                每個主鍵列描述都有以下列:
                TABLE_CAT String => 表類別(可爲 null) 
                TABLE_SCHEM String => 表模式(可爲 null) 
                TABLE_NAME String => 表名稱 
                COLUMN_NAME String => 列名稱 
                KEY_SEQ short => 主鍵中的序列號(值 1 表示主鍵中的第一列,值 2 表示主鍵中的第二列)。 
                PK_NAME String => 主鍵的名稱(可爲 null)            

    2.ParameterMetaData 參數元數據
        參數元數據主要用於獲取:sql語句中佔位符的相關信息.

        問題:怎樣獲取ParameterMetaData?
            在PreparedStatement中有一個方法getParameterMetaData可以獲取.

        問題:怎樣使用?
            int count = pmd.getParameterCount(); // 獲取參數 個數
            System.out.println(count);

            String type1 = pmd.getParameterTypeName(1);//獲取參數的類型
            System.out.println(type1);

            注意:在獲取參數類型時會產生異常
                java.sql.SQLException: Parameter metadata not available for the given statement
            解決方案:
                在url後添加參數
                jdbc:mysql:///day18?generateSimpleParameterMetadata=true
            添加這個參數後,我們在獲取,它的結果也是varchar,原因:是mysql驅動的支持問題。   

    3.ResultSetMetaData 結果集元數據

        問題:怎樣獲取結果集元數據?
            可以通過ResultSet的getMetaData()方法獲取.

        問題:怎樣使用?
            System.out.println(rsmd.getColumnCount());//獲取結果集中列數量       
            System.out.println(rsmd.getColumnName(2));//獲取結果集中指定列的名稱.
            System.out.println(rsmd.getColumnTypeName(3));//獲取結果集中指定列的類型。

===================================================================**
3.dbutils工具
問題:dbutils是什麼,有什麼作用?
它就是一個簡單的jdbc封裝工具.
使用dbutils可以簡化操作.
要使用dbutils需要導入jar包.

dbutils核心
    1.QueryRunner類
        它是用於執行sql語句的類。
        1.query 用於執行select 
        2.update 用於執行update delete insert
        3.batch 批處理
    2.ResultSetHandler接口
        用於定義結果集的封裝              
        它提供九個實現類,可以進行不同的封裝。
    3.DbUtils類
        它提供關於關閉資源以及事務rollback,commit操作。
-----------------------------------------------------
Dbutlis詳解
    1.QueryRunner
        1.QueryRunner怎樣獲取
            1.new QueryRunner()
                如果是使用這種構造創建的QueryRunner,它的事務是手動控制.
            2.new QueryRunner(DataSource ds);
                如果是使用這種構造,它的事務是自動事務,簡單說,一條sql一個事務。

        2.QueryRunner中的三個核心方法
            query
            update
            batch
            對於上述三個方法,它們提供很多重載。
            如果QueryRunner在創建時,沒有傳遞DataSource參數,那麼在使用
            query,update,batch方法時,要傳遞Connection參數
            如果QueryRunner在創建時,傳遞了Dataource參數,好麼在使用
            query,update,batch方法時,不需要傳遞Connection參數。

        總結:
            怎樣配套使用:
                QueryRunner runner=new QueryRunner();
                runner.query(Connection,sql,ResultSetHandler,Object... param);
                runner.update(Connection,sql,Object...param);
                runner.batch(Connection con,sql,Object[][] objs);

                QueryRunner runner=new QueryRunner(DataSource ds);
                runner.query(sql,ResultSetHandler,Object... param);
                runner.update(sql,Object...param);
                runner.batch(sql,Object[][] objs);

    -----------------------------------------------------------------           
    ResultSetHandler接口  
        用於封裝結果集.

============================================================================
模仿QueryRunner
    1.query方法模仿
        public <T> T query(Connection con, String sql, MyResultSetHandler<T> mrs,Object... params) throws SQLException {
                            PreparedStatement pst = con.prepareStatement(sql); // 得到一個預處理的Statement.
                            // 問題:sql語句中可能存在參數,需要對參數賦值。

                            ParameterMetaData pmd = pst.getParameterMetaData();
                            // 可以得到有幾個參數
                            int count = pmd.getParameterCount();
                            for (int i = 1; i <= count; i++) {
                                    pst.setObject(i, params[i - 1]);
                            }

                            ResultSet rs = pst.executeQuery(); // 得到了結果集,要將結果集封裝成用戶想要的對象,但是,工具不可能知道用戶需求。

                            return mrs.handle(rs);
                    }
    2.update方法模仿
        public int update(Connection con, String sql, Object... params) throws SQLException {

            PreparedStatement pst = con.prepareStatement(sql); // 得到一個預處理的Statement.
            // 問題:sql語句中可能存在參數,需要對參數賦值。

            ParameterMetaData pmd = pst.getParameterMetaData();
            // 可以得到有幾個參數
            int count = pmd.getParameterCount();
            for (int i = 1; i <= count; i++) {
                pst.setObject(i, params[i - 1]);
            }

            int row = pst.executeUpdate();
            // 關閉資源
            pst.close();
            return row;
        **}

===============================================================================**
ResulsetHandler九個實現類

         ArrayHandler, 將結果集中 第一條 記錄封裝到Object[],數組中的每一個元素就是記錄中的字段值。
         ArrayListHandler, 將結果集中 每一條 記錄封裝到Object[],數組中的每一個元素就是記錄中的字段值。在將這些數組裝入到List集合。

         BeanHandler(重點), 將結果集中第一條記錄封裝到一個javaBean中。
         BeanListHandler(重點), 將結果集中每一條記錄封裝到javaBean中,在將javaBean封裝到List集合.

         ColumnListHandler, 將結果集中指定列的值封裝到List集合.

         MapHandler, 將結果集中第一條記錄封裝到Map集合中,集合的 key就是字段名稱,value就是字段值
         MapListHandler, 將結果集中每一條記錄封裝到Map集合中,集合的 key就是字段名稱,value就是字段值,在將這些Map封裝到List集合

         KeyedHandler,在使用指定的列的值做爲一個Map集合的key,值爲每一條記錄的Map集合封裝。
         ScalarHandler 進行單值查詢 select count(*) from account;

    ---------------------------------------------------------
    擴展:實現BeanHandler
        使用BeanUtils實現
            Object obj = null;

            Map<String, String[]> map = new HashMap<String, String[]>();

            ResultSetMetaData md = rs.getMetaData();
            int count = md.getColumnCount();

            if (rs.next()) {
                try {
                    obj = clazz.newInstance();
                    for (int i = 1; i <= count; i++) {
                        map.put(md.getColumnName(i),
                                new String[] { rs.getString(md.getColumnName(i)) });
                    }
                    BeanUtils.populate(obj, map);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }

            }

            return obj;

—————————————————

練習:
登錄成功後,訪問到一個頁面success.jsp,在頁面上添加一個連接

就是客戶信息的CRUD操作.

1.客戶信息

    字段名 說明  類型
    Id  編號  varchar(40)
    name    客戶姓名    varchar(20)
    gender  性別  varchar(10)
    birthday    生日  date
    cellphone   手機  varchar(20)
    email   電子郵件    varchar(40)
    preference  客戶愛好    varchar(100)
    type    客戶類型    varchar(40)
    description 備註  varchar(255)

    create table customer(
       id varchar(40) primary key,
       name varchar(20),
       gender varchar(10),
       birthday date,
       cellphone varchar(20),
       email varchar(40),
       preference varchar(100),
       type varchar(40),
       description varchar(255)
    );
2.搭建環境
    JavaEE 三層結構 
    Servlet + JSP + JavaBean+jstl + DBUtils+ DAO + MySQL 

    導入jar包 :JSTL 、BeanUtils、DBUtils、C3P0、mysql驅動 

    創建包結構 
    cn.itcast.customer.web  表現層
    cn.itcast.customer.service 業務層
    cn.itcast.customer.dao 持久層
    cn.itcast.customer.utils 工具包
    cn.itcast.customer.domain 實體類  javaBean


    應用的jar文件
    1.  mysql驅動包
    2.  c3po包
    3.  dbutils包
    4.  BeanUtil包
    5.  JSTL包
    6.  c3p0的配置文件

------------------------------------------------------
編寫代碼:
    1.創建Customer這個javaBean
        private String id;
        private String name;
        private String gender;
        private Date birthday;
        private String cellphone;
        private String email;
        private String preference;
        private String type;
        private String description;

    2.爲了測試方便,向customer表中插入數據
        insert into customer values("a11","tom","男","2010-10-10","13888888888","[email protected]","吃,喝,玩","vip","good man");
        insert into customer values("a12","fox","男","2000-10-10","13888888888","[email protected]","吃,喝,玩","vip","good man");
        insert into customer values("a13","james","男","1990-10-10","13888888888","[email protected]","吃,喝,玩","vip","good man");


    3.實現查詢所有客戶信息操作
        1.在success.jsp頁面添加連接
            <a href="${pageContext.request.contextPath}/findAll">查看所有客戶信息</a>
        2.在CustomerFindAllServlet中調用service,在service中調用dao,最後得到一個List<Customer>.

        3.在showCustomer.jsp頁面展示客戶信息
            <c:forEach items="${cs}" var="c">
                <tr>
                    <td><input type="checkbox">
                    </td>
                    <td>${c.id }</td>
                    <td>${c.name}</td>
                    <td>${c.gender }</td>
                    <td>${c.birthday }</td>
                    <td>${c.cellphone }</td>
                    <td>${c.email }</td>
                    <td>${c.preference }</td>
                    <td>${c.type }</td>
                    <td>${c.description }</td>
                    <td><a>編輯</a>&nbsp;&nbsp;&nbsp;<a>刪除</a></td>
                </tr>
            </c:forEach>

----------------------------------------------------------
    4.刪除操作
        1.在showCustomer.jsp頁面的刪除連接上添加參數  客戶的id
            <a href="${pageContext.request.contextPath}/delByid?id=${c.id}">刪除</a>
        2.創建一個CustomerDelByIdServlet,獲取請求參數,調用service中刪除方法.

        問題:如果刪除完成後,怎樣處理?
            需要重新跳轉到查詢所有的servlet中,在重新查詢數據。

----------------------------------------------------------------------
    5.編輯
        1.查詢,做回顯示
                <a href="${pageContext.request.contextPath}/findById?id=${c.id}">編輯</a>
            1.創建CustomerFindByIdServlet,得到要查詢的id,調用service,得到Custonmer對象。

            2.將customer對象存儲到request域,請求轉發到customerInfo.jsp頁面。

            3.在customerInfo.jsp頁面展示客戶信息

            注意:客戶的id不能修改,所以使用<input type="hidden">
        2.修改

            1.注意使用BeanUtils時的類型轉換問題

            2.注意編碼問題    
                post:request.setCharacterEncoding("utf-8");
                get:手動轉換  new String(request.getParameter(name).getBytes("iso8859-1"),"utf-8");

            3.進行修改操作
                String sql = "update customer set name=?,gender=?,birthday=?,cellphone=?,email=?,preference=?,type=?,description=? where id=?";
                修改完成後,在重新查詢一次
                response.sendRedirect(request.getContextPath() + "/findAll");

================================================================================================
解決關於回顯示時的問題:
1.性別 應該使用radio

        使用自定義標籤
            1.定義標籤類   extends SimpleTagSupport
            2.定義tld文件
                <tag>
                    <name>sex</name><!-- 標籤名稱 -->
                    <tag-class>cn.itcast.customer.tag.GenderTag</tag-class><!-- 標籤類 -->
                    <body-content>empty</body-content><!-- 標籤體中內容 -->

                    <attribute>
                        <name>gender</name> <!-- 屬性名稱 -->
                        <required>true</required> <!-- 屬性必須有 -->
                        <rtexprvalue>true</rtexprvalue><!-- 屬性值可以接收el表達式 -->
                    </attribute>
                </tag>
            3.在頁面上使用
                1.使用taglib導入
                2.使用
                    <my:sex gender="${c.gender}" />

---------------------------------------------------------------
使用虛擬主機可以將項目部署成頂級域名

    1.在service.xml文件
        1.端口修改爲80
        2. 配置主機
          <Host name="www.customer.com"  appBase="D:\java1110\workspace\day19_2"
                unpackWARs="true" autoDeploy="true">


            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />

                   <Context path="" docBase="D:\java1110\workspace\day19_2\WebRoot" />
          </Host>
        3.在hosts文件中配置
            127.0.0.1  www.customer.com

==================================================================  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章