javaweb實戰(zhàn)之商城項目開發(fā)(三)
接著上一篇《javaweb實戰(zhàn)之商城項目開發(fā)(二)》這一篇主要實現(xiàn)通用的BaseDao.java和使用resultMap映射關(guān)聯(lián)對象
一.通用的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取出一個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; } /** *根據(jù)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; } /** * 根據(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ù)指定條件取出部分數(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取出一個用戶 * @param id 要取出用戶的id * @return */ public User load(int id){ return super.load(User.class,id); } /* 其他函數(shù)就不一一貼出來了,都是類似的寫法*/ }
二.resultMap的映射
簡單來說當(dāng)數(shù)據(jù)庫中的字段信息和對象的屬性不一致時需要通過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的同時也取出其對應(yīng)的user,然而這是兩個對象,且兩者都有id屬性,所以對于mybatis在調(diào)用set方法設(shè)置屬性時就會混亂而使用resultMap的目的就是消除這種混亂.
編寫load的sql
<!--加載一個地址--> <!--這里需要表連接,取出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來映射,這個resultMap的名字叫做addressMap.
addressMap
<resultMap id="addressMap" type="Address" autoMapping="true"> <!--把結(jié)果中的a_id映射為id,其他的autoMapping = true會自動匹配--> <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表示消除沖突后,剩下的屬性會自動匹配
- id和result id 和 result 都映射一個單獨列的值到簡單數(shù)據(jù)類型,不同是 id 表示的結(jié)果將是當(dāng)比較對象實例時用到的標(biāo)識屬性,一般是主鍵
- association 代表關(guān)聯(lián)屬性,這里設(shè)置的是User,對于關(guān)聯(lián)映射,其里面想要顯示的屬性必須要手動指定property,不然會無法映射
上面配置完,當(dāng)搜索出來的時候,mybatis就會自動調(diào)用其相應(yīng)的set方法,把屬性設(shè)置到實體類中.
測試
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); } }
效果圖可以看出來,只要是映射的關(guān)聯(lián)屬性都取出來了,沒映射的都為null
按照這樣的想法把其他函數(shù)補全
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ù)庫中的字段信息和對象的屬性不一致時需要通過resultMap來映射 --> <resultMap id="addressMap" type="Address" autoMapping="true"> <!--把結(jié)果中的a_id映射為id,其他的autoMapping = true會自動匹配--> <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> <!--加載一個地址--> <!--這里需要表連接,取出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> <!--增加一個地址--> <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 要添加的地址對應(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); } /** * 刪除一個地址 * @param id 要刪除地址對應(yīng)的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); } /** * 根據(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)容,整個javaweb商城項目開發(fā)就為大家分享到這,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
Spring框架+jdbcTemplate實現(xiàn)增刪改查功能
這篇文章主要介紹了Spring框架+jdbcTemplate實現(xiàn)增刪改查功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09詳解Java如何實現(xiàn)百萬數(shù)據(jù)excel導(dǎo)出功能
這篇文章主要為大家詳細介紹了Java如何實現(xiàn)百萬數(shù)據(jù)excel導(dǎo)出功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下2023-02-02Java編程synchronized與lock的區(qū)別【推薦】
互聯(lián)網(wǎng)信息泛濫環(huán)境下少有的良心之作!如果您想對Java編程synchronized與lock的區(qū)別有所了解,這篇文章絕對值得!分享給大家,供需要的朋友參考。不說了,我先學(xué)習(xí)去了。2017-10-10