学习了SSM 后将其整合成一个小Demo
1 结构图
2 config层
2.1 JdbcConfig (jdbc配置)
public class JdbcConfig {
@Value ( "${jdbc.driver}" )
private String driver ;
@Value ( "${jdbc.url}" )
private String url;
@Value ( "${jdbc.username}" )
private String username;
@Value ( "${jdbc.password}" )
private String password;
@Bean
public DataSource dataSource ( ) {
DruidDataSource dataSource = new DruidDataSource ( ) ;
dataSource. setDriverClassName ( driver) ;
dataSource. setUrl ( url) ;
dataSource. setUsername ( username) ;
dataSource. setPassword ( password) ;
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager ( DataSource dataSource) {
DataSourceTransactionManager ds = new DataSourceTransactionManager ( ) ;
ds. setDataSource ( dataSource) ;
return ds;
}
}
2.2 MyBatisConfig (MyBatis配置)
public class MyBatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory ( DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean ( ) ;
factoryBean. setDataSource ( dataSource) ;
factoryBean. setTypeAliasesPackage ( "com.itheima.domain" ) ;
return factoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer ( ) {
MapperScannerConfigurer msc = new MapperScannerConfigurer ( ) ;
msc. setBasePackage ( "com.itheima.dao" ) ;
return msc;
}
}
2.3 ServiceConfig (Service 配置)
public class ServiceConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class < ? > [ ] getRootConfigClasses ( ) {
return new Class [ ] { SpringConfig . class } ;
}
@Override
protected Class < ? > [ ] getServletConfigClasses ( ) {
return new Class [ ] { SpringMvcConfig . class } ;
}
@Override
protected String [ ] getServletMappings ( ) {
return new String [ ] { "/" } ;
}
@Override
protected Filter [ ] getServletFilters ( ) {
CharacterEncodingFilter filter = new CharacterEncodingFilter ( ) ;
filter. setEncoding ( "UTF-8" ) ;
return new Filter [ ] { filter} ;
}
}
2.4 SpringConfig (Spring 配置)
@Configuration
@ComponentScan ( "com.itheima.service" )
@PropertySource ( "classpath:jdbc.properties" )
@Import ( { JdbcConfig . class , MyBatisConfig . class } )
@EnableTransactionManagement
public class SpringConfig {
}
2.5 SpringMvcConfig (SpringMvc 配置)
@Configuration
@ComponentScan ( { "com.itheima.controller" , "com.itheima.config" } )
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
@Autowired
private ProjectInterceptor projectInterceptor;
@Autowired
private ProjectInterceptor2 projectInterceptor2;
@Override
public void addInterceptors ( InterceptorRegistry registry) {
registry. addInterceptor ( projectInterceptor) . addPathPatterns ( "/books" , "/books/*" ) ;
registry. addInterceptor ( projectInterceptor2) . addPathPatterns ( "/books" , "/books/*" ) ;
}
}
2.6 SpringMvcSupport (SpringMvc拦截器)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addResourceHandlers ( ResourceHandlerRegistry registry) {
registry. addResourceHandler ( "/pages/**" ) . addResourceLocations ( "/pages/" ) ;
registry. addResourceHandler ( "/css/**" ) . addResourceLocations ( "/css/" ) ;
registry. addResourceHandler ( "/js/**" ) . addResourceLocations ( "/js/" ) ;
registry. addResourceHandler ( "/plugins/**" ) . addResourceLocations ( "/plugins/" ) ;
}
@Override
protected void addInterceptors ( InterceptorRegistry registry) {
registry. addInterceptor ( projectInterceptor) . addPathPatterns ( "/books" , "/books/*" ) ;
}
}
2 Controller (控制器)
2.1 interceptor (拦截器)
2.11 ProjectInterceptor 拦截器一
@Component
public class ProjectInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String contentType = request. getHeader ( "Content-Type" ) ;
HandlerMethod hm = ( HandlerMethod ) handler;
System . out. println ( "preHandle..." + contentType) ;
return true ;
}
@Override
public void postHandle ( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System . out. println ( "postHandle..." ) ;
}
@Override
public void afterCompletion ( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System . out. println ( "afterCompletion..." ) ;
}
}
2.11 ProjectInterceptor2 拦截器2
@Component
public class ProjectInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System . out. println ( "preHandle...222" ) ;
return true ;
}
@Override
public void postHandle ( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System . out. println ( "postHandle...222" ) ;
}
@Override
public void afterCompletion ( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System . out. println ( "afterCompletion...222" ) ;
}
}
2.2 BookController Book控制器
@RestController
@RequestMapping ( "books" )
public class BookController {
@Autowired
private BookService bookService;
@PostMapping
public Result save ( @RequestBody Book book) {
boolean save = bookService. save ( book) ;
Result result = new Result ( save ? Code. Save_ok : Code. Save_ERR , save) ;
return result;
}
@PutMapping
public Result update ( @RequestBody Book book) {
boolean update = bookService. update ( book) ;
Result result = new Result ( update ? Code. Update_ok : Code. Update_ERR , update) ;
return result;
}
@DeleteMapping ( "/{id}" )
public Result delete ( @PathVariable Integer id) {
boolean delete = bookService. delete ( id) ;
Result result = new Result ( delete ? Code. DELETE_ok : Code . DELETE_ERR , delete) ;
return result;
}
@GetMapping ( "/{id}" )
public Result getById ( @PathVariable Integer id) {
Book byId = bookService. getById ( id) ;
Integer code = byId != null ? Code. GET_ok : Code . GET_ERR ;
String msg = byId != null ? "" : "数据查询失败,请重试" ;
Result result = new Result ( code, byId, msg) ;
return result;
}
@GetMapping
public Result getAll ( ) {
List < Book > all = bookService. getAll ( ) ;
Integer code = all != null ? Code. GET_ok : Code . GET_ERR ;
String msg = all != null ? "" : "数据查询失败,请重试" ;
Result result = new Result ( code, all, msg) ;
return result;
}
}
2.3 Code (自定义异常编码)
public class Code {
public static final Integer Save_ok = 20011 ;
public static final Integer DELETE_ok = 20021 ;
public static final Integer Update_ok = 20031 ;
public static final Integer GET_ok = 20041 ;
public static final Integer Save_ERR = 20010 ;
public static final Integer DELETE_ERR = 20020 ;
public static final Integer Update_ERR = 20030 ;
public static final Integer GET_ERR = 20040 ;
public static final Integer SYSTEM_ERR = 50001 ;
public static final Integer System_TIMEOUT_ERR = 50002 ;
public static final Integer BUSINESS_ERR = 6002 ;
}
2.4 ProjectExceptionAdvice (异常处理器)
@RestControllerAdvice
public class ProjectExceptionAdvice {
@ExceptionHandler ( SystemException . class )
public Result doSystemException ( SystemException ex) {
return new Result ( ex. getCode ( ) , null , ex. getMessage ( ) ) ;
}
@ExceptionHandler ( BusinessException . class )
public Result doSystemException ( BusinessException ex) {
return new Result ( ex. getCode ( ) , null , ex. getMessage ( ) ) ;
}
@ExceptionHandler ( Exception . class )
public Result doException ( Exception ex) {
System . out. println ( "抓住异常" + ex. getLocalizedMessage ( ) ) ;
return new Result ( 666 , null , "出现异常了" ) ;
}
}
2.5 Result (返回结果)
public class Result {
public Object data;
public Integer code;
public String msg;
public Result ( ) {
}
public Result ( Integer code, Object data) {
this . data = data;
this . code = code;
}
public Result ( Integer code, Object data, String msg) {
this . data = data;
this . code = code;
this . msg = msg;
}
public Object getData ( ) {
return data;
}
public void setData ( Object data) {
this . data = data;
}
public Integer getCode ( ) {
return code;
}
public void setCode ( Integer code) {
this . code = code;
}
public String getMsg ( ) {
return msg;
}
public void setMsg ( String msg) {
this . msg = msg;
}
}
3 dao (数据访问接口)
3.1 BookDao (对Book表进行操作的接口)
public interface BookDao {
@Insert ( "insert into tbl_book (type,name,description) values(#{type},#{name},#{description})" )
public int save ( Book book) ;
@Update ( "update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}" )
public int update ( Book book) ;
@Delete ( "delete from tbl_book where id = #{id}" )
public int delete ( Integer id) ;
@Select ( "select * from tbl_book where id = #{id}" )
public Book getById ( Integer id) ;
@Select ( "select * from tbl_book" )
public List < Book > getAll ( ) ;
}
4 domain(实体类)
domain 在domain包下面的实体类其中的属性不仅会包含数据库中的字段,还会包含其他自定义属性
4.1 Book (Book实体类)
public class Book {
private Integer id;
private String type;
private String name;
private String description;
@Override
public String toString ( ) {
return "Book{" +
"id=" + id +
", type='" + type + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +
'}' ;
}
public Integer getId ( ) {
return id;
}
public void setId ( Integer id) {
this . id = id;
}
public String getType ( ) {
return type;
}
public void setType ( String type) {
this . type = type;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public String getDescription ( ) {
return description;
}
public void setDescription ( String description) {
this . description = description;
}
}
5 Exception (异常)
异常(exception)是在运行程序时产生的一种异常情况
5.1 BusinessException(业务异常类)
public class BusinessException extends RuntimeException {
private Integer code;
public BusinessException ( Integer code, String message) {
super ( message) ;
this . code = code;
}
public BusinessException ( Integer code, String message, Throwable cause) {
super ( message, cause) ;
this . code = code;
}
public Integer getCode ( ) {
return code;
}
public void setCode ( Integer code) {
this . code = code;
}
}
5.1 SystemException(系统异常类)
public class SystemException extends RuntimeException {
private Integer code;
public SystemException ( Integer code, String message) {
super ( message) ;
this . code = code;
}
public SystemException ( Integer code, String message, Throwable cause) {
super ( message, cause) ;
this . code = code;
}
public Integer getCode ( ) {
return code;
}
public void setCode ( Integer code) {
this . code = code;
}
}
6 service (服务端)
6.1 impl (服务端实现类)
6.11 BookServiceImpl (book实现类)
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public boolean save ( Book book) {
return bookDao. save ( book) > 0 ;
}
public boolean update ( Book book) {
return bookDao. update ( book) > 0 ;
}
public boolean delete ( Integer id) {
return bookDao. delete ( id) > 0 ;
}
public Book getById ( Integer id) {
if ( id <= 0 ) {
throw new BusinessException ( Code . BUSINESS_ERR , "请输入正确Id" ) ;
}
try {
} catch ( Exception e) {
throw new BusinessException ( Code . SYSTEM_ERR , "服务器超时,请重试" ) ;
}
return bookDao. getById ( id) ;
}
public List < Book > getAll ( ) {
return bookDao. getAll ( ) ;
}
}
6.2 BookService (book接口)
@Transactional
public interface BookService {
public boolean save ( Book book) ;
public boolean update ( Book book) ;
public boolean delete ( Integer id) ;
public Book getById ( Integer id) ;
public List < Book > getAll ( ) ;
}
7 配置类
7.1 jdbc.properties (配置文件)
jdbc. driver= com. mysql. jdbc. Driver
jdbc. url= jdbc: mysql: / / 81.68 .155 .110 / demo01
jdbc. username= demo01
jdbc. password= * * * *
pom (项目对象模型)
< ? 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> org. example< / groupId>
< artifactId> SpringMvcTest_01_ssm < / artifactId>
< version> 1.0 - SNAPSHOT < / version>
< packaging> war< / packaging>
< dependencies>
< dependency>
< groupId> org. springframework< / groupId>
< artifactId> spring- webmvc< / artifactId>
< version> 5.2 .10 . RELEASE < / version>
< / dependency>
< dependency>
< groupId> org. springframework< / groupId>
< artifactId> spring- jdbc< / 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 .47 < / version>
< / dependency>
< dependency>
< groupId> com. alibaba< / groupId>
< artifactId> druid< / artifactId>
< version> 1.1 .16 < / 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> com. fasterxml. jackson. core< / groupId>
< artifactId> jackson- databind< / artifactId>
< version> 2.9 .0 < / version>
< / dependency>
< / dependencies>
< build>
< plugins>
< plugin>
< groupId> org. apache. tomcat. maven< / groupId>
< artifactId> tomcat7- maven- plugin< / artifactId>
< version> 2.1 < / version>
< configuration>
< port> 80 < / port>
< path> / < / path>
< / configuration>
< / plugin>
< / plugins>
< / build>
< properties>
< maven. compiler. source> 11 < / maven. compiler. source>
< maven. compiler. target> 11 < / maven. compiler. target>
< / properties>
< / project>