当前位置:网站首页>ssm练习第二天_项目拆分moudle_基本增删改查_批量删除_一对一级联查询
ssm练习第二天_项目拆分moudle_基本增删改查_批量删除_一对一级联查询
2022-07-26 17:31:00 【奇迹是执着的人创造的】
文章目录
- 一、ssm框架整合
- 1、创建maven的工程
- 1. 创建ssm_parent父工程(打包方式选择pom,必须的)
- 2. 创建ssm_dao子模块(打包方式是jar包)
- 3. 创建ssm_service子模块(打包方式是jar包)
- 4. 创建ssm_web子模块(打包方式是war包)
- 5. 创建ssm_domain子模块(打包方式是jar包)
- 6. 创建ssm_utils子模块(打包方式是jar包)
- 7. web依赖于service,service依赖于dao,dao依赖于domain
- 8. 在ssm_parent的pom.xml文件中引入坐标依赖
- 9. 在ssm_web项目中导入静态页面
- 10. 部署ssm_web的项目,只要把ssm_web项目加入到tomcat服务器中即可
- 2、配置Spring的配置文件
- 二、产品(旅游)模块功能实现
- 三:订单模块实现
一、ssm框架整合
1、创建maven的工程
1. 创建ssm_parent父工程(打包方式选择pom,必须的)
新建无骨架maven项目 ssm_parent
2. 创建ssm_dao子模块(打包方式是jar包)
在ssm_parent工程上右键-new-module
还是无骨架maven
ssm_dao_331

注意手动加层目录
3. 创建ssm_service子模块(打包方式是jar包)
同上,名字不同而已
在ssm_parent工程上右键-new-module
还是无骨架maven
ssm_service_331
注意手动加层目录
4. 创建ssm_web子模块(打包方式是war包)
在ssm_parent工程上右键-new-module
选择maven-webapp骨架
ssm_web_331

手动加一级目录
5. 创建ssm_domain子模块(打包方式是jar包)
在ssm_parent工程上右键-new-module
无骨架maven
ssm_domain_331

6. 创建ssm_utils子模块(打包方式是jar包)
在ssm_parent工程上右键-new-module
无骨架maven
ssm_utils_331

7. web依赖于service,service依赖于dao,dao依赖于domain



8. 在ssm_parent的pom.xml文件中引入坐标依赖

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
<spring.security.version>5.0.2.RELEASE</spring.security.version>
</properties>
<dependencies>
<!-- spring相关的jar包 -->
<!-- 容器 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 事务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- springMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- mybatis与Spring整合 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- AOP切面 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- servletAPI -->
<!-- JSP应用 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- servlet应用 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- 日志记录工具 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.9.1</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--oracle的jar包-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.3.0</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
</dependencies>
ojdbc14:10.2.0.2.0 版本总是报波浪线 改成0.2.0.3.0 即可
可能是本地仓库的xml配置原因:

9. 在ssm_web项目中导入静态页面
复制到webapp目录下即可
10. 部署ssm_web的项目,只要把ssm_web项目加入到tomcat服务器中即可
2、配置Spring的配置文件
dao层
ssm_dao_331中创建包结构和两个配置文件
jdbc.properties
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=ssm331
jdbc.password=123
applicationContext-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--引入属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--创建数据源对象-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--sqlSessionFactoryBean对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据源对象-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--扫描dao包,创建Dao接口的动态代理对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定dao层的包路径-->
<property name="basePackage" value="cn.ahpu.dao"></property>
</bean>
</beans>
service层
创建包结构与一个配置文件
applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--引入持久层配置文件 classpath*应该是通配符 寻找工程下所有classpathXX路径 然后文件名唯一 可以正确匹配-->
<!--<import resource="classpath*:spring/applicationContext-dao.xml"></import>-->
<!--有简便方法全引入各种spring核心xml-->
<!--扫描包:创建业务层对象-->
<context:component-scan base-package="cn.ahpu.service"></context:component-scan>
<!--事务管理器对象-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事务通知对象-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="query*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="get*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="*" read-only="false" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--aop切面配置-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.ahpu.service.impl.*.*(..))"></aop:advisor>
</aop:config>
</beans>
web层
先将页面复制到webapp目录下
再创建包结构
写spring-mvc.xml和web.xml
注:此处resources目录没有spring目录了 spring-mvc.xml就在resources根目录下,本来就不是spring核心配置文件嘛
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描包:创建web层对象-->
<context:component-scan base-package="cn.ahpu.controller"></context:component-scan>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--资源放行-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--可能有拦截器-->
</beans>
web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--全局参数:指定配置文件路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--所有spring的xml-->
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<!--编码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--监听器:创建spring容器对象 就是加载applicationContext.xml 前面还有一行配套配置-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
二、产品(旅游)模块功能实现
1、创建产品表和实体
1.1 创建数据库和表结构(oracle数据库)
create sequence product_seq; -- oracle每创建一张表就创建一个序列
CREATE TABLE product(
id number PRIMARY KEY ,
productNum VARCHAR2(50) NOT NULL UNIQUE,
productName VARCHAR2(50),
cityName VARCHAR2(50),
departureTime date,
productPrice number(8,2),
productDesc VARCHAR2(500),
productStatus INT
)
其中字段描述如下:
| 序号 | 字段名称 | 字段类型 | 字段描述 |
|---|---|---|---|
| 1 | id | number | 无意义 |
| 2 | productNum | varchar2(50) | 产品编号,唯一,不为空 |
| 3 | productName | varchar2(50) | 产品名称(路线名称) |
| 4 | cityName | varchar2(50) | 出发城市 |
| 5 | departureTime | date | 出发时间 |
| 6 | productPrice | number(8,2) | 产品价格 |
| 7 | productDesc | varchar2(500) | 产品描述 |
| 8 | productStatus | int | 状态(0 关闭 1 开启) |
1.2 创建Product实体类
ssm_domain_331内引入lombok
@Data
public class Product {
private Integer id;
private String productNum;
private String productName;
private String cityName;
private Date departureTime;
private Double productPrice;
private String productDesc;
private Integer productStatus;
}
2、查询所有产品功能
2.1 页面入口地址

2.2 编写Controller
先写controller 有错误留着 慢慢写 等错误全没了也就写好了 这样不容易忘记东西
ProductController
@Controller
@RequestMapping("/product")
public class ProductController {
@Autowired
ProductService productService;
@RequestMapping("/findAll")
public ModelAndView findAll(){
ModelAndView modelAndView = new ModelAndView();
//数据
List<Product> products = productService.findAll();
System.out.println("产品:"+products);
modelAndView.addObject("products",products);
//页面
modelAndView.setViewName("product-list");
//返回
return modelAndView;
}
}
2.3 编写Service
ProductService接口
public interface ProductService {
List<Product> findAll();
}
ProductServiceImpl接口实现
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
ProductDao productDao;
@Override
public List<Product> findAll() {
return productDao.findAll();
}
}
2.4 编写Dao
ProductDao
public interface OrderDao {
@Select("select * from orders")
/*一对一级联查询*/
@Results({
@Result(property = "product" ,column = "productId",javaType = Product.class,
one = @One(select = "cn.ahpu.dao.ProductDao.findById"))
})
List<Order> findAll();
}
2.5 编写页面product-list.jsp
引入格式化标签库 用来处理日期格式非常方便
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!--数据列表-->
<table id="dataList" class="table table-bordered table-striped table-hover dataTable">
<thead>
<tr>
<th class="" style="padding-right: 0px;"><input id="selall" type="checkbox" class="icheckbox_square-blue">
</th>
<th class="sorting_asc">ID</th>
<th class="sorting">产品编号</th>
<th class="sorting">产品名称</th>
<th class="sorting">出发城市</th>
<th class="sorting">出发时间</th>
<th class="sorting">产品价格</th>
<th class="sorting">产品描述</th>
<th class="sorting">产品状态</th>
<th class="text-center">操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${products}" var="product">
<tr>
<td><input name="ids" type="checkbox"></td>
<td>${product.id}</td>
<td>${product.productNum}</td>
<td>${product.productName}</td>
<td>${product.cityName}</td>
<td>
<%--el标签可以 格式化标签 注意MM大写--%>
<fmt:formatDate value="${product.departureTime}" pattern="yyyy-MM-dd"></fmt:formatDate>
</td>
<td>${product.productPrice}</td>
<td>${product.productDesc}</td>
<td>${product.productStatus == 1?'开启':'关闭'}</td>
<td class="text-center">
<button type="button" class="btn bg-olive btn-xs" onclick='location.href="all-order-manage-edit.html"'>删除</button>
<button type="button" class="btn bg-olive btn-xs" onclick='location.href="all-order-manage-edit.html"'>修改</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<!--数据列表/-->
3、添加产品功能
3.1 页面入口

3.2 编写Controller
@RequestMapping("/save")
public String save(Product product){
productService.save(product);
return "redirect:/product/findAll";//防止别的模块内也有findAll方法 写绝对路径
}
3.3 编写Service
public interface ProductService {
List<Product> findAll();
void save(Product product);
}
@Override
public void save(Product product) {
productDao.save(product);
}
3.4 编写Dao
@Insert("insert into product values(product_seq.nextval,#{productNum},#{productName}," +
"#{cityName},#{departureTime},#{productPrice},#{productDesc},#{productStatus})")
void save(Product product);
也可以这么写sql 先查询下主键 直接就到了Product里 然后再去插入
3.5 自定义类型转换器
StringToDateConverter
public class StringToDateConverter implements Converter<String,Date> {
@Override
public Date convert(String source) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
try {
Date date = sdf.parse(source);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
spring-mvc.xml
<!--扫描包:创建web层对象-->
<context:component-scan base-package="cn.ahpu.controller"></context:component-scan>
<!--创建类型转换器 工厂类对象 前端:string->Controller:date
写完 上面的注解驱动别忘记引用
-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.ahpu.converter.StringToDateConverter"></bean>
</set>
</property>
</bean>
4、修改产品功能-数据回显
4.1 页面入口

4.2 编写Controller
@RequestMapping("/updateUI")
public ModelAndView updateUI(Integer productId){
ModelAndView modelAndView = new ModelAndView();
System.out.println(productId);
Product product=productService.findById(productId);
System.out.println(product);
modelAndView.addObject("product",product);
modelAndView.setViewName("product-update");
return modelAndView;
}
4.3 编写Service
void update(Product product);
ProductServiceImpl实现
@Override
public Product findById(Integer id) {
return productDao.findById(id);
}
4.4 编写Dao
@Select("select * from product where id = #{id}")
Product findById(Integer id);
4.5 编写页面
<form action="${pageContext.request.contextPath}/product/update" method="post">
<input type="hidden" name="id" value="${product.id}">
<!-- 正文区域 -->
<section class="content"> <!--产品信息-->
<div class="panel panel-default">
<div class="panel-heading">产品信息</div>
<div class="row data-type">
<div class="col-md-2 title">产品编号</div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="productNum" placeholder="产品编号" value="${product.productNum}" readonly="readonly">
</div>
<div class="col-md-2 title">产品名称</div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="productName" placeholder="产品名称" value="${product.productName}">
</div>
<div class="col-md-2 title">出发时间</div>
<div class="col-md-4 data">
<div class="input-group date">
<div class="input-group-addon">
<i class="fa fa-calendar"></i>
</div>
<input type="text" class="form-control pull-right" id="datepicker-a3" name="departureTime" value="${product.departureTimeStr}">
</div>
</div>
<div class="col-md-2 title">出发城市</div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="cityName" placeholder="出发城市" value="${product.cityName}">
</div>
<div class="col-md-2 title">产品价格</div>
<div class="col-md-4 data">
<input type="text" class="form-control" placeholder="产品价格" name="productPrice" value="${product.productPrice}">
</div>
<div class="col-md-2 title">产品状态</div>
<div class="col-md-4 data">
<select id="productStatus" class="form-control select2" style="width: 100%" name="productStatus">
<%--<option value="0" <c:if test="${product.productStatus == 0}">selected="selected"</c:if> >关闭</option>
<option value="1" <c:if test="${product.productStatus == 1}">selected="selected"</c:if> >开启</option>--%>
<%-- 用jquery写最方便 --%>
<option value="0" >关闭</option>
<option value="1" >开启</option>
</select>
</div>
<div class="col-md-2 title rowHeight2x">其他信息</div>
<div class="col-md-10 data rowHeight2x">
<textarea class="form-control" rows="3" placeholder="其他信息" name="productDesc">${product.productDesc}</textarea>
</div>
</div>
</div>
<!--订单信息/--> <!--工具栏-->
<div class="box-tools text-center">
<button type="submit" class="btn bg-maroon">修改</button>
<button type="button" class="btn bg-default" onclick="history.back(-1);">返回</button>
</div>
<!--工具栏/--> </section>
<!-- 正文区域 /-->
</form>
<script src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js"></script>
<script src="${pageContext.request.contextPath}/plugins/jQueryUI/jquery-ui.min.js"></script>
<script> $.widget.bridge('uibutton', $.ui.button); //千万注意编码位置 引入的jquery之下 //修改界面 selected option的默认选项 $("#productStatus option[value=${product.productStatus}]").prop("selected","selected"); </script>
时间处理:(否则uodateUI页面回显示的日期格式不一样)
页面入口value=“字符串内无法写el表达式 于是乎最简单的方法 直接在javaBean内多加一个get方法即可”
sql语句查询多自定义一个查询列 然后取个别名也行
value="${product.departureTimeStr}"
@Data
public class Product {
//...
private Date departureTime;
private String departureTimeStr;//方便前端显示 所以说直接写成string多好 前端提交的都是string
//...
public String getDepartureTimeStr() {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
String timeStr = sdf.format(departureTime);
return timeStr;
}
}
数据库改成timestamp类型,否则时间查不到
5、修改产品功能-数据修改
5.1 页面入口

5.2 编写Controller
@RequestMapping("/update")
public String update(Product product){
System.out.println(product);
productService.update(product);
return "redirect:/product/findAll";
}
5.3 编写Service
ProductService接口
void update(Product product);
ProductServiceImpl实现
@Override
public void update(Product product) {
productDao.update(product);
}
5.4 编写Dao
@Update("update product set productNum=#{productNum},productName=#{productName}," +
"cityName=#{cityName},departureTime=#{departureTime},productPrice=#{productPrice}" +
",productDesc=#{productDesc},productStatus=#{productStatus} where id=#{id}")
void update(Product product);
6、删除单个产品
6.1 页面代码实现 (js代码跳转页面)

<button type="button" class="btn bg-olive btn-xs" onclick='delOne(${product.id})'>删除</button>
<script type="text/javascript"> function delOne(id){
if(confirm("您确定要删除吗?")){
location.href="${pageContext.request.contextPath}/product/delOne?id="+id; } } </script>
6.2 编写Controller
@RequestMapping("/delOne")
public String delOne(Integer id){
System.out.println(id);
productService.delById(id);
return "redirect:/product/findAll";
}
6.3 编写Service
void delById(Integer id);
@Override
public void delById(Integer id) {
productDao.delById(id);
}
6.4 编写Dao
@Delete("delete from product where id=#{id}")
void delById(Integer id);
7、删除多个产品功能
7.1 页面代码实现(js代码提交表单)

点删除之后提交表单最方便,哪些选中了,哪些未选中自动获取了!
注意form表单的标签只能放到table标签里面 不能放在否则报空指针 因为table标签内只允许有tr和td标签
<form action="${pageContext.request.contextPath}/product/delMany?" id="delForm">
<button type="button" class="btn btn-default" title="删除" onclick='delMany()'>
<i class="fa fa-trash-o"></i> 删除
</button>
</form>
js删除
//TODO
//删除多个 直接提交表单最为方便
function delMany() {
//获取选中的复选框数量
var len = $("input:checkbox:checked").length;
//alert("你一共选中了"+len+"个复选框");
if(len>0&&confirm("您确定删除这些吗?")){
//获取表单
//document.forms 获取所有的表单 只有一个就是document.forms[0]
var delForm=$("#delForm");
//表单提交
delForm.submit();//提交了 和点submit效果一样
}
}
7.2 编写Controller
@RequestMapping("/delMany")
public String delMany(Integer[] ids){
System.out.println("删除所有:被删编号 "+Arrays.toString(ids));
productService.delMany(ids);
return "redirect:findAll";
}
7.3 编写Service
ProductService接口
void delMany(Integer[] ids);
ProductServiceImpl实现
//根据ids数组删除多个
@Override
public void delMany(Integer[] ids) {
//dao内不需要再写个delMany方法了 in(1,2,3) 动态sql在注解内不大好写 不如把麻烦留在业务层 最灵活了
for (Integer id : ids) {
productDao.delById(id);
}
}
三:订单模块实现
1、创建订单表和实体
1.1 创建数据库和表结构
create sequence order_seq;
CREATE TABLE orders(
id number PRIMARY KEY,
orderNum VARCHAR2(20) NOT NULL UNIQUE,
orderTime DATE,
peopleCount number,
orderDesc VARCHAR2(500),
payType number,
orderStatus number,
productId int,
FOREIGN KEY (productId) REFERENCES product(id)
)
其中字段描述如下:
| 序号 | 字段名称 | 字段类型 | 字段描述 |
|---|---|---|---|
| 1 | id | bigint | 无意义、主键自动增长 |
| 2 | orderNum | varchar(50) | 订单编号 不为空 唯一 |
| 3 | orderTime | DATE | 下单时间 |
| 4 | peopleCount | int | 出行人数 |
| 5 | orderDesc | varchar(500) | 订单描述(其它信息) |
| 6 | payType | int | 支付方式(0 支付宝 1 微信 2其它) |
| 7 | orderStatus | int | 订单状态(0 未支付 1 已支付) |
| 8 | productId | int | 产品id 外键 |
2、查询所有订单功能
2.1 页面入口地址

2.2 编写Controller
@Controller
@RequestMapping("/order")
public class OrderController {
@Autowired
OrderService orderService;
@RequestMapping("/findAll")
public ModelAndView findAll(){
List<Order> orders= orderService.findAll();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("orders",orders);
modelAndView.setViewName("order-list");
return modelAndView;
}
}
2.3 编写Service
OrderService接口
public interface OrderService {
List<Order> findAll();
}
OrderServiceImpl接口实现
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
OrderDao orderDao;
@Override
public List<Order> findAll() {
return orderDao.findAll();
}
}
2.4 编写Dao
public interface OrderDao {
@Select("select * from orders")
List<Order> findAll();
}
2.5 编写页面order-list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<table id="dataList" class="table table-bordered table-striped table-hover dataTable">
<thead>
<tr>
<th class="" style="padding-right: 0px;"><input id="selall" type="checkbox" class="icheckbox_square-blue">
</th>
<th class="sorting_asc">ID</th>
<th class="sorting">订单编号</th>
<th class="sorting">下单时间</th>
<th class="sorting">出行人数</th>
<th class="sorting">支付方式</th>
<th class="sorting">订单状态</th>
<th class="sorting">产品名称</th>
<th class="text-center">操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${orders}" var="order">
<tr>
<td><input name="ids" type="checkbox"></td>
<td>${order.id}</td>
<td>${order.orderNum}</td>
<td>
<fmt:formatDate value="${order.orderTime}" pattern="yyyy-MM-dd HH:mm"></fmt:formatDate>
</td>
<td>${order.peopleCount}</td>
<%--
支付宝 0
微信 1
其他 2
--%>
<td>${order.payType==0?"支付宝":order.payType==1?"微信":"其他"}</td>
<td>${order.orderStatus==0?"未支付":"已支付"}</td>
<td>${order.product.productName}</td>
<td class="text-center">
<button type="button" class="btn bg-olive btn-xs" onclick='location.href="${pageContext.request.contextPath}/pages/order-show.jsp"'>订单</button>
<button type="button" class="btn bg-olive btn-xs" onclick='location.href="${pageContext.request.contextPath}/pages/order-show.jsp"'>查看</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
3、添加订单功能-添加订单页面数据准备
3.1 页面入口
新增订单页面需要准备产品的数据列表(选择产品的下拉选要从数据库中查,本次就不用ajax了,直接加个addUI还是简单的controller先查询再跳转 )


3.2 编写Controller
//要用就注入 别婆婆妈妈的
@Autowired
ProductService productService;
@RequestMapping("/addUI")
public ModelAndView addUI(){
List<Product> products = productService.findAll();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("products",products);
modelAndView.setViewName("order-add");
return modelAndView;
}
3.3 编写页面order-add.jsp
<div class="col-md-2 title">选择产品</div>
<div class="col-md-4 data">
<select class="form-control select2" style="width: 100%" name="product.id">
<c:forEach items="${ products }" var="p">
<option value="${ p.id }" >${ p.productName }</option>
</c:forEach>
</select>
</div>
4、添加订单功能-保存订单数据
4.1 页面入口地址

4.2 编写Controller
@RequestMapping("/save")
public String save(Order order){
orderService.save(order);
return "redirect:/order/findAll";
}
4.3 编写Service
OrderService接口
void save(Order order);
OrderServiceImpl接口实现
@Override
public void save(Order order) {
orderDao.save(order);
}
4.4 编写Dao
@Insert("insert into orders values(order_seq.nextval,#{orderNum},#{orderTime},#{peopleCount},#{orderDesc},#{payType},#{orderStatus},#{product.id})")
void save(Order order);
边栏推荐
- Is it safe for Changzheng securities to open an account?
- OpenWrt之feeds.conf.default详解
- Week 17 free intrusion pointer exercise - output maximum
- 8.2 一些代数知识(群、循环群和子群)
- Cross site scripting attack (XSS)
- LeetCode 0137. 只出现一次的数字 II
- 俄语翻译的就业前景怎样 如何做好俄语翻译工作
- 7、 Common commands of ROS (II): rosservice, rossrv, rosparam
- Detailed explanation of openwrt's feeds.conf.default
- Understanding service governance in distributed development
猜你喜欢
![[training Day2] torchbearer](/img/fc/c9f3e7b61eb5329967b91a31e96945.png)
[training Day2] torchbearer

236. The nearest common ancestor of a binary tree

俄语翻译的就业前景怎样 如何做好俄语翻译工作

线性回归——以一道等差数列的题为例

URL jump vulnerability

LeetCode50天刷题计划(Day 1—— 两数相加 11.00-12.30)
![[training day3] section](/img/f6/6f679375a00c6cce569c102371e9ff.png)
[training day3] section

It is said that the salary of Alibaba P7 is really fragrant

2020美亚个人赛复盘

Relative path and absolute path
随机推荐
常用api
2020美亚个人赛复盘
LeetCode50天刷题计划(Day 2—— 无重复字符的最长子串 10.00-12.00)
LeetCode50天刷题计划(Day 1—— 两数相加 11.00-12.30)
【翻译】为什么你需要一个API网关来管理对你的API的访问?
Interview with celebrities | open source is a double-edged sword for security -- Wei Jianfan, author of the Chinese translation of cathedral and market
[training Day2] sculpture
9、 Alternative implementation of client for service communication
AI遮天传 ML-集成学习
openssl
BulletGraph(子弹图、项目符号图)
Vector CANoe Menu Plugin拓展入门
SQL判断某列中是否包含中文字符、英文字符、纯数字,数据截取
The database uses PSQL and JDBC to connect remotely and disconnect automatically from time to time
Simple uploading and downloading of Web project files
Continue to work hard on your skills, and the more you learn, the more you will learn
[training Day1] spy dispatch
线性表的顺序存储结构——顺序表
继续卷技术 埋头苦学,越学越会
[metauniverse OMI theory] analyze Web3 risk challenges and build Web3 ecological security