接著上一篇《javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(二)》這一篇主要實(shí)現(xiàn)通用的BaseDao.java和使用resultMap映射關(guān)聯(lián)對(duì)象
一.通用的BaseDao.java
既然要大家都能用,所以使用了泛型.其中要注意的問(wèn)題就是類似User.getClass().getName()這樣的代碼是需要修改的.修改方法就是使用參數(shù)Class tc傳遞過(guò)來(lái),然后在使用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> { /** * 根據(jù)id取出一個(gè)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; } /** * 添加一個(gè)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 ; } /** *根據(jù)id刪除T類型 * @param id 要?jiǎng)h除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 ; } /** * 根據(jù)指定條件分頁(yè)查詢 * @param maps 指定條件集合 * @return */ public Pager<T> find(Class<T> t,Map<String,Object> maps){ int pageStart = SystemContext.getPageStart(); //分頁(yè)起始 int pageSize = SystemContext.getPageSize(); //分頁(yè)大小 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); //獲取記錄總數(shù) pagers.setTotalRecord(totalRecord); pagers.setPageIndex(pageStart/pageSize+ 1 ); } finally { SessionUtil.closeSession(session); } return pagers; } /** * 根據(jù)指定條件取出部分?jǐn)?shù)據(jù) * @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也需要相應(yīng)的修改
1
2
3
4
5
6
7
8
9
10
11
12
|
public class UserDao extends BaseDao<User>{ /** * 根據(jù)id取出一個(gè)用戶 * @param id 要取出用戶的id * @return */ public User load( int id){ return super .load(User. class ,id); } /* 其他函數(shù)就不一一貼出來(lái)了,都是類似的寫法*/ } |
二.resultMap的映射
簡(jiǎn)單來(lái)說(shuō)當(dāng)數(shù)據(jù)庫(kù)中的字段信息和對(duì)象的屬性不一致時(shí)需要通過(guò)resultMap來(lái)映射.
舉個(gè)例子:Address屬性中有一個(gè)User的實(shí)體類,如下
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對(duì)象,來(lái)代替user_id private User user; ````````` } |
那么我們想取出來(lái)一個(gè)Address的同時(shí)也取出其對(duì)應(yīng)的user,然而這是兩個(gè)對(duì)象,且兩者都有id屬性,所以對(duì)于mybatis在調(diào)用set方法設(shè)置屬性時(shí)就會(huì)混亂而使用resultMap的目的就是消除這種混亂.
編寫load的sql
1
2
3
4
5
6
|
<! --加載一個(gè)地址--> <! --這里需要表連接,取出User,又連接保證取出的地址不為空,并且為重復(fù)屬性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來(lái)映射,這個(gè)resultMap的名字叫做addressMap.
addressMap
1
2
3
4
5
6
7
8
9
10
11
12
|
<resultMap id= "addressMap" type= "Address" autoMapping= "true" > <!--把結(jié)果中的a_id映射為id,其他的autoMapping = true 會(huì)自動(dòng)匹配--> <id column= "a_id" property= "id" /> <!--取出關(guān)聯(lián)屬性--> <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 代表其類型,不包括關(guān)聯(lián)屬性
- autoMapping true表示消除沖突后,剩下的屬性會(huì)自動(dòng)匹配
- id和result id 和 result 都映射一個(gè)單獨(dú)列的值到簡(jiǎn)單數(shù)據(jù)類型,不同是 id 表示的結(jié)果將是當(dāng)比較對(duì)象實(shí)例時(shí)用到的標(biāo)識(shí)屬性,一般是主鍵
- association 代表關(guān)聯(lián)屬性,這里設(shè)置的是User,對(duì)于關(guān)聯(lián)映射,其里面想要顯示的屬性必須要手動(dòng)指定property,不然會(huì)無(wú)法映射
上面配置完,當(dāng)搜索出來(lái)的時(shí)候,mybatis就會(huì)自動(dòng)調(diào)用其相應(yīng)的set方法,把屬性設(shè)置到實(shí)體類中.
測(cè)試
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()); } /** * 加載一個(gè)地址 * @param id 要加載地址的id * @return 返回要加載的地址,null則加載失敗 */ public Address load( int id){ return super .load(Address. class ,id); } } |
效果圖可以看出來(lái),只要是映射的關(guān)聯(lián)屬性都取出來(lái)了,沒(méi)映射的都為null
按照這樣的想法把其他函數(shù)補(bǔ)全
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" > <!--當(dāng)數(shù)據(jù)庫(kù)中的字段信息和對(duì)象的屬性不一致時(shí)需要通過(guò)resultMap來(lái)映射 --> < resultMap id = "addressMap" type = "Address" autoMapping = "true" > <!--把結(jié)果中的a_id映射為id,其他的autoMapping = true會(huì)自動(dòng)匹配--> < id column = "a_id" property = "id" /> <!--取出關(guān)聯(lián)屬性--> < 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 > <!--加載一個(gè)地址--> <!--這里需要表連接,取出User,又連接保證取出的地址不為空,并且為重復(fù)屬性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 > <!--增加一個(gè)地址--> < insert id = "add" parameterType = "Address" > insert into address values (null,#{name},#{phone},#{postcode},${user_id}) </ insert > <!--刪除一個(gè)地址--> < delete id = "delete" parameterType = "int" > DELETE FROM address WHERE id=#{id} </ delete > <!--修改一個(gè)地址--> < 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()); } /** * 加載一個(gè)地址 * @param id 要加載地址的id * @return 返回要加載的地址,null則加載失敗 */ public Address load( int id){ return super .load(Address. class ,id); } /** * 添加一個(gè)地址 * @param address 要添加的地址 * @param user_id 要添加的地址對(duì)應(yīng)的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); } /** * 刪除一個(gè)地址 * @param id 要?jiǎng)h除地址對(duì)應(yīng)的id * @return true刪除成功 */ public boolean delete( int id){ return super .delete(Address. class ,id); } /** * 更新一個(gè)地址 * @param address 要更新的地址 * @return true更新成功 */ public boolean update(Address address){ return super .update(address); } /** * 根據(jù)用戶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層按照這樣寫,就沒(méi)問(wèn)題了。
以上就是本文的全部?jī)?nèi)容,整個(gè)javaweb商城項(xiàng)目開發(fā)就為大家分享到這,希望對(duì)大家的學(xué)習(xí)有所幫助。