目录
**
CMS内容管理系统
**
关于springboot、springmvc、mybatis等相关框架的组合项目,主要处理后台数据以及前后端分离数据交互。涉及文章、栏目、链接及消费者的数据操作。欢迎点击关注!及时更新!
项目技术
- Maven
一个项目管理工具,可以对 Java 项目进行构建、依赖管理 - Mybatis
一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。 - SpringBoot
由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 - SpringMVC
属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。 - mybatis-generator
根据数据库表自动的生成映 射文件,映射接口,pojo类,让开发人员不再去 关心dao层开发 - Mysql/Oracle
数据库 - Swagger
Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS)。
Swagger 可以贯穿于整个 API 生态,如 API 的设计、编写 API 文档、测试和部署。
Swagger 是一种通用的,和编程语言无关的 API 描述规范。
环境搭建
Maven配置(这里用apache-maven-3.3.9)
Windows–>系统–>高级系统设置–>环境变量
path中添加路径
输入mvn --version,出现版本信息,maven配置成功
eclipse/IDEA集成Maven
eclipse:
Window–>Preferences–>查找Maven
添加Maven位置
配置配置文件及本地仓库位置
IDEA:
File–>settings搜索Maven
添加Maven相关配置信息及本地仓库位置
项目搭建
eclipse:搭建springboot项目
右击–>new–>Spring Stater Project
添加相关依赖
注:根据数据库选择驱动。添加热部署、mybatis、MySQL驱动、SpringMVC相关依赖。
IDEA:搭建springboot项目
根据自己信息修改
添加依赖(数据库驱动自选)
IDEA与eclipse类似,以下则以eclipse为例(数据库使用mysql)有问题联系博主
集成 Mybatis-generator
1.在resources目录下新建generatorConfig.xml
文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- mybatis-generator的核心配置文件 -->
<generatorConfiguration>
<classPathEntry location="E:/MavenRespotion/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 自动生成的Bean对象,是否实现序列化接口 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<!-- 自动生成的Bean对象,是否重写toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 注意!如果要重新生成pojo类,务必改成项目组数据库,用户名密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/cms?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"
userId="root"
password="root">
</jdbcConnection>
<!--指定生成的类型为java类型,避免数据库中number等类型字段 -->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--自动生成的实体的存放包路径 -->
<javaModelGenerator targetPackage="com.demo.bean" targetProject="./src/main/java">
<!-- 生成包结构 -->
<property name="enableSubPackages" value="true" />
<!-- 是否对结果trim操作 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--自动生成的*Mapper.xml文件存放路径 -->
<sqlMapGenerator targetPackage="mapper" targetProject="./src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--自动生成的*Mapper.java存放路径 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.demo.mapper" targetProject="./src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 映射配置 -->
<table tableName="cms_link" domainObjectName="Link"></table>
<table tableName="cms_customer" domainObjectName="Customer"></table>
<table tableName="cms_category" domainObjectName="Category"></table>
<table tableName="cms_article" domainObjectName="Article">
<columnOverride column="content" javaType="java.lang.String" jdbcType="VARCHAR"></columnOverride>
</table>
</context>
</generatorConfiguration>
2.pom.xml文件添加插件
<!-- mybatis-generator 自动代码插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<!-- 配置文件 -->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<!-- 允许移动和修改 -->
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<!-- jdbc 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<dependency>
<groupId>com.itfsw</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.0.11</version>
</dependency>
</dependencies>
</plugin>
3.使用mybatis逆向工程自动生成映射接口/映射文件
cmd到项目目录执行maven命令,即可
mvn mybatis-generator:generate或mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
执行成功会生成一系列映射接口和映射文件
在springboot中配置映射文件/映射接口
程序入口:@SpringBootApplication修饰的类配置映射接口
@MapperScan("com.demo.mapper")
配置文件:application.properties配置映射文件
mybatis.mapper-locations=classpath:mapper/*.xml
配置Swagger,用于前后端数据交互检查
1.在pom.xml中添加相关依赖
<!-- swagger的相关依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
2.新建Swagger2Config配置类来配置swagger
/**
* swagger配置类
*
*/
@Configuration
@EnableSwagger2
public class Swagger2Config {
/**
* 创建API应用
* apiInfo() 增加API相关信息
* 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
* 本例采用指定扫描的包路径来定义指定要建立API的目录。
* @return
*/
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.demo.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
/**
* 创建该API的基本信息(这些基本信息会展现在文档页面中)
* 访问地址:http://项目实际地址/swagger-ui.html
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("看点咨询")
.description("xxx公司,http://www.xxx.com")
.termsOfServiceUrl("http://www.xxx.com")
.version("1.1")
.build();
}
}
3.访问 ip:port/swagger-ui.html即可进入swagger-ui界面
数据库表的创建(栏目表、文章表、用户表、链接表)
Oracle:
create table cms_category(
id number(11),
code number(20),
name varchar2(255),
primary key(id)
);
create table cms_article(
id number(11),
author varchar2(255),
clicktimes number(11),
content varchar2(255),
publishDate Date,
title varchar2(15),
category_id number(11),
primary key(id),
foreign key(category_id) references cms_category(id)
);
create table cms_customer(
id number(11),
username varchar2(255) not null,
password varchar2(255) not null,
primary key(id)
);
create table cms_link(
id number(11),
name varchar2(255) not null,
url varchar2(255) not null,
primary key(id)
);
Mysql:
create table `cms_category`(
`id` int(11) auto_increment,
`code` bigint(20) default null,
`name` varchar(255),
primary key(`id`)
)engine=InnoDB auto_increment=1 default charset=utf8;
create table `cms_article`(
`id` int(11) auto_increment,
`author` varchar(255) default null,
`clicktimes` int(11),
`content` text default null,
`publishDate` date default null,
`title` varchar(15),
`category_id` int(11),
primary key(`id`),
key `fk_article_category`(`category_id`),
constraint `fk_article_category` foreign key(`category_id`)
references `cms_article`(`id`)
)engine=InnoDB auto_increment=1 default charset=utf8;
create table `cms_customer`(
`id` int(11) not null auto_increment,
`username` varchar(255) default null,
`password` varchar(255) default null,
primary key(`id`)
)engine=InnoDB auto_increment=1 default charset=utf8;
create table `cms_link`(
`id` int(11) not null auto_increment,
`name` varchar(255) default null,
`url` varchar(255) default null,
primary key(`id`)
)engine=InnoDB auto_increment=1 default charset=utf8;
application.properties中配置数据源、修改端口号
server.port=8989
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url= jdbc:mysql://localhost:3306/cms?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
动动手吧
三层架构:
web层:springmvc,controller(接收前台请求)
Service层:编写逻辑代码,接口,接口实现类(真正的逻辑代码)
dao层:操作数据库,映射接口、映射文件
编写工具类
1.创建utils包
CustomerException:自定义异常
Message:封装将来返回数据的对象
MessageUtil:进一步封装工具类,提供简便返回目标对象,返回数据直接调用静态方法
StatusCodeUtil:用于封装状态码
CustomerException.java
public class CustomerException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 状态码
*/
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public CustomerException(Integer code,String message) {
super(message);
this.code = code;
}
}
Message.java
public class Message<T> {
/**
* 状态码
*/
private Integer status;
/**
* 返回信息
*/
private String message;
/**
* 返回的数据类
*/
private T data;
/**
* 返回时间
*/
private Long time;
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Long getTime() {
return time;
}
public void setTime(Long time) {
this.time = time;
}
public Message(Integer status, String message, T data, Long time) {
super();
this.status = status;
this.message = message;
this.data = data;
this.time = time;
}
public Message() {
super();
}
}
MessageUtil.java
public class MessageUtil {
/**
* 成功,并且返回数据
* 第一个标识,后面泛型类
* 第二个泛型
*/
public static <E>Message<E> success(E obj){
return new Message<E>(200,"success",obj,new Date().getTime());
}
/**
* 成功,无返回值
*/
public static <E>Message<E> success(){
return new Message<E>(200,"success",null,new Date().getTime());
}
/**
* 失败,返回自定义异常
*/
public static <E>Message<E> error(Integer code,String msg){
return new Message<E>(code, msg, null, new Date().getTime());
}
}
StatusCodeUtil.java
public class StatusCodeUtil {
public static final Integer ERROR_CODE = 500;
public static final Integer NOFOUND_CODE = 404;
public static final Integer NOALLOW_CODE = 405;
}
待续…