springmvc项目概述:
项目包介绍
springmvc基本组成架构:
config基本配置:
mybatisConfig:负责mybatis连接管理,将mybatis.xml文件进行转换
package com.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class MyBatisConfig {
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setTypeAliasesPackage("com.domain");
return factoryBean;
}
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.dao");
return msc;
}
}
JdbcCongfig:数据库连接配置
package com.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class JdbcConfig {
("${jdbc.driver}")
private String driver;
("${jdbc.url}")
private String url;
("${jdbc.username}")
private String username;
("${jdbc.password}")
private String password;
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
SpringConfig :Spring项目管理,核心配置类
package com.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
("com.service")
({JdbcConfig.class,MyBatisConfig.class})
("classpath:jdbc.properties")
public class SpringConfig {
}
ServletConfig :Spring项目的服务端管理类
package com.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
//拦截请求
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
SpringMvcConfig
package com.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
//核心配置类
("com.controller")
//连接服务端mvc
public class SpringMvcConfig {
}
controller:服务端控制器
BrandController:
package com.controller;
import com.domain.Brand;
import com.service.BrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
//表示为控制器
("/brand")
public class BrandController {
//自动装配
private BrandService brandService;
public List<Brand> getAll() {
return brandService.getAll();
}
("/{id}")
public Brand getById( int id) {
return brandService.getById(2);
}
}
dao层:DAO层主要是做数据持久层的工作
BrandDao:
package com.dao;
import com.domain.Brand;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface BrandDao {
("select * from tb_brand")
List<Brand> getAll();
("select * from tb_brand where id=#{id}")
Brand getById(int id);
}
domain:javaBean文件
Brand:
package com.domain;
public class Brand {
private int id;
private String brand_name;
private String company_name;
private String ordered;
private String description;
private int status;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBrand_name() {
return brand_name;
}
public void setBrand_name(String brand_name) {
this.brand_name = brand_name;
}
public String getCompany_name() {
return company_name;
}
public void setCompany_name(String company_name) {
this.company_name = company_name;
}
public String getOrdered() {
return ordered;
}
public void setOrdered(String ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String toString() {
return "Brand{" +
"id=" + id +
", brand_name='" + brand_name + '\'' +
", company_name='" + company_name + '\'' +
", ordered='" + ordered + '\'' +
", description='" + description + '\'' +
", status='" + status + '\'' +
'}';
}
}
service层:Service层主要负责业务模块的逻辑
BrandService:
package com.service;
import com.domain.Brand;
import java.util.List;
//提供业务层接口
public interface BrandService {
/*
* 查询全部
* */
List<Brand> getAll();
/*
* 根据id查询
* */
Brand getById(int id);
}
BrandServiceImpl
package com.service.impl;
import com.dao.BrandDao;
import com.domain.Brand;
import com.service.BrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
public class BrandServiceImpl implements BrandService {
//自动装配
private BrandDao brandDao;
public List<Brand> getAll() {
return brandDao.getAll();
}
public Brand getById(int id) {
return brandDao.getById(1);
}
}
jdbc.properties文件:数据连接信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false
jdbc.username=sa
jdbc.password=123456
log4j.properties文件:程序日志
log4j.rootLogger=debug,stdout,D,E
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p %c\:%L - %m%n
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=D://DataSpace/java_project/logs/log.log
log4j.appender.D.Append=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p %c\:%L - %m%n
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=D://DataSpace/java_project/logs/log.log
log4j.appender.E.Append=true
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
测试程序:
package com.service;
import com.config.SpringConfig;
import com.domain.Brand;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
(SpringJUnit4ClassRunner.class)
(classes = SpringConfig.class)
public class BrandTest {
private BrandService brandService;
public void testById() {
Brand brand = brandService.getById(2);
System.out.println(brand);
}
public void testByAll() {
List<Brand> all = brandService.getAll();
System.out.println(all);
}
}
配置pom文件:在程序运行过程中,经常会遇见程序不能运行的情况,在此,需要及时检查包依赖或者版本的问题,有时不同版本的包之间会出现版本相互冲突的问题
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</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>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
关于dao,service,controller,domain等介绍:
DAO层:
DAO层主要是做数据持久层的工作,用来对应数据库实体,负责与数据库进行联络的一些任务都封装在此。主要就是封装一些数据库的增删改查操作,但仅仅是封装了操作,具体的实现并不在dao层里,所以我们可以看到日常的dao层都是以接口形式实现,里面写的方法也都是交给业务层也就是service层去调用。这样的话就实现了高度的解耦合,这样我们的service层就可以专注于实现业务逻辑,而不需要跟数据库产生任何关系,只要跟数据库相关的操作我们都在dao层进行定义就完事了,service层只是去调用dao层里写的方法。DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。
Service层:
Service层主要负责业务模块的逻辑。一般service层我们会先写一个interface,这个接口以service为后缀表示这是一个service接口,在这个类里定义好我们需要的方法,然后写实现类去实现这个接口里的方法,这样可以做到高度解耦合,非常nice的编程习惯。service层编写完成后,我们就可以在controller层中调用Service接口来进行业务处理。Service层的业务实现,具体要调用到已定义的DAO层的接口,封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。
Controller层:
Controller层负责具体的业务模块流程的控制,就是我们进行编程时候以Api为后缀结尾的类,在此层里面要调用Serice层的接口来控制业务流程,因为service层里封装了业务处理的方法。控制器主要就是来调用这些service来实现业务。针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。
domain层:通常就是用于放置这个系统中,与数据库中的表,一一对应起来的JavaBean的
model层:和domain区别;可能都是javaBean,
这个区别是用途不同,domain通常就代表了与数据库表–一一对应的javaBean,
model通常代表了不与数据库一一对应的javaBean,但是封装的数据是前端的JS脚本,需要使用的数据
domain的概念,通常会分很多层,比如经典的三层架构,控制层、业务层、数据访问层(DAO),此外,还有一个层,就是domain层