接著上一篇《javaweb實戰之商城項目開發(二)》這一篇主要實現通用的BaseDao.java和使用resultMap映射關聯對象
一.通用的BaseDao.java
既然要大家都能用,所以使用了泛型.其中要注意的問題就是類似User.getClass().getName()這樣的代碼是需要修改的.修改方法就是使用參數Class tc傳遞過來,然后在使用tc.getName()即可.
完整代碼:
1
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
package com.dao; import com.model.Pager; import com.util.SessionUtil; import com.util.SystemContext; import org.apache.ibatis.session.SqlSession; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by nl101 on 2016/2/23. */ public class BaseDao<T> { /** * 根據id取出一個T類型 * @param id 要取出T類型的id * @return */ public T load(Class<T> tc, int id){ SqlSession session = SessionUtil.getSession(); T t = null ; try { t = session.selectOne(tc.getName()+ ".load" ,id); } finally { SessionUtil.closeSession(session); } return t; } /** * 添加一個T類型 * @param t 要添加的T類型 * @return true成功 */ public boolean add(T t){ int isAdd = 0 ; SqlSession session = SessionUtil.getSession(); try { isAdd = session.insert(t.getClass().getName()+ ".add" ,t); session.commit(); //提交 } catch (Exception e) { session.rollback(); //提交失敗則回滾 } finally { SessionUtil.closeSession(session); } return isAdd> 0 ; } /** *根據id刪除T類型 * @param id 要刪除T的id * @return true成功 */ public boolean delete(Class<T> t, int id){ int isDelete = 0 ; SqlSession session = SessionUtil.getSession(); try { isDelete = session.delete(t.getName()+ ".delete" ,id); session.commit(); } catch (Exception e) { session.rollback(); //失敗返回 System.out.println( "刪除用戶失敗" ); e.printStackTrace(); } finally { SessionUtil.closeSession(session); } return isDelete> 0 ; } /** *更新T類型 * @param t 要更新的用戶 * @return true成功 */ public boolean update(T t){ int isUpdate = 0 ; SqlSession session = SessionUtil.getSession(); try { isUpdate = session.delete(t.getClass().getName()+ ".update" ,t); session.commit(); } catch (Exception e) { session.rollback(); //失敗返回 System.out.println( "更新用戶失敗" ); e.printStackTrace(); } finally { SessionUtil.closeSession(session); } return isUpdate> 0 ; } /** * 根據指定條件分頁查詢 * @param maps 指定條件集合 * @return */ public Pager<T> find(Class<T> t,Map<String,Object> maps){ int pageStart = SystemContext.getPageStart(); //分頁起始 int pageSize = SystemContext.getPageSize(); //分頁大小 Pager<T> pagers = new Pager<>(); maps.put( "pageStart" ,pageStart); maps.put( "pageSize" ,pageSize); SqlSession session = SessionUtil.getSession(); List<T> datas = null ; try { datas = session.selectList(t.getName()+ ".find" ,maps); //獲取記錄 pagers.setDatas(datas); pagers.setPageSize(pageSize); pagers.setPageStart(pageStart); int totalRecord = session.selectOne(t.getName()+ ".findcount" ,maps); //獲取記錄總數 pagers.setTotalRecord(totalRecord); pagers.setPageIndex(pageStart/pageSize+ 1 ); } finally { SessionUtil.closeSession(session); } return pagers; } /** * 根據指定條件取出部分數據 * @param maps 指定條件集合 * @return */ public Pager<T> list(Class<T> t,Map<String,Object> maps){ Pager<T> pagers = new Pager<>(); SqlSession session = SessionUtil.getSession(); List<T> datas = null ; try { datas = session.selectList(t.getName()+ ".list" ,maps); //獲取記錄 pagers.setDatas(datas); pagers.setTotalRecord(datas.size()); } finally { SessionUtil.closeSession(session); } return pagers; } } |
同樣的UserDao.java也需要相應的修改
1
2
3
4
5
6
7
8
9
10
11
12
|
public class UserDao extends BaseDao<User>{ /** * 根據id取出一個用戶 * @param id 要取出用戶的id * @return */ public User load( int id){ return super .load(User. class ,id); } /* 其他函數就不一一貼出來了,都是類似的寫法*/ } |
二.resultMap的映射
簡單來說當數據庫中的字段信息和對象的屬性不一致時需要通過resultMap來映射.
舉個例子:Address屬性中有一個User的實體類,如下
1
2
3
4
5
6
7
8
9
|
public class Address { private int id; private String name; private String phone; private String postcode; //直接給user對象,來代替user_id private User user; ````````` } |
那么我們想取出來一個Address的同時也取出其對應的user,然而這是兩個對象,且兩者都有id屬性,所以對于mybatis在調用set方法設置屬性時就會混亂而使用resultMap的目的就是消除這種混亂.
編寫load的sql
1
2
3
4
5
6
|
<! --加載一個地址--> <! --這里需要表連接,取出User,又連接保證取出的地址不為空,并且為重復屬性id取別名--> < select id= "load" parameterType= "int" resultMap= "addressMap" > select *,t1.id AS 'a_id' from address t1 RIGHT JOIN user t2 ON (t1.user_id = t2.id) WHERE t1.id=#{id}; </ select > |
這里就使用的resultMap來映射,這個resultMap的名字叫做addressMap.
addressMap
1
2
3
4
5
6
7
8
9
10
11
12
|
<resultMap id= "addressMap" type= "Address" autoMapping= "true" > <!--把結果中的a_id映射為id,其他的autoMapping = true 會自動匹配--> <id column= "a_id" property= "id" /> <!--取出關聯屬性--> <association property= "user" javaType= "User" > <!--把user_id映射為user的id--> <id column= "user_id" property= "id" /> <result column= "username" property= "username" /> <result column= "nickname" property= "nickname" /> <result column= "type" property= "type" /> </association> </resultMap> |
- type 代表其類型,不包括關聯屬性
- autoMapping true表示消除沖突后,剩下的屬性會自動匹配
- id和result id 和 result 都映射一個單獨列的值到簡單數據類型,不同是 id 表示的結果將是當比較對象實例時用到的標識屬性,一般是主鍵
- association 代表關聯屬性,這里設置的是User,對于關聯映射,其里面想要顯示的屬性必須要手動指定property,不然會無法映射
上面配置完,當搜索出來的時候,mybatis就會自動調用其相應的set方法,把屬性設置到實體類中.
測試
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.dao; import com.model.Address; public class AddressDao extends BaseDao<Address> { public static void main(String[] args) { AddressDao addressDao = new AddressDao(); Address address = addressDao.load( 1 ); System.out.println(address.toString()); } /** * 加載一個地址 * @param id 要加載地址的id * @return 返回要加載的地址,null則加載失敗 */ public Address load( int id){ return super .load(Address. class ,id); } } |
效果圖可以看出來,只要是映射的關聯屬性都取出來了,沒映射的都為null
按照這樣的想法把其他函數補全
xml代碼:
1
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
38
39
40
41
42
|
<? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> < mapper namespace = "com.model.Address" > <!--當數據庫中的字段信息和對象的屬性不一致時需要通過resultMap來映射 --> < resultMap id = "addressMap" type = "Address" autoMapping = "true" > <!--把結果中的a_id映射為id,其他的autoMapping = true會自動匹配--> < id column = "a_id" property = "id" /> <!--取出關聯屬性--> < association property = "user" javaType = "User" > <!--把user_id映射為user的id--> < id column = "user_id" property = "id" /> < result column = "username" property = "username" /> < result column = "nickname" property = "nickname" /> < result column = "type" property = "type" /> </ association > </ resultMap > <!--加載一個地址--> <!--這里需要表連接,取出User,又連接保證取出的地址不為空,并且為重復屬性id取別名--> < select id = "load" parameterType = "int" resultMap = "addressMap" > select *,t1.id AS 'a_id' from address t1 RIGHT JOIN user t2 ON (t1.user_id = t2.id) WHERE t1.id=#{id}; </ select > <!--增加一個地址--> < insert id = "add" parameterType = "Address" > insert into address values (null,#{name},#{phone},#{postcode},${user_id}) </ insert > <!--刪除一個地址--> < delete id = "delete" parameterType = "int" > DELETE FROM address WHERE id=#{id} </ delete > <!--修改一個地址--> < update id = "update" parameterType = "Address" > UPDATE address SET name=#{name},phone=#{phone},postcode=#{postcode} where id=#{id} </ update > <!--找出指定用戶所有的地址--> < select id = "list" parameterType = "Map" resultMap = "addressMap" > SELECT *,t1.id AS 'a_id' FROM address t1 RIGHT JOIN user t2 ON (t1.user_id=t2.id) WHERE t1.user_id=#{user_id} </ select > </ mapper > |
java代碼:
1
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
package com.dao; import com.model.Address; import com.model.Pager; import java.util.HashMap; import java.util.Map; /** * Created by nl101 on 2016/2/23. */ public class AddressDao extends BaseDao<Address> { public static void main(String[] args) { AddressDao addressDao = new AddressDao(); Pager<Address> pagers = addressDao.list( 1 ); System.out.println(pagers.getDatas().size()); } /** * 加載一個地址 * @param id 要加載地址的id * @return 返回要加載的地址,null則加載失敗 */ public Address load( int id){ return super .load(Address. class ,id); } /** * 添加一個地址 * @param address 要添加的地址 * @param user_id 要添加的地址對應的user_id * @return true成功 */ public boolean add(Address address, int user_id){ UserDao userDao = new UserDao(); if (userDao.load(user_id)== null ){ return false ; } return super .add(address); } /** * 刪除一個地址 * @param id 要刪除地址對應的id * @return true刪除成功 */ public boolean delete( int id){ return super .delete(Address. class ,id); } /** * 更新一個地址 * @param address 要更新的地址 * @return true更新成功 */ public boolean update(Address address){ return super .update(address); } /** * 根據用戶id取出該用戶所有地址 * @param user_id * @return */ public Pager<Address> list( int user_id){ Map<String,Object> maps = new HashMap<>(); maps.put( "user_id" ,user_id); return super .list(Address. class ,maps); } } |
ADO層按照這樣寫,就沒問題了。
以上就是本文的全部內容,整個javaweb商城項目開發就為大家分享到這,希望對大家的學習有所幫助。