MyBatis分頁(yè)插件的使用和抽象對(duì)象之間的轉(zhuǎn)換關(guān)系

MyBatis分頁(yè)插件的使用和抽象對(duì)象之間的轉(zhuǎn)換關(guān)系

抽象POJO鼓蜒、BO蝗茁、VO對(duì)象之間的轉(zhuǎn)換關(guān)系

各種對(duì)象關(guān)系轉(zhuǎn)換.png

例:產(chǎn)品管理中部分操作娜汁,當(dāng)需要返回的信息跟pojo不一樣時(shí)筏养,創(chuàng)建一個(gè)新的vo(value Ojbect)對(duì)象斧抱,再將其組裝返回個(gè)前端。

POJO:

Product:

public class Product {
    private Integer id;

    private Integer categoryId;

    private String name;

    private String subtitle;

    private String mainImage;

    private String subImages;

    private String detail;

    private BigDecimal price;

    private Integer stock;

    private Integer status;

    private Date createTime;

    private Date updateTime;
}

VO(value Object):

ProductDetailVo:

public class ProductDetailVo {

    private Integer id;
    private Integer categoryId;
    private String name;
    private String subtitle;
    private String mainImage;
    private String subImages;
    private String detail;
    private BigDecimal price;
    private Integer stock;
    private Integer status;
    private String createTime;
    private String updateTime;
    private String imageHost;
    private Integer parentCategoryId;
}

ProductListVo:

public class ProductListVo {

    private Integer id;
    private Integer categoryId;

    private String name;
    private String subtitle;
    private String mainImage;
    private BigDecimal price;

    private Integer status;
    private String imageHost;
}

ProductManageController:

/**
 * 獲取產(chǎn)品詳情
 * @param session
 * @param productId
 * @return
 */
@RequestMapping("detail.do")
@ResponseBody
public ServerResponse getDetail(HttpSession session, Integer productId){
    User user = (User) session.getAttribute(Const.CURRENT_USER);
    if(user == null){
        return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),"用戶(hù)未登錄渐溶,請(qǐng)登錄管理員");
    }
    if(iUserService.checkAdminRole(user).isSuccess()){
        return iProductService.manageProductDetail(productId);
    }else {
        return ServerResponse.createByErrorMessage("無(wú)權(quán)限操作");
    }

}

/**
 * 獲取產(chǎn)品列表
 * @param session
 * @param pageNum 第幾頁(yè)
 * @param pageSize 每頁(yè)顯示多少條
 * @return
 */
@RequestMapping("list.do")
@ResponseBody
public ServerResponse getList(HttpSession session,
                              @RequestParam(value = "pageNum",defaultValue = "1") int pageNum,
                              @RequestParam(value = "pageSize",defaultValue = "10") int pageSize){
    User user = (User) session.getAttribute(Const.CURRENT_USER);
    if(user == null){
        return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),"用戶(hù)未登錄辉浦,請(qǐng)登錄管理員");
    }
    if(iUserService.checkAdminRole(user).isSuccess()){
        return iProductService.getProductList(pageNum,pageSize);
    }else {
        return ServerResponse.createByErrorMessage("無(wú)權(quán)限操作");
    }

}

/**
 * 產(chǎn)品搜索
 * @param session
 * @param productName
 * @param productId
 * @param pageNum
 * @param pageSize
 * @return
 */
@RequestMapping("search.do")
@ResponseBody
public ServerResponse productSearch(HttpSession session,String productName,Integer productId,
                              @RequestParam(value = "pageNum",defaultValue = "1") int pageNum,
                              @RequestParam(value = "pageSize",defaultValue = "10") int pageSize){
    User user = (User) session.getAttribute(Const.CURRENT_USER);
    if(user == null){
        return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),"用戶(hù)未登錄,請(qǐng)登錄管理員");
    }
    if(iUserService.checkAdminRole(user).isSuccess()){
        return iProductService.searchProduct(productName,productId,pageNum,pageSize);
    }else {
        return ServerResponse.createByErrorMessage("無(wú)權(quán)限操作");
    }

}

serviceImpl:

@Override
public ServerResponse<ProductDetailVo> manageProductDetail(Integer productId){
    if(productId == null){
        return ServerResponse.createByErrorCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(),
                ResponseCode.ILLEGAL_ARGUMENT.getDesc());
    }
    Product product = productMapper.selectByPrimaryKey(productId);
    if(product == null){
        return ServerResponse.createByErrorMessage("產(chǎn)品已下架或者刪除");
    }
    //VO對(duì)象:value Object
    //pojo--->bo(business object)--->vo(view object)
    ProductDetailVo productDetailVo = assembleProductDetailVo(product);
    return ServerResponse.createBySuccess(productDetailVo);

}

private ProductDetailVo assembleProductDetailVo(Product product){
    ProductDetailVo productDetailVo = new ProductDetailVo();
    productDetailVo.setId(product.getId());
    productDetailVo.setSubtitle(product.getSubtitle());
    productDetailVo.setPrice(product.getPrice());
    productDetailVo.setMainImage(product.getMainImage());
    productDetailVo.setSubImages(product.getSubImages());
    productDetailVo.setCategoryId(product.getCategoryId());
    productDetailVo.setDetail(product.getDetail());
    productDetailVo.setName(product.getName());
    productDetailVo.setStatus(product.getStatus());
    productDetailVo.setStock(product.getStock());

    //imageHost:從配置文件中獲取茎辐,不需要把url硬編碼到項(xiàng)目中宪郊,如果圖片服務(wù)器修改了掂恕,只需要修改配置文件
    productDetailVo.setImageHost(PropertiesUtil.getProperty("ftp.server.http.prefix","http://img.happymmall.com/"));
    //parentCategoryId
    Category category = categoryMapper.selectByPrimaryKey(product.getCategoryId());
    if(category == null){
        //默認(rèn)根節(jié)點(diǎn)
        productDetailVo.setParentCategoryId(0);
    }else {
        productDetailVo.setParentCategoryId(category.getParentId());
    }

    //createTime
    productDetailVo.setCreateTime(DateTimeUtil.dateToStr(product.getCreateTime()));

    //updateTime
    productDetailVo.setUpdateTime(DateTimeUtil.dateToStr(product.getUpdateTime()));

    return productDetailVo;
}

pageHelper的使用方法:

(1)記錄起始頁(yè)startPage
(2)填充sql查詢(xún)邏輯
(3)收尾

@Override
public ServerResponse<PageInfo> getProductList(int pageNum,int pageSize){
    //1.記錄起始頁(yè)startPage
    PageHelper.startPage(pageNum,pageSize);
    //2.填充sql查詢(xún)邏輯
    List<Product> productList = productMapper.selectList();

    List<ProductListVo> productListVoList = Lists.newArrayList();
    for(Product productItem : productList){
        ProductListVo productListVo = assembleProductListVo(productItem);
        productListVoList.add(productListVo);
    }
    //3.收尾
    PageInfo pageResult = new PageInfo(productList);
    //把list重置
    pageResult.setList(productListVoList);
    return ServerResponse.createBySuccess(pageResult);

}

/**
 * 組裝productListVo
 * @param product
 * @return
 */
private ProductListVo assembleProductListVo(Product product){
    ProductListVo productListVo = new ProductListVo();
    productListVo.setId(product.getId());
    productListVo.setCategoryId(product.getCategoryId());
    productListVo.setImageHost(PropertiesUtil.getProperty("ftp.server.http.prefix","http://img.happymmall.com/"));
    productListVo.setMainImage(product.getMainImage());
    productListVo.setPrice(product.getPrice());
    productListVo.setSubtitle(product.getSubtitle());
    productListVo.setStatus(product.getStatus());
    return productListVo;
}

mybatis.xml:

  <select id="selectList" resultMap="BaseResultMap" >
    SELECT <include refid="Base_Column_List"/>
    FROM mmall_product
    ORDER BY id ASC
  </select>

  <select id="selectByNameAndProductId" resultMap="BaseResultMap" parameterType="map">
    SELECT <include refid="Base_Column_List" />
    FROM mmall_product
    <where>
      <if test="productName!=null">
        AND name LIKE #{productName}
      </if>
      <if test="productId!=null">
        AND id=#{productId}
      </if>
    </where>
  </select>

為了防止硬編碼,在獲取圖片url時(shí)弛槐,使用了配置文件:

hcxmall.properties:

ftp.server.ip=
ftp.user=hcxmallftp
ftp.pass=ftppassword
#搭建的圖片服務(wù)器的前綴
ftp.server.http.prefix=http://img.happymmall.com/

alipay.callback.url=http://www.happymmall.com/order/alipay_callback.do

password.salt = geelysdafaqj23ou89ZXcj@#$@#$#@KJdjklj;D../dSF.,

因?yàn)榕渲梦募锏臇|西會(huì)在多處用到懊亡,每一次都要讀取,所以封裝了一個(gè)使用流讀取配置文件的工具類(lèi)PropertiesUtil:

package com.hcxmall.util;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

/**
 * 配置文件工具類(lèi)
 * @author HCX
 * @create 2017 - 11 - 15 18:28
 */
public class PropertiesUtil {

    private static Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);

    private static Properties props;

    //在tomcat啟動(dòng)時(shí)讀取里面的配置:使用靜態(tài)代碼塊
    //執(zhí)行順序:靜態(tài)代碼塊(在類(lèi)被加載的時(shí)候執(zhí)行且僅執(zhí)行一次)>普通代碼塊>構(gòu)造代碼塊
    //靜態(tài)代碼塊:一般用于初始化靜態(tài)變量乎串。
    static{
        String fileName = "hcxmall.properties";
        props = new Properties();
        try {
            props.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName),"UTF-8"));
        } catch (IOException e) {
            logger.error("配置文件讀取異常",e);
        }
    }

    /**
     * 獲取hcxmall.propeties文件中的信息:通過(guò)key獲取value
     * @param key
     * @return
     */
    public static String getProperty(String key){
        String value = props.getProperty(key.trim());
        if(StringUtils.isBlank(value)){
        return null;
    }
        return value.trim();
}

    public static String getProperty(String key,String defaultValue){
        String value = props.getProperty(key.trim());
        if(StringUtils.isBlank(value)){
            value = defaultValue;
        }
        return value.trim();
    }
}

在進(jìn)行時(shí)間的轉(zhuǎn)換時(shí)店枣,也可使用工具類(lèi),其中叹誉,應(yīng)用joda-time實(shí)現(xiàn):

DateTimeUtil:

package com.hcxmall.util;

import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.util.Date;

/**
 * 時(shí)間轉(zhuǎn)換工具類(lèi)
 *
 * @author HCX
 * @create 2017 - 11 - 15 18:57
 */
public class DateTimeUtil {

    public static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";

    //joda-time

    public static Date strToDate(String dateTimeStr){
        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(STANDARD_FORMAT);
        DateTime dateTime = dateTimeFormatter.parseDateTime(dateTimeStr);
        return dateTime.toDate();
        //strToDate("2010-01-01 11:11:11","yyyy-MM-dd HH:mm:ss"); Fri Jan 01 11:11:11 CST 2010
    }


    public static String dateToStr(Date date){
        if(date == null){
            return StringUtils.EMPTY;
        }
        DateTime dateTime = new DateTime(date);
        return dateTime.toString(STANDARD_FORMAT);
        //dateToStr(new Date(),"yyyy-MM-dd HH:mm:ss"); 2017-11-15 19:15:50
    }

    /**
     * 字符串轉(zhuǎn)date
     * @param dateTimeStr
     * @param formatStr
     * @return
     */
    public static Date strToDate(String dateTimeStr,String formatStr){
        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(formatStr);
        DateTime dateTime = dateTimeFormatter.parseDateTime(dateTimeStr);
        return dateTime.toDate();
        //strToDate("2010-01-01 11:11:11","yyyy-MM-dd HH:mm:ss"); Fri Jan 01 11:11:11 CST 2010
    }

    /**
     * date轉(zhuǎn)字符串
     * @param date
     * @param formatStr 要轉(zhuǎn)化成的格式 例:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String dateToStr(Date date,String formatStr){
        if(date == null){
            return StringUtils.EMPTY;
        }
        DateTime dateTime = new DateTime(date);
        return dateTime.toString(formatStr);
        //dateToStr(new Date(),"yyyy-MM-dd HH:mm:ss"); 2017-11-15 19:15:50
    }
}

在上面實(shí)現(xiàn)屬性的拷貝時(shí)鸯两,頻繁的編寫(xiě)get()和set()方法,此時(shí)长豁,也可以使用工具類(lèi)來(lái)完成

pom.xml:

<!--分頁(yè)插件-->
<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>4.1.0</version>
</dependency>

<!--時(shí)間處理jar-->
<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.3</version>
</dependency>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钧唐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匠襟,更是在濱河造成了極大的恐慌逾柿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宅此,死亡現(xiàn)場(chǎng)離奇詭異机错,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)父腕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)弱匪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人璧亮,你說(shuō)我怎么就攤上這事萧诫。” “怎么了枝嘶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵帘饶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我群扶,道長(zhǎng)及刻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任竞阐,我火速辦了婚禮缴饭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骆莹。我一直安慰自己颗搂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布幕垦。 她就那樣靜靜地躺著丢氢,像睡著了一般傅联。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疚察,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天蒸走,我揣著相機(jī)與錄音,去河邊找鬼稍浆。 笑死载碌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衅枫。 我是一名探鬼主播嫁艇,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼弦撩!你這毒婦竟也來(lái)了步咪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤益楼,失蹤者是張志新(化名)和其女友劉穎猾漫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體感凤,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悯周,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年前塔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晃虫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兔魂,死狀恐怖族跛,靈堂內(nèi)的尸體忽然破棺而出闰挡,到底是詐尸還是另有隱情,我是刑警寧澤礁哄,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布长酗,位于F島的核電站,受9級(jí)特大地震影響桐绒,放射性物質(zhì)發(fā)生泄漏夺脾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一掏膏、第九天 我趴在偏房一處隱蔽的房頂上張望劳翰。 院中可真熱鬧,春花似錦馒疹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)生均。三九已至,卻和暖如春腥刹,著一層夾襖步出監(jiān)牢的瞬間马胧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工衔峰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佩脊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓垫卤,卻偏偏與公主長(zhǎng)得像威彰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穴肘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理歇盼,服務(wù)發(fā)現(xiàn),斷路器评抚,智...
    卡卡羅2017閱讀 134,667評(píng)論 18 139
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 豹缀? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,523評(píng)論 0 4
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,823評(píng)論 6 342
  • 我是在老家讀完初中慨代,沒(méi)有上高中邢笙,雖然自己高中也是能考上的,但是沒(méi)有去上侍匙,跑到廣州來(lái)讀中專(zhuān)了氮惯,我的第一個(gè)同桌不是她,...
    huangjiajia閱讀 283評(píng)論 0 0
  • 首先問(wèn)個(gè)簡(jiǎn)單的問(wèn)題:“錢(qián)和小孩哪個(gè)重要丈积?只選其一筐骇。”我想百分之百的會(huì)選擇小孩吧江滨!但我告訴你:錯(cuò)铛纬!現(xiàn)實(shí)中的答案是錢(qián)。...
    番石榴閱讀 412評(píng)論 4 3