07.訂單操作
09.權限控制
10.權限關聯與控制
11.AOP日志
07.訂單操作
SSM訂單操作
表結構分析
productId描述了訂單與產品之間的關系。
memberid描述了訂單與會員之間的關系。
創建表sql
-- 訂單 drop table orders; CREATE TABLE orders( id varchar2(32) default SYS_GUID() PRIMARY KEY, orderNum VARCHAR2(20) NOT NULL UNIQUE, orderTime timestamp, peopleCount INT, orderDesc VARCHAR2(500), payType INT, orderStatus INT, productId varchar2(32), memberId varchar2(32), FOREIGN KEY (productId) REFERENCES product(id), FOREIGN KEY (memberId) REFERENCES member(id) ) insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('0E7231DC797C486290E8713CA3C6ECCC', '12345', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '676C5BD1D35E429A8C2E114939C5685A', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('5DC6A48DD4E94592AE904930EA866AFA', '54321', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '676C5BD1D35E429A8C2E114939C5685A', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('2FF351C4AC744E2092DCF08CFD314420', '67890', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('A0657832D93E4B10AE88A2D4B70B1A28', '98765', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('E4DD4C45EED84870ABA83574A801083E', '11111', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('96CC8BD43C734CC2ACBFF09501B4DD5D', '22222', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('55F9AF582D5A4DB28FB4EC3199385762', '33333', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('CA005CF1BE3C4EF68F88ABC7DF30E976', '44444', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('3081770BC3984EF092D9E99760FDABDE', '55555', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '沒什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB');
創建表sql
-- 會員 drop table member; CREATE TABLE member( id varchar2(32) default SYS_GUID() PRIMARY KEY, NAME VARCHAR2(20), nickname VARCHAR2(20), phoneNum VARCHAR2(20), email VARCHAR2(20) ); insert into MEMBER (id, name, nickname, phonenum, email) values ('E61D65F673D54F68B0861025C69773DB', '張三', '小三', '18888888888', 'zs@163.com');
創建表sql
-- 旅客 drop table traveller; CREATE TABLE traveller( id varchar2(32) default SYS_GUID() PRIMARY KEY, NAME VARCHAR2(20), sex VARCHAR2(20), phoneNum VARCHAR2(20), credentialsType INT, credentialsNum VARCHAR2(50), travellerType INT ) insert into TRAVELLER (id, name, sex, phonenum, credentialstype, credentialsnum, travellertype) values ('3FE27DF2A4E44A6DBC5D0FE4651D3D3E', '張龍', '男', '13333333333', 0, '123456789009876543', 0); insert into TRAVELLER (id, name, sex, phonenum, credentialstype, credentialsnum, travellertype) values ('EE7A71FB6945483FBF91543DBE851960', '張小龍', '男', '15555555555', 0, '987654321123456789', 1);
旅客與訂單之間是多對多關系,所以我們需要一張中間表(order_traveller)來描述。
創建表sql
-- 訂單與旅客中間表 drop table order_traveller; CREATE TABLE order_traveller( orderId varchar2(32), travellerId varchar2(32), PRIMARY KEY (orderId,travellerId), FOREIGN KEY (orderId) REFERENCES orders(id), FOREIGN KEY (travellerId) REFERENCES traveller(id) ) insert into ORDER_TRAVELLER (orderid, travellerid) values ('0E7231DC797C486290E8713CA3C6ECCC', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('2FF351C4AC744E2092DCF08CFD314420', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('3081770BC3984EF092D9E99760FDABDE', 'EE7A71FB6945483FBF91543DBE851960'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('55F9AF582D5A4DB28FB4EC3199385762', 'EE7A71FB6945483FBF91543DBE851960'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('5DC6A48DD4E94592AE904930EA866AFA', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('96CC8BD43C734CC2ACBFF09501B4DD5D', 'EE7A71FB6945483FBF91543DBE851960'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('A0657832D93E4B10AE88A2D4B70B1A28', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('CA005CF1BE3C4EF68F88ABC7DF30E976', 'EE7A71FB6945483FBF91543DBE851960'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('E4DD4C45EED84870ABA83574A801083E', 'EE7A71FB6945483FBF91543DBE851960');
1.訂單操作-查詢所有訂單流程分析
2.訂單操作-查詢所有訂單代碼實現1
在數據庫中創建完所需的TABLE並且insert into 必要的數據后,我們就要寫DAO層的實體類。
多與多對應關系的中間表沒有實體類。
在子模塊heima_ssm_domain下創建以下的3個實體類:
Orders
Member
Traveller
在子模塊heima_ssm_web下創建控制類OrdersController
在子模塊heima_ssm_service下創建接口和實現類 IOrdersService 和 OrdersServiceImpl
在子模塊heima_ssm_dao下創建 IOrdersDao接口類供mybatis框架基於注解寫sql語句
3.訂單操作-查詢所有訂單代碼實現2
DAO層的接口上在 @Select注解的下一行有必要聲明查詢的主鍵。
注解@Results ,使用這個注解來實現屬性映射對應關系。
public interface IProductDao { //查詢所有產品 @Select("select * from product") public List<Product> findAll() throws Exception; //增添產品 @Insert({"insert into product(productNum,productName,cityName,departureTime,productPrice,productDesc,productStatus)", "values(#{productNum},#{productName},#{cityName},#{departureTime},#{productPrice},#{productDesc},#{productStatus})"}) public void save(Product product); //刪除產品通過產品的ID屬性值。 @Delete("delete from PRODUCT where ID = #{id}") public void deleteByNum(String id); //通過產品ID查詢產品,目的是為了訂單查詢的@Select使用 @Select("select * from PRODUCT where id=#{id}") Product findById(String id) throws Exception; }
public interface IOrdersDao { //查詢所有的訂單信息 @Select("select * from ORDERS") //oracle數據庫TABLE名字不區分大小寫 @Results({ //為了網頁顯示的后綴Str類型的實體類屬性不用對應出來 @Result(id = true ,property ="id",column = "id"), //聲明主鍵id = true @Result(property ="orderNum",column = "orderMum"), @Result(property ="orderTime",column = "orderTime"), @Result(property ="orderStatus",column = "orderStatus"), @Result(property ="peopleCount",column = "peopleCount"), @Result(property ="payType",column = "payType"), @Result(property ="orderDesc",column = "orderDesc"), //多表關聯查詢返回類型的映射通過:javaType= Xxx.class @Result(property ="product",column = "productId",javaType = Product.class ,one =@One(select = "cn.bjut.ssm.dao.IProductDao.findById")) }) public List<Orders> findAll() throws Exception; }
4.訂單操作-查詢所有訂單代碼實現3
cn.bjut.ssm.domain包下的實體類Orders的成員變量
后綴是Str的那些屬性的 get方法需要我們添加if語句給返回值字符串 設定內容根據數據庫表結構
//訂單 public class Orders { private String id; private String orderNum; private Date orderTime; private String orderTimeStr; private int orderStatus; private int peopleCount; private Product product; private List<Traveller> travellers; private Member member; private Integer payType; private String payTypeStr; private String orderDesc; private String orderStatusStr; //============================================ //需要添加在JSP頁面上EL表達式獲取的拓展字符串屬性 public String getOrderStatusStr() { //訂單狀態 (0未支付 1已支付) if(orderStatus ==0){ orderStatusStr= "未支付"; }else if (orderStatus ==1){ orderStatusStr= "已支付"; } return orderStatusStr; } public void setOrderStatusStr(String orderStatusStr) { this.orderStatusStr = orderStatusStr; } //=========================================== public String getPayTypeStr() { if(payType == 0){ payTypeStr = "支付寶"; } else if(payType == 1){ payTypeStr = "微信"; } else if(payType == 2){ payTypeStr = "其他"; } return payTypeStr; } //================================================ public void setPayTypeStr(String payTypeStr) { this.payTypeStr = payTypeStr; } //調用我們的自定義工具類轉換一下 public String getOrderTimeStr() { if(orderTime !=null) { orderTimeStr = DateUtils.date2String(orderTime, "yyyy-MM-dd HH:mm"); } return orderTimeStr; } public void setOrderTimeStr(String orderTimeStr) { this.orderTimeStr = orderTimeStr; } //=================================================
5.PageHelper概述與基本使用步驟介紹
導入依賴坐標:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.10</version> </dependency>在spring的applicationContext.xml管理sqlSessionFactory的<bean>標簽
<!-- 傳入PageHelper的插件 --> <property name="plugins"> <array> <!-- 傳入插件的對象 --> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <props> <prop key="helperDialect">mysql</prop> <prop key="reasonable">true</prop> </props> </property> </bean> </array> </property>
package cn.bjut.ssm.service.impl;
@Service @Transactional //注解的方式配置spring事務管理 public class OrdersServiceImpl implements IOrdersService { @Autowired private IOrdersDao ordersDao; @Override //查詢所有訂單 public List<Orders> findAll() throws Exception { //參數pageNum是頁碼值,pageSize是每頁顯示條數 //放在Service層真正執行SQL語句的靜態方法前緊挨着 PageHelper.startPage(1,5); return ordersDao.findAll(); } }
package cn.bjut.ssm.controller;
//查詢所有訂單:分頁插件 @RequestMapping("/findAll.do") public ModelAndView findAll(@RequestParam(name = "page",required = true,defaultValue = "1") int page ,@RequestParam(name="size",required = true,defaultValue = "5") int size) throws Exception{ ModelAndView mv = new ModelAndView("orders-page-list2"); List<Orders> ordersList = ordersService.findAll(page ,size); //PageInfo就是一個分頁Bean PageInfo pageInfo =new PageInfo(ordersList); mv.addObject("pageInfo",pageInfo); return mv; }
7.訂單操作-分頁查詢所有訂單2(頁面代碼處理)
JSP實現分頁的 PageInfo.pageNum 當前頁
<li> <a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=${pageInfo.pageSize}" aria-label="Previous">首頁</a> </li> <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum-1}&size=${pageInfo.pageSize}">上一頁</a></li> <c:forEach begin="1" end="${pageInfo.pages}" var="pageNum" varStatus="s"> <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageNum}&size=${pageInfo.pageSize}">${pageNum}</a></li> </c:forEach> <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum+1}&size=${pageInfo.pageSize}">下一頁</a></li> <li> <a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pages}&size=${pageInfo.pageSize}" aria-label="Next">尾頁</a> </li>
瀏覽器向服務器請求分頁信息提交的JS
function changePageSize() { //獲取下拉框的值 var pageSize = $("#changePageSize").val(); //向服務器發送請求,改變每頁顯示條數 location.href = "${pageContext.request.contextPath}/orders/findAll.do?page=1&size=" + pageSize; }
下拉菜單實現分頁選擇size
<!-- .box-footer--> <div class="box-footer"> <div class="pull-left"> <div class="form-group form-inline"> 總共${pageInfo.pages}頁,共${pageInfo.total} 條數據。 每頁 <select class="form-control" id = "changePageSize" onchange="changePageSize()"> <option>1</option> <option>2</option> <option>3</option> <option>4</option> <option>5</option> </select> 條 </div> </div>
8.訂單操作-訂單詳情查詢流程分析
詳情 button 的部分代碼如下:
<button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">詳情</button>
package cn.bjut.ssm.dao; import cn.bjut.ssm.domain.Traveller; import org.apache.ibatis.annotations.Select; import java.util.List; public interface ITravellerDao { @Select("select * from traveller where id in ( select travellerId from order_traveller where orderId=#{ordersId})") public List<Traveller> findByOrdersId(String ordersId) throws Exception; }
//通過訂單主鍵ID查詢訂單詳情(多表關聯查詢) @Select("select * from ORDERS where id = #{ordersId}" ) //oracle數據庫TABLE名不區分大小寫 @Results({ //為了網頁顯示的后綴Str類型的實體類屬性不用對應出來 @Result(property ="id",column = "id",id = true ), //主鍵聲明id = true @Result(property ="orderNum",column = "orderMum"), @Result(property ="orderTime",column = "orderTime"), @Result(property ="orderStatus",column = "orderStatus"), @Result(property ="peopleCount",column = "peopleCount"), @Result(property ="payType",column = "payType"), @Result(property ="orderDesc",column = "orderDesc"), //多表關聯查詢,聲明“引用實體類”的封裝通過:javaType= Xxx實體類.class @Result(property ="product",column = "productId",javaType = Product.class ,one =@One(select = "cn.bjut.ssm.dao.IProductDao.findById")), @Result(property ="member",column = "memberId",javaType = Member.class ,one =@One(select = "cn.bjut.ssm.dao.IMemberDao.findById")), //通過中間表查詢多對多關系,返回一個其它實體類的List集合 @Result(property = "travellers",column ="id",javaType = java.util.List.class,many = @Many(select = "cn.bjut.ssm.dao.ITravellerDao.findByOrdersId")) }) public Orders findById(String ordersId)throws Exception;
11.訂單操作-訂單詳情查詢代碼實現3
package cn.bjut.ssm.domain; //旅客 public class Traveller { private String id; private String name; private String sex; private String phoneNum; private Integer credentialsType; //證件類型 0身份證 1護照 2軍官證 private String credentialsTypeStr; private String credentialsNum; private Integer travellerType; //旅客類型(人群) 0 成人 1 兒童 private String travellerTypeStr; //============================================================= public String getCredentialsTypeStr() { //證件類型 0身份證 1護照 2軍官證 if (credentialsType != null) { if (credentialsType == 0) { credentialsTypeStr = "身份證"; } else if (credentialsType == 1) { credentialsTypeStr = "護照"; } else if (credentialsType == 2) { credentialsTypeStr = "軍官證"; } } return credentialsTypeStr; } public String getTravellerTypeStr() { ////旅客類型(人群) 0 成人 1 兒童 if (travellerType != null) { if (travellerType == 0) { travellerTypeStr = "成人"; } else if (travellerType == 1) { travellerTypeStr = "兒童"; } } return travellerTypeStr; } //======================================================
==================
end