最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年08月31日 15:12:21   作者:茶飲月  
這篇文章主要針對(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

既然要大家都能用,所以使用了泛型.其中要注意的問題就是類似User.getClass().getName()這樣的代碼是需要修改的.修改方法就是使用參數(shù)Class tc傳遞過來,然后在使用tc.getName()即可.

完整代碼:

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ù)指定條件分頁查詢
   * @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);//獲取記錄總數(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)的修改

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ù)就不一一貼出來了,都是類似的寫法*/
}

二.resultMap的映射

簡(jiǎn)單來說當(dāng)數(shù)據(jù)庫中的字段信息和對(duì)象的屬性不一致時(shí)需要通過resultMap來映射.
舉個(gè)例子:Address屬性中有一個(gè)User的實(shí)體類,如下

  public class Address {
  private int id;
  private String name;
  private String phone;
  private String postcode;
  //直接給user對(duì)象,來代替user_id
  private User user;
    `````````
}

那么我們想取出來一個(gè)Address的同時(shí)也取出其對(duì)應(yīng)的user,然而這是兩個(gè)對(duì)象,且兩者都有id屬性,所以對(duì)于mybatis在調(diào)用set方法設(shè)置屬性時(shí)就會(huì)混亂而使用resultMap的目的就是消除這種混亂.

編寫load的sql

<!--加載一個(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來映射,這個(gè)resultMap的名字叫做addressMap.

addressMap

<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ì)無法映射

上面配置完,當(dāng)搜索出來的時(shí)候,mybatis就會(huì)自動(dòng)調(diào)用其相應(yīng)的set方法,把屬性設(shè)置到實(shí)體類中.

測(cè)試

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);
  }
}

效果圖可以看出來,只要是映射的關(guān)聯(lián)屬性都取出來了,沒映射的都為null

按照這樣的想法把其他函數(shù)補(bǔ)全

xml代碼:

<?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ù)庫中的字段信息和對(duì)象的屬性不一致時(shí)需要通過resultMap來映射 -->
  <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代碼:

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層按照這樣寫,就沒問題了。

以上就是本文的全部內(nèi)容,整個(gè)javaweb商城項(xiàng)目開發(fā)就為大家分享到這,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 解析Tomcat 6、7在EL表達(dá)式解析時(shí)存在的一個(gè)Bug

    解析Tomcat 6、7在EL表達(dá)式解析時(shí)存在的一個(gè)Bug

    這篇文章主要是對(duì)Tomcat 6、7在EL表達(dá)式解析時(shí)存在的一個(gè)Bug進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-12-12
  • 使用jdk7的nio2操作文件拷貝和剪切示例

    使用jdk7的nio2操作文件拷貝和剪切示例

    使用jdk7的NIO2進(jìn)行文件或文件夾的拷貝移動(dòng)操作??梢宰詣?dòng)創(chuàng)建路徑,差異化更新文件,簡(jiǎn)單的出錯(cuò)重連機(jī)制
    2014-01-01
  • SpringBoot2.0整合WebSocket代碼實(shí)例

    SpringBoot2.0整合WebSocket代碼實(shí)例

    這篇文章主要介紹了SpringBoot2.0整合WebSocket代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java加密解密工具(適用于JavaSE/JavaEE/Android)

    Java加密解密工具(適用于JavaSE/JavaEE/Android)

    這篇文章主要介紹了Java加密解密工具,適用于JavaSE/JavaEE/Android,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Java中的自旋鎖spinlock詳解

    Java中的自旋鎖spinlock詳解

    這篇文章主要介紹了Java中的自旋鎖spinlock詳解,自旋鎖就是循環(huán)嘗試獲取鎖,不會(huì)放棄CPU時(shí)間片,減傷cup上下文切換,缺點(diǎn)是循環(huán)會(huì)消耗cpu,需要的朋友可以參考下
    2024-01-01
  • Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼

    Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼

    本篇文章主要介紹了Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-05-05
  • SpringBoot2底層注解@Configuration配置類詳解

    SpringBoot2底層注解@Configuration配置類詳解

    這篇文章主要為大家介紹了SpringBoot2底層注解@Configuration配置類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • java 在圖片上寫字,兩個(gè)圖片合并的實(shí)現(xiàn)方法

    java 在圖片上寫字,兩個(gè)圖片合并的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava 在圖片上寫字,兩個(gè)圖片合并的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • Javafx實(shí)現(xiàn)國際象棋游戲

    Javafx實(shí)現(xiàn)國際象棋游戲

    這篇文章主要為大家詳細(xì)介紹了Javafx實(shí)現(xiàn)國際象棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Bean的自動(dòng)注入及循環(huán)依賴問題

    Bean的自動(dòng)注入及循環(huán)依賴問題

    本文詳細(xì)介紹了Bean的自動(dòng)注入及循環(huán)依賴,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)有一定的研究價(jià)值,感興趣的小伙伴可以閱讀參考
    2023-03-03

最新評(píng)論

许昌市| 南投县| 唐山市| 扶沟县| 永新县| 琼海市| 连平县| 织金县| 乌鲁木齐县| 孝感市| 呼伦贝尔市| 邯郸市| 麦盖提县| 安龙县| 呼伦贝尔市| 航空| 井冈山市| 昌图县| 巫山县| 蒲城县| 怀宁县| 清远市| 大关县| 阜南县| 黑龙江省| 普定县| 新宁县| 嘉鱼县| 平昌县| 湘西| 莱州市| 江孜县| 德清县| 无锡市| 清徐县| 延长县| 江永县| 石狮市| 太和县| 兰州市| 溧水县|