国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

javaweb實戰之商城項目開發(三)

2019-11-26 14:32:56
字體:
來源:轉載
供稿:網友

接著上一篇《javaweb實戰之商城項目開發(二)》這一篇主要實現通用的BaseDao.java和使用resultMap映射關聯對象

一.通用的BaseDao.java

既然要大家都能用,所以使用了泛型.其中要注意的問題就是類似User.getClass().getName()這樣的代碼是需要修改的.修改方法就是使用參數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> {  /**   * 根據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也需要相應的修改

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的實體類,如下

  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

<!--加載一個地址-->  <!--這里需要表連接,取出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

<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方法,把屬性設置到實體類中.

測試

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代碼:

<?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代碼:

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商城項目開發就為大家分享到這,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 杨浦区| 布拖县| 阳高县| 阜新| 通渭县| 济源市| 霞浦县| 二手房| 天台县| 萨嘎县| 山阳县| 景德镇市| 盘山县| 永安市| 峨边| 包头市| 科技| 山阳县| 吉林市| 高尔夫| 佛教| 新宾| 当阳市| 沙湾县| 东阿县| 万盛区| 石河子市| 镇平县| 基隆市| 集贤县| 宝鸡市| 葵青区| 阜康市| 蒙阴县| 福安市| 彰化市| 婺源县| 格尔木市| 竹溪县| 灵宝市| 汶川县|