SpringBoot 項目搭建
SpringBoot 項目整合源碼
博客地址:SpringBoot 項目整合源碼
其實不用直接去看源碼了,源碼也是按下面步驟搭建完的結果
SpringBoot 項目整合
一、項目准備
1.1 快速創建 SpringBoot 項目
博客地址:快速搭建 SpringBoot 項目(看完 【 1. 快速創建 SpringBoot 項目】 就可以回到這里了)
1.2 標准項目結構圖如下
1.3 添加springboot-parent
<parent>
<groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.4.3version> <relativePath/> parent>
1.4 添加 spring-boot-start-web
<dependency>
<groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency>
1.5 添加 Lambok 依賴
<dependency>
<groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> dependency>
1.6 SpringBoot 打包插件
<plugin>
<groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin>
1.7 添加 application.properties
# 修改端口號
server.port=80
1.8 編寫啟動類App
@SpringBootApplication
@MapperScan("com.yy.mapper")
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
1.9 在 resources 創建static靜態資源目錄
1.10 在 resources 創建templates模板目錄
1.11 在 resources 添加 banner.txt 文件
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||_ \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
佛祖保佑 永無BUG
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
二、整合數據庫連接池
2.1 集成druid數據源
<dependency>
<groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>druid-spring-boot-starterartifactId> <version>1.2.5version> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-jdbcartifactId> dependency>
2.2 配置application.properties 文件
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin
2.3 數據源
- 默認數據源-Hikari
在springboot2.0之后 , 采用的默認連接池就是Hikari, 號稱"史上最快的連接池", 所以我們沒有添加依賴也能直接用, springboot的自動配置中含有DataSourceAutoConfiguration配置類, 會先檢查容器中是否已經有連接池對象, 沒有則會使用默認的連接池, 並根據特定的屬性來自動配置連接池對象, 用到的屬性值來源於DataSourceProperties對象。
- 配置 Druid 數據源
只需要添加依賴即可, 此時加的是Druid的springboot自動配置包, 里面包含了DruidDataSourceAutoConfigure自動配置類,會自動創建druid的連接池對象, 所以springboot發現已經有連接池對象了,則不會再使用Hikari。
<dependency>
<groupId>com.alibabagroupId> <artifactId>druid-spring-boot-starterartifactId> <version>1.2.5version> dependency>
注意: 如果添加的依賴是以前那種普通包, 也就是和以前 ssm 項目一樣,只添加 Druid 自身的依賴, 並不是自動配置包, 則需要以下配置(一般如果已經提供了springboot相關的自動配置包 , 直接使用自動配置的會更方便些):
<dependency>
<groupId>com.alibabagroupId> <artifactId>druidartifactId> <version>1.1.19version> dependency>
還要在 application.properties 中加上一下配置。
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
三、集成MyBatis
3.1 案例准備
需求:員工列表
1:將項目一里面員工表拷貝到新建的springboot表
2:拷貝逆向工程,創建員工domain, mapper
3:整合mybatis
3.2 准備依賴
<dependency>
<groupId>org.mybatis.spring.bootgroupId> <artifactId>mybatis-spring-boot-starterartifactId> <version>2.1.4version> dependency>
3.3 配置Mapper接口掃描器
只要在配置類上貼個注解@MapperScan(…)即可。
@SpringBootApplication
@MapperScan("com.yy.mapper")
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
3.4 配置屬性
application.properties
以前在XML配置了哪些mybatis的屬性在這里就配置哪些屬性,屬性前綴mybatis。
#mybatis.configuration.lazy-loading-enabled=true
#mybatis.configuration.lazy-load-trigger-methods=clone
#mybatis.mapper-locations=classpath:cn/wolfcode/*/mapper/*Mapper.xml
#mybatis.type-aliases-package=cn.wolfcode.sb.domain
3.5 設置SQL打印日志
#打印SQL日志
logging.level.cn.wolfcode.crm.mapper=trace
四、添加事務管理
4.1 准備依賴
<dependency>
<groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-aopartifactId> dependency>
-
XML方式(了解)
采取配置類和XML混用的策略, 在配置類上使用@ImportResource(“classpath:spring-tx.xml”)。 -
注解方式
直接在業務層實現類上或者其方法上直接貼@Transactional注解即可。
#SpringBoot默認優先選擇CGLIB代理,如果需要改為優先使用JDK代理,需要做以下配置
#spring.aop.proxy-target-class=false #優先使用JDK代理
SpringBoot 自動配置中提供了TransactionAutoConfiguration事務注解自動配置類 , 引入了事務的依賴后, 可直接使用@Transactional注解 。
五、靜態資源處理
-
默認情況下,Springboot會從classpath下的 /static , /public , /resources , /META-INF/resources下加載靜態資源;
-
可以在application.properties中配置spring.resources.staticLocations屬性來修改靜態資源加載地址;
-
因為應用是打成jar包,所以之前的src/main/webapp就作廢了,如果有文件上傳,那么就的必須去配置圖片所在的路徑;
六、集成FreeMarker
6.1 准備依賴
<dependency>
<groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-freemarkerartifactId> dependency>
6.2 配置資源文件
#一般我們會做3個配置,其余默認即可
#暴露session對象的屬性
spring.freemarker.expose-session-attributes=true
#配置為傳統模式,空值自動處理
spring.freemarker.settings.classic_compatible=true
#重新指定模板文件后綴 springboot 2.2.x 后 默認后綴為 .ftlh
spring.freemarker.suffix=.ftl
6.3 常見配置屬性
spring.freemarker.enabled=true: 是否開啟freemarker支持
spring.freemarker.charset=UTF-8: 模板編碼
spring.freemarker.content-type=text/html: 模板contenttype
spring.freemarker.expose-session-attributes: 是否開啟session屬性暴露,默認false
spring.freemarker.prefix: 加載模板時候的前綴
spring.freemarker.settings.*: 直接配置freemarker參數
spring.freemarker.suffix: 模板文件后綴
spring.freemarker.template-loader-path=classpath:/templates/: 模板加載地址
七、統一異常處理
7.1 框架自帶方式
SpringBoot默認情況下,會把所有錯誤都交給BasicErrorController類完成處理,錯誤的視圖導向到 classpath:/static/error/ 和 classpath:/templates/error/ 路徑上,http狀態碼就是默認視圖的名稱
如: 出現404錯誤 -> classpath:/static/error/404.html 或者 出現5xx類錯誤 -> classpath:/static/error/5xx.html
7.2 控制器增強器方式
自己定義一個控制器增強器,專門用於統一異常處理,該方式一般用於5xx類錯誤
@ControllerAdvice //控制器增強器
public class ExceptionControllerAdvice {
@ExceptionHandler(RuntimeException.class) //處理什么類型的異常
public String handlException(RuntimeException e, Model model) {
return "errorView"; //錯誤頁面視圖名稱
}
}
八、添加攔截器
8.1 自定義攔截器
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI();
if (url.contains("/employee")) {
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("請先登錄");
return false;
}
return true;
}
}
8.2 注冊攔截器
聲明一個配置類, 實現WebMvcConfigurer接口 ,在addInterceptors方法注冊攔截器
@SpringBootApplication
// mybatis 中 mapper 接口掃描器,指定參數為:mapper 接口所在路徑
// 功能:將包中路徑下所有接口動態代理,創建 mapper 接口實現類交給 spring 容器管理
@MapperScan(basePackages = "com.yy.springboot.mapper")
public class MvcJavaConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Autowired
private PermissionInterceptor permissionInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
// 注冊登錄攔截器
registry.addInterceptor(loginInterceptor)
// 對哪些資源起過濾作用
.addPathPatterns("/**")
// 對哪些資源起排除作用
.excludePathPatterns("/loginUser","/login.html","/css/**","/js/**");
}
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
九、添加系統日志
9.1 SpringBoot中的日志介紹
- Springboot默認已經開啟日志
默認的日志格式為: 時間 日志級別 線程ID 線程名稱 日志類 日志說明;
-
Springboot的日志分為: 系統日志和應用日志;
-
日志級別,設置的級別越高,輸出的內容越少, 如果設置的級別為info, 則debug以及trace級別的都無法顯示
trace < debug < info < warn < error; -
Springboot默認選擇Logback作為日志框架,也能選擇其他日志框架,但是沒有必要
common-logging / java-logging / log4j / log4j2 / logback / slf4j; -
SpringBoot 默認日志級別是 info,因為 debug、trace 低於 info 級別,所以不會顯示,除非主動配置;
9.2 類中使用日志輸出
方式1: 在類中定義一個靜態Logger對象
這里傳入當前類的作用是方便輸出日志時可以清晰地看到該日志信息是屬於哪個類的(導入的包是 org.slf4j)
private static final Logger log = LoggerFactory.getLogger(當前類.class);
方式2: 使用lombok提供的@Slf4j注解來簡化代碼 , 其實和方式1的作用是一樣的
@Slf4j
@Service
public class PermissionServiceImpl implements IPermissionService {}
在需要輸出日志的地方使用日志的輸出方法(一般我們在 CRUD 操作前后進行日志信息輸出,error 一般在 catch 中輸出)
log.info(...);
log.error(...);
...
//輸出日志中有變量可以使用{}作為占位符
log.info("刪除id為{}的數據", id);
十、逆向工程
10.1 導入逆向工程插件
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generatorgroupId> <artifactId>mybatis-generator-maven-pluginartifactId> <version>1.3.2version> <configuration> <verbose>trueverbose> <overwrite>falseoverwrite> configuration> <dependencies> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.45version> dependency> dependencies> plugin> plugins> build>
10.2 generatorConfig.xml 配置文件
<generatorConfiguration>
<context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple">
<property name="autoDelimitKeywords" value="false" />
<property name="javaFileEncoding" value="UTF-8" />
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter" />
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter" />
<property name="beginningDelimiter" value="`" />
<property name="endingDelimiter" value="`" />
<commentGenerator>
<property name="suppressDate" value="true" />
<property name="suppressAllComments" value="true" />
commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql:///car" userId="root" password="admin"> jdbcConnection> <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl"> <property name="forceBigDecimals" value="false" /> javaTypeResolver> <javaModelGenerator targetPackage="com.yy.homework.domain" targetProject="src/main/java"> <property name="constructorBased" value="false" /> <property name="immutable" value="false" /> javaModelGenerator> <sqlMapGenerator targetPackage="com.yy.homework.mapper" targetProject="src/main/resources"> <property name="enableSubPackages" value="true" /> sqlMapGenerator> <javaClientGenerator targetPackage="com.yy.homework.mapper" type="XMLMAPPER" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> javaClientGenerator> <table tableName="message_reply"> <property name="useActualColumnNames" value="false"/> <property name="constructorBased" value="false" /> <generatedKey column="id" sqlStatement="JDBC" /> table> context> generatorConfiguration>
十一、分頁查詢
11.1 導入依賴
<dependency>
<groupId>com.github.pagehelpergroupId> <artifactId>pagehelper-spring-boot-starterartifactId> <version>1.3.0version> dependency>
11.2 分頁代碼-EmployeeQuery
@Setter
@Getter
public class QueryObject {
private int currentPage = 1;
private int pageSize = 5;
}
@Setter
@Getter
public class EmployeeQuery extends QueryObject {
private String keyword;
}
11.3 分頁邏輯代碼
public PageInfo<Employee> query(QueryObject qo) {
PageHelper.startPage(qo.getCurrentPage(),qo.getPageSize());
List<Employee> employees = employeeMapper.selectForList(qo);
return new PageInfo<>(employees);
}
<sql id="where_sql">
<where>
<if test="keyword != null and keyword !=''">
and (e.name like concat('%', #{keyword} ,'%') or e.email like concat('%', #{keyword} ,'%'))
where> sql> <select id="selectForList" resultMap="BaseResultMap"> select e.id, e.name,e.username, e.password, e.email, e.age, e.admin, e.deptId from employee e <include refid="where_sql" /> select>
11.4 測試
@RequestMapping("/list")
public String list(Model model, @ModelAttribute("qo") EmployeeQuery qo){
model.addAttribute("pageInfo", employeeService.query(qo));
return "employee/list";
}
總結
以上就是 SpringBoot 項目搭建的介紹了,代碼僅供參考,歡迎討論交流。
SpringBoot 項目入門請看我上一篇博客,博客地址:SpringBoot快速入門(解析+入門案例源碼實現)