一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(三)

javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(三)

2020-04-03 14:38茶飲月 JAVA教程

這篇文章主要針對(duì)javaweb商城項(xiàng)目開發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),主要實(shí)現(xiàn)通用的BaseDao.java和使用resultMap映射關(guān)聯(lián)對(duì)象,感興趣的小伙伴們可以參考一下

接著上一篇《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

javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(三)

按照這樣的想法把其他函數(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í)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩日韩日韩手机看片自拍 | 草莓视频在线免费观看 | 2018成年动漫在线观看 | 日韩欧美中文字幕出 | 亚洲国产99在线精品一区二区 | 青草国产| 国产123区 | 2015台湾永久免费平台 | 亚洲网视频 | 亚洲色图综合网 | 视频在线观看一区二区 | 国产午夜亚洲精品 | 成人福利在线播放 | chinese圣水黄金调教 | 向日葵视频app下载18岁以下勿看 | 免费一级国产生活片 | 天天欲色成人综合网站 | 免费看一级 | 91人人在线 | 日韩国产成人精品视频人 | 白丝女仆被啪到深夜漫画 | 欧美一区二区三区大片 | 免费一级欧美片片线观看 | 香蕉久久久久 | 天天操天天射天天爽 | 第一次做m被调教经历 | 午夜福利体验免费体验区 | 四虎影视884aa·com | 免费国产好深啊好涨好硬视频 | 日韩精品成人a在线观看 | 精品国产一级在线观看 | 韩国漂亮美女三级在线观看 | 免费观看日本视频 | 亚欧毛片基地国产毛片基地 | 男人天堂网站在线 | 性bbwbbwbbwbbw撒尿 | 国模大胆一区二区三区 | 999热在线精品观看全部 | 亚洲麻豆精品果冻传媒 | 亚洲上最大成网人站4438 | 九九99九九精彩 |