struts ibatis 學(xué)習(xí)筆記(轉(zhuǎn)載)
表設(shè)計 PDM :
類圖:
所涉及的頁面:瀏覽員工的頁面
employee_list.jsp
增加
/
編輯員工信息的頁面
employee_add.jsp
學(xué)習(xí)筆記:
Ibatis 方面:如果要把 ibatis 引入到項目中來,需要做以下方面的工作。
* 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)值見 ibatsi 官方文檔: iBATIS-SqlMaps-2_en.pdf
iBATIS
基礎(chǔ)
dao
啟動類
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
項目中的 dao 實(shí)現(xiàn)類均繼承該 dao 類,調(diào)用該類中 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ù)用法涵義見
Struts 學(xué)習(xí)筆記:
Struts-config.xml 的位置可以和其它所有的配置文件一起放到 WEB-INF/classes 目錄下便于集中管理。
ActionForm 和 VO 之間數(shù)值的傳遞
添加的時候從 ActionForm 到 VO
BeanUtils.copyProperties(employee, employeeForm)
而編輯的時候從 VO 到 ActionForm
BeanUtils.copyProperties(employeeForm, employee);
頁面中使用 struts 標(biāo)簽和 JSTL,EL 標(biāo)簽的好處 ,
1 . URL 前面不用加上 contextRoot 的名字,便于項目的移植
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ù)值自動綁定的功能,無需使用 <input> 中的 value ,在編輯記錄或提交記錄出錯時,原有表單數(shù)據(jù)不會丟失
<html:text property="age" size="10"/>
3 .在 ActionForm 中添加錯誤信息可以使用 errors.add("age", new ActionMessage("errors.number", "Age"));
其中 age 表示取出消息的鍵值, errors.number 是 i18N 文件中的那句, Age 是那句的參數(shù)占位符,可以設(shè)計一個通用的 BaseAction, 增加一個寫入消息的方法
可以在頁面中以如下方式取出
<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ù)合類型的數(shù)據(jù)
public class EmployeeForm extends BaseForm {
String id;
String firstName;
String lastName;
String age;
Department department; // 使用復(fù)合類型
在 JSP 中存取復(fù)合類型數(shù)據(jù)時,可以使用打 . 的方式
以前項目中的寫法:
<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)后的寫法 ( 再不用做 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è)計為 unchecked Exception
在 dao 層的實(shí)現(xiàn)類中拋出
在 service 層的接口上聲明
在 struts action 中的關(guān)鍵方法如 addOrUpdate, delete 中捕獲
這一步將會增加許多無關(guān)代碼,應(yīng)該放到最后。
如果不使用 ant, 而直接使用 MyEclipse 發(fā)布,方法是 MyEclipse->Add Web Capability -> 填寫 contextRoot -> 取消 create web.xml 前面的小勾, OK ©
posted on 2008-11-08 13:23 Lucky 閱讀(1035) 評論(0) 編輯 收藏 所屬分類: java