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 :
?
類(lèi)圖:
所涉及的頁(yè)面:瀏覽員工的頁(yè)面
employee_list.jsp
增加
/
編輯員工信息的頁(yè)面
employee_add.jsp
?
學(xué)習(xí)筆記:
Ibatis 方面:如果要把 ibatis 引入到項(xiàng)目中來(lái),需要做以下方面的工作。
? * 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

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

?
以上各參數(shù)的涵義及默認(rèn)值見(jiàn)
ibatsi
官方文檔:
iBATIS-SqlMaps-2_en.pdf
?
iBATIS
基礎(chǔ)
dao
啟動(dòng)類(lèi)
?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
?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)
?
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 ?