Let's go inside

          this blog is deprecated as a result of laziness.
          posts - 59, comments - 2, trackbacks - 0, articles - 0

          struts ibatis 學(xué)習(xí)筆記

          Posted on 2006-08-27 12:50 Earth 閱讀(3701) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java

          ? 有關(guān)于示例本身 ( 基礎(chǔ)代碼源自 learntechnology ,結(jié)合自己的習(xí)慣有較多改進(jìn) )

          表設(shè)計(jì) PDM

          ibatis_pdm.jpg?
          類(lèi)圖:

          ibatis_uml.jpg
          所涉及的頁(yè)面:瀏覽員工的頁(yè)面
          employee_list.jsp

          ibatis_list.jpg
          增加
          /
          編輯員工信息的頁(yè)面 employee_add.jsp

          ibatis_add.jpg?

          學(xué)習(xí)筆記:

          Ibatis 方面:如果要把 ibatis 引入到項(xiàng)目中來(lái),需要做以下方面的工作。

          ibatis_jar.jpg
          ?
          * If you want to use bytecode enhancement for advanced lazy loading:

          ????? CGLIB 2.0????????????? (http://cglib.sf.net)

          ?

          ? * If you want to use the Jakarta DBCP connection pool you'll need:

          DBCP 1.1?????????????? (http://jakarta.apache.org/commons/dbcp/)

          ?

          ? * If you want to use distributed caching you'll need:

          ????? OSCache 2.0.1????????? (http://www.opensymphony.com/oscache/)

          ?

          ? * If you want to use advanced logging you'll need one or both of the following:

          ????? Commons Logging??????? (http://jakarta.apache.org/commons/)

          ????? Log4J 1.2.8??????????? (http://logging.apache.org/log4j/docs/)

          ?

          That's it!

          Ibatis 基礎(chǔ)配置文件:文件名 , 位置可以任意,一般為 SqlMapConfig.xml

          ?1 <? xml?version="1.0"?encoding="UTF-8" ?>
          ?2 <! DOCTYPE?sqlMapConfig
          ?3 ????????PUBLIC?"-//iBATIS.com//DTD?SQL?Map?Config?2.0//EN"
          ?4 ????????"http://www.ibatis.com/dtd/sql-map-config-2.dtd" >
          ?5
          ?6 < sqlMapConfig >
          ?7 ???? < properties? resource ="jdbc.properties" />
          ?8 ???? < settings
          ?9 ??????? cacheModelsEnabled ="true"
          10 ????????enhancementEnabled ="true"
          11 ????????useStatementNamespaces ="true"
          12 ???????lazyLoadingEnabled ="true"
          13 ???????errorTracingEnabled ="true"
          14 ???????maxRequests ="32"
          15 ???????maxSessions ="10"
          16 ???????maxTransactions ="5"
          17 ???????????? />
          18
          19 ???? < transactionManager? type ="JDBC" >
          20 ???????? < dataSource? type ="DBCP" >
          21 ???????????? < property? name ="JDBC.Driver" ?value ="${driver}" />
          22 ???????????? < property? name ="JDBC.ConnectionURL" ?value ="${jdbcURL}" />
          23 ???????????? < property? name ="JDBC.Username" ?value ="${username}" />
          24 ???????????? < property? name ="JDBC.Password" ?value ="${password}" />
          25 ???????????? < property? name ="Pool.MaximumWait" ?value ="30000" />
          26 ???????????? < property? name ="Pool.ValidationQuery" ?value ="select?1?from?employee" />
          27 ???????????? < property? name ="Pool.LogAbandoned" ?value ="true" />
          28 ???????????? < property? name ="Pool.RemoveAbandonedTimeout" ?value ="1800000" />
          29 ???????????? < property? name ="Pool.RemoveAbandoned" ?value ="true" />
          30 ???????? </ dataSource >
          31 ???? </ transactionManager >
          32
          33 ???? < sqlMap? resource ="ibatis/demo/dao/Employee.xml" />
          34 ???? < sqlMap? resource ="ibatis/demo/dao/Department.xml" />
          35
          36 </ sqlMapConfig >
          37

          ?

          以上各參數(shù)的涵義及默認(rèn)值見(jiàn) ibatsi 官方文檔: iBATIS-SqlMaps-2_en.pdf

          ?

          iBATIS 基礎(chǔ) dao 啟動(dòng)類(lèi)

          ?1?public?class?BaseIbatisDao?{
          ?2?
          ?3?????private?static?BaseIbatisDao?instance?=?new?BaseIbatisDao();
          ?4?
          ?5?????private?static?Logger?log?=?Logger.getLogger(BaseIbatisDao.class.getName());
          ?6?
          ?7?????protected?static?final?SqlMapClient?sqlMap;
          ?8?
          ?9?????static?{
          10?
          11?????????try?{
          12?
          13?????????????log.debug("Attempting?to?initialize?SqlMap");
          14?
          15?????????????String?resource?=?"ibatis/demo/dao/SqlMapConfig.xml";
          16?
          17?????????????Reader?reader?=?Resources.getResourceAsReader(resource);
          18?
          19?????????????sqlMap?=?SqlMapClientBuilder.buildSqlMapClient(reader);
          20?
          21?????????????log.debug("Initialized?SqlMap");
          22?
          23?????????}?catch?(Exception?e)?{
          24?
          25?????????????log.error("Error?intializing?BaseIbatisDao?",?e);
          26?
          27?????????????e.printStackTrace();
          28?
          29?????????????throw?new?RuntimeException("Error?initializing?BaseIbatisDao?class.?Cause:?"?+?e);
          30?
          31?????????}
          32?
          33?????}
          34?
          35?????protected?BaseIbatisDao()?{
          36?
          37?????}
          38?
          39?????public?static?BaseIbatisDao?getInstance()?{
          40?
          41?????????return?instance;
          42?
          43?????}
          44?
          45?}
          46?

          項(xiàng)目中的
          dao 實(shí)現(xiàn)類(lèi)均繼承該 dao 類(lèi),調(diào)用該類(lèi)中 SqlMapClient sqlMap 上的各種方法可進(jìn)行 CRUD 等操作。

          sqlMap.queryForList("Employee.getAll", null);

          emp = (Employee) sqlMap.queryForObject("Employee.getById", id);

          sqlMap.delete("Employee.delete", id);

          sqlMap.update("Employee.update", employee);

          sqlMap.insert("Employee.insert", employee);

          ?

          iBATIS 典型的 O/R 映射文件配置 Employee.xml

          ?1?<?xml?version="1.0"?encoding="UTF-8"?>
          ?2?<!DOCTYPE?sqlMap?PUBLIC?"-//iBATIS.com//DTD?SQL?Map?2.0//EN"?"http://www.ibatis.com/dtd/sql-map-2.dtd">
          ?3?<sqlMap?namespace="Employee">
          ?4?
          ?5?????<typeAlias?type="ibatis.demo.vo.Employee"?alias="emp"/>
          ?6?????<cacheModel?id="employeesCache"?type="MEMORY"?readOnly="false"?serialize="true">
          ?7?????????<flushInterval?hours="24"/>
          ?8?????????<flushOnExecute?statement="Employee.update"/>
          ?9?????????<flushOnExecute?statement="Employee.insert"/>
          10?????????<flushOnExecute?statement="Employee.delete"/>
          11?????</cacheModel>
          12?
          13?????<resultMap?id="employeeResult"?class="emp">
          14?????????<result?property="id"?column="id"/>
          15?????????<result?property="firstName"?column="firstname"/>
          16?????????<result?property="lastName"?column="lastname"/>
          17?????????<result?property="age"?column="age"/>
          18?????????<result?property="department.id"?column="dept_id"/>
          19?????????<result?property="department.name"?column="name"/>
          20?????</resultMap>
          21?
          22?????<select?id="getAll"?resultClass="java.util.HashMap"?cacheModel="employeesCache">
          23?????????SELECT
          24?????????e.id?AS?id,
          25?????????e.firstname?AS?firstName,
          26?????????e.lastname?AS?lastName,
          27?????????e.age?AS?age,
          28?????????d.id?AS?deptId,
          29?????????d.name?AS?deptName
          30?????????FROM?employee?e,?department?d
          31?????????WHERE?e.dept_id?=?d.id
          32?????</select>
          33?
          34?????<!--?the?alias?in?the?following?select?must?match?the?above?employeeResult?'column'!?-->
          35????<select?id="getById"?resultMap="employeeResult"?parameterClass="java.lang.Integer">
          36?????????SELECT
          37?????????e.id,
          38?????????e.firstname,
          39?????????e.lastname,
          40?????????e.age,
          41?????????d.id?AS?dept_id,
          42?????????d.name?AS?name
          43?????????FROM?employee?e,?department?d
          44?????????WHERE?e.id?=?#value#
          45?????????AND?e.dept_id?=?d.id
          46?????</select>
          47?
          48?????<update?id="update"?parameterClass="emp">
          49?????????UPDATE?employee
          50?????????SET
          51?????????firstname?=?#firstName#,
          52?????????lastname?=?#lastName#,
          53?????????age?=?#age#,
          54?????????dept_id?=?#department.id#
          55?????????WHERE?employee.id?=?#id#
          56?????</update>
          57?
          58?????<insert?id="insert"?parameterClass="emp">
          59?????????INSERT?INTO?employee?(?id,?firstname,?lastname,?age,?dept_id?)
          60?????????VALUES?(?null,?#firstName#,?#lastName#,?#age#,?#department.id#?)
          61?????</insert>
          62?
          63?????<delete?id="delete"?parameterClass="java.lang.Integer">
          64?????????DELETE?FROM?employee?WHERE?employee.id?=?#value#
          65?????</delete>??
          66?
          67?</sqlMap>
          68?


          以上配置中各參數(shù)用法涵義見(jiàn)

          iBATIS 官方文檔。需要注意的問(wèn)題 , ## 包裹的是 bean property 的名字,要特別注意 <select> 標(biāo)簽中取出的字段名或別名和 resultMap resultClass 及在 JSP 頁(yè)面取出這些數(shù)據(jù)時(shí)的命名關(guān)系

          ?

          Struts 學(xué)習(xí)筆記:

          Struts-config.xml 的位置可以和其它所有的配置文件一起放到 WEB-INF/classes 目錄下便于集中管理。

          ?

          ActionForm VO 之間數(shù)值的傳遞

          添加的時(shí)候從 ActionForm VO

          BeanUtils.copyProperties(employee, employeeForm)

          而編輯的時(shí)候從 VO ActionForm

          BeanUtils.copyProperties(employeeForm, employee);

          ?

          頁(yè)面中使用 struts 標(biāo)簽和 JSTL,EL 標(biāo)簽的好處 ,

          1 URL 前面不用加上 contextRoot 的名字,便于項(xiàng)目的移植

          eg: <link href="<c:url value='/css/main.css'/>" rel="stylesheet" type="text/css" />

          ?

          eg: <html:form action="/employee">

          ?

          < c:url var = "url" scope = "page" value = "/employee.do" >

          ??? < c:param name = "p" value = "addOrUpdateIn" />

          </ c:url >

          < a href = " ${url}">Add New Employee</a>


          eg: <html:link page="/employee.do?p=chart">View Chart</html:link>
          ?

          2 <html:text > 標(biāo)簽具有數(shù)值自動(dòng)綁定的功能,無(wú)需使用 <input> 中的 value ,在編輯記錄或提交記錄出錯(cuò)時(shí),原有表單數(shù)據(jù)不會(huì)丟失

          <html:text property="age" size="10"/>

          ?

          3 .在 ActionForm 中添加錯(cuò)誤信息可以使用 errors.add("age", new ActionMessage("errors.number", "Age"));

          其中 age 表示取出消息的鍵值, errors.number i18N 文件中的那句, Age 是那句的參數(shù)占位符,可以設(shè)計(jì)一個(gè)通用的 BaseAction, 增加一個(gè)寫(xiě)入消息的方法

          可以在頁(yè)面中以如下方式取出

          ?<html:errors property="age"/>

          ?<html:messages id="info">

          ??? <bean:write name="info" />

          ?</html:messages>


          ??<html:messages id="info">
          ???<c:out value="${info}" escapeXml="false" />
          ??</html:messages>
          ?

          4, actionForm 中可以使用復(fù)合類(lèi)型的數(shù)據(jù)

          public class EmployeeForm extends BaseForm {

          ??? String id;

          ??? String firstName;

          ??? String lastName;

          ??? String age;

          ??? Department department; // 使用復(fù)合類(lèi)型

          ?

          JSP 中存取復(fù)合類(lèi)型數(shù)據(jù)時(shí),可以使用打 . 的方式

          以前項(xiàng)目中的寫(xiě)法:

          <SELECT name="category_id">

          ?? <c:forEach items="${categorys}" var="category">

          ??? <OPTION value="${category.id}" <c:if test="${category == blog.category}">selected="selected"</c:if>>

          ?????? ${category.name}

          ??? </OPTION>

          ?? </c:forEach>

          </SELECT>

          改進(jìn)后的寫(xiě)法 ( 再不用做 if 判斷了 !)

          < html:select property = "department.id" >

          ??? ?? < c:forEach var = "dept" items = " ${departments}">

          ????????? < html:option value = " ${dept.id}">

          ${dept.name}

          ????????? </ html:option >

          ????? </ c:forEach >

          </ html:select >

          ?

          其它:

          關(guān)于業(yè)務(wù)異常 BusinessException, 應(yīng)設(shè)計(jì)為 unchecked Exception

          dao 層的實(shí)現(xiàn)類(lèi)中拋出

          service 層的接口上聲明

          struts action 中的關(guān)鍵方法如 addOrUpdate, delete 中捕獲

          這一步將會(huì)增加許多無(wú)關(guān)代碼,應(yīng)該放到最后。

          ?

          如果不使用 ant, 而直接使用 MyEclipse 發(fā)布,方法是 MyEclipse->Add Web Capability -> 填寫(xiě) contextRoot -> 取消 create web.xml 前面的小勾, OK ?

          ibatis_project.jpg

          主站蜘蛛池模板: 杨浦区| 晴隆县| 讷河市| 黎川县| 同心县| 当涂县| 麻栗坡县| 靖宇县| 文成县| 兖州市| 栖霞市| 房产| 横山县| 武汉市| 巨鹿县| 纳雍县| 沈阳市| 蕉岭县| 海宁市| 保靖县| 衡水市| 田阳县| 卢龙县| 光泽县| 年辖:市辖区| 贺州市| 阿克| 青田县| 济源市| 德格县| 陇南市| 南投市| 苏尼特右旗| 巴东县| 建始县| 涟水县| 大冶市| 罗源县| 松江区| 永靖县| 元阳县|