Maven多模块项目搭建+整合SSM框架(idea版)
理解继承和聚合
通常继承和聚合同时使用
何为继承?
继承是为了消除重复,如果将 dao、service、web 分开创建独立工程则每个工程pom.xml文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的配置提取出来在父工程的 pom.xml 中定义。
何为聚合?
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web 三个工程最终会打一个独立的 war 运行。
需求和描述
我们一般将SSM工程拆分为多个模块来开发,比如dao,service,controller,utils和domain,然后利用其自建的依赖关系相互调用,然后这些项目会打包成统一的一个war包,最终能够成为一个完成完整的项目,每层负责每个人的任务,大家再通过版本控制工具svn或者git(后期会学到)达到一个协同开发的效果,后期会有很多这样的项目,后面的博客会介绍到
准备工作
1.建立相关的数据库和数据表,这里以oracle的单表操演示
2.建立父子工程的目录结构,我们处理这种的业务逻辑,一般都是将子工程放在工程中去,这里我用的是idea版的项目,这里我建的是父工程为一个project,子工程全部是model,我下面给大家展示一下我的目标结构
3.导入相关的jar包,因为这里建立的是聚合项目,每一层所需要的jar都是不一样的,比如dao层用到与数据库交互的jar包还有mybatis本身需要的jar和service需要spring对事务处理的jar包等,为了方便将其放到父工程的空间中,这里每一个子工程都能够调用,因为我建的是maven工程,下面我给大家展示一下我的相关jar包坐标
4.一般项目的配置文件可以根据自己的需求每一层放到每一层的业务里面,这样一般是业务范围比较大的时候,我这里做的是demo,故我把所有的配置文件都放在了controller里面,这里面防止了所有的配置文件
项目具体的流程
1.父工程的pom.xml文件,主要是对于子工程jar包的管理,版本控制,以及判断其子工程的具体情况
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.ujiuye</groupId>
<artifactId>ssm_ujiuye</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<oracle.version>11.2.0.1.0</oracle.version>
<mybatis.version>3.4.5</mybatis.version>
<spring.security.version>5.0.1.RELEASE</spring.security.version>
</properties>
<dependencies> <!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency> <!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency> <!-- log end -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</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>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<!--添加-->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<modules>
<module>ujiuye_ssm_service</module>
<module>ujiuye_ssm_dao</module>
<module>ujiuye_ssm_domain</module>
<module>ujiuye_ssm_utils</module>
<module>ujiuye_ssm_web</module>
</modules>
</project>
2.子工程domain工程实体类的编写,实体类的属性和数据表的字段一样,这样能够封装数据,在其pom.xml文件中添加所需要的依赖
package cn.ujiuye.ssm.domain;
import cn.ujiuye.ssm.utils.DateUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @author liugang
* @date 2019/10/22
* 商品的视图类
*/
public class Product {
private String id; // 主键
private String productNum; // 编号 唯一
private String productName; // 名称
private String cityName; // 出发城市
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date departureTime; // 出发时间
private String departureTimeStr;
private double productPrice; // 产品价格
private String productDesc; // 产品描述
private Integer productStatus; // 状态 0 关闭 1 开启
private String productStatusStr;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getProductNum() {
return productNum;
}
public void setProductNum(String productNum) {
this.productNum = productNum;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public Date getDepartureTime() {
return departureTime;
}
public void setDepartureTime(Date departureTime) {
this.departureTime = departureTime;
}
public String getDepartureTimeStr() {
//显然是对时间类型的数据进行判断
if (departureTime != null){
departureTimeStr = DateUtils.date2String(departureTime, "yyyy-MM-dd HH:mm:ss");
}
return departureTimeStr;
}
public void setDepartureTimeStr(String departureTimeStr) {
this.departureTimeStr = departureTimeStr;
}
public double getProductPrice() {
return productPrice;
}
public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public Integer getProductStatus() {
return productStatus;
}
public void setProductStatus(Integer productStatus) {
this.productStatus = productStatus;
}
public String getProductStatusStr() {
if (productStatus != null){
// 状态 0 关闭 1 开启
if (productStatus == 0){
productStatusStr="关闭";
}
if (productStatus == 1){
productStatusStr="开启";
}
}
return productStatusStr;
}
public void setProductStatusStr(String productStatusStr) {
this.productStatusStr = productStatusStr;
}
@Override
public String toString() {
return "Product{" +
"id='" + id + '\'' +
", productNum='" + productNum + '\'' +
", productName='" + productName + '\'' +
", cityName='" + cityName + '\'' +
", departureTime=" + departureTime +
", departureTimeStr='" + departureTimeStr + '\'' +
", productPrice=" + productPrice +
", productDesc='" + productDesc + '\'' +
", productStatus=" + productStatus +
", productStatusStr='" + productStatusStr + '\'' +
'}';
}
}
3.controller层的编写,业务逻辑给平时的ssm的业务逻辑时一致的,这里直接贴代码,主要是讲一下其pom.xml的配置文件的写法和其相关的依赖
package cn.ujiuye.ssm.controller;
import cn.ujiuye.ssm.domain.Product;
import cn.ujiuye.ssm.service.IProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
/**
* @author liugang
* @date 2019/10/22
* 商品的控制层
*/
@Controller
@RequestMapping("/product")
public class ProductController {
@Autowired
private IProductService productService;
/**
* 查询所有的商品的信息并将其信息存入到相对应的地方去
* @return
*/
@RequestMapping("/findAll")
public ModelAndView findAll() throws Exception {
ModelAndView mv = new ModelAndView();
List<Product> ps = productService.findAll();
mv.addObject("productList",ps);
mv.setViewName("product-list1");
return mv;
}
}
4.service层业务的编写
package cn.ujiuye.ssm.service;
import cn.ujiuye.ssm.domain.Product;
import java.util.List;
/**
* @author liugang
* @date 2019/10/22
* 商品的接口类型
*/
public interface IProductService {
public List<Product> findAll() throws Exception;
}
package cn.ujiuye.ssm.service.impl;
import cn.ujiuye.ssm.dao.IProductDao;
import cn.ujiuye.ssm.domain.Product;
import cn.ujiuye.ssm.service.IProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author liugang
* @date 2019/10/22
* 商品的业务的实现类
*/
@Service
@Transactional
public class ProductServiceImpl implements IProductService {
@Autowired
private IProductDao productDao;
/**
* 查询所有的商品的信息
* @return
* @throws Exception
*/
@Override
public List<Product> findAll() throws Exception {
return productDao.findAll();
}
}
5.dao层代码的编写
package cn.ujiuye.ssm.dao;
import cn.ujiuye.ssm.domain.Product;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author liugang
* @date 2019/10/22
*/
public interface IProductDao {
/**
* 查询所有的商品信息
* @return
* @throws Exception
*/
@Select("select * from product")
public List<Product> findAll() throws Exception;
/**
* 添加商品的信息
* @param product
*/
@Insert("insert into product(productNum,productName,cityName,departureTime,productPrice,productDesc,productStatus) values(#{productNum},#{productName},#{cityName},#{departureTime},#{productPrice},#{productDesc},#{productStatus})")
void save(Product product);
}
运行结果
项目感想
面向对象面向君,1024欢迎您
如果你对基本的ssm整合有所疑惑,可以推荐您看这篇博客,从点点滴滴来配置ssm的项目构建,项目路径:ssm链接路径