文章目录
1,nacos快速启动
windows上nacos的本地启动比较麻烦,每次要打开cmd,切换到对应目录,执行一个不容易记住命令,效率很低。
要解决这个问题也很简单,写一个bat脚本,配置到环境变量中,以后只要输入一个简单的命令就可以启动nacos了。
@echo off
setlocal enabledelayedexpansion
set NAOS_HOME=D:\sofeware\nacos-server-2.1.2\nacos
cd /d "!NAOS_HOME!\bin"
call startup.cmd -m standalone
endlocal
将这个脚本所在的目录配置到环境变量。
之后,只要在cmd输入下面的命令就可以启动nacos了。
2,日志配置为debug
logging:level:com.atguigu.gulimaill: debug
3,模板代码配置
后续会频繁使用httpget和httppost请求,为了提高效率,可以配置到vscode的代码模板中。
"http-get 请求": {
"prefix": "httpget",
"body": [
"this.\\$http({",
"url: this.\\$http.adornUrl(''),",
"method: 'get',",
"params: this.\\$http.adornParams({})",
"}).then(({data}) => {",
"})"
],
"description": "httpGET 请求"
},
"http-post 请求": {
"prefix": "httppost",
"body": [
"this.\\$http({",
"url: this.\\$http.adornUrl(''),",
"method: 'post',",
"data: this.\\$http.adornData(data, false)",
"}).then(({ data }) => { });"
],
"description": "httpPOST 请求"
}
这样只要输入httppost
和httpget
,vscode
就可以给出提示,确认后就可以自动插入模板代码,代替手敲,极大的提高编码效率。
4,配置Vue单文件组件模板
在VSCode中使用代码片段(Snippets)可以极大地提高编写代码的效率,特别是在处理像Vue单文件组件(SFCs - Single File Components)这样的结构化代码时。
代码片段允许你通过输入简短的文本字符串来自动扩展成更复杂的代码块,从而节省时间和减少重复工作。
在VSCode,选择File->Preferences->Configure User Snippets
。
选择“New Global Sinppets file…”。
输入名称,比如vue后按回车,就会打开一个vue.json的文件,复制下面内容到文件中并保存。
{
"生成 vue 模板": {
"prefix": "vue",
"body": [
"<template>",
"<div></div>",
"</template>",
"",
"<script>",
"//这里可以导入其他文件(比如:组件,工具 js,第三方插件 js,json文件,图片文件等等)",
"//例如:import 《组件名称》 from '《组件路径》';",
"",
"export default {",
"//import 引入的组件需要注入到对象中才能使用",
"components: {},",
"props: {},",
"data() {",
"//这里存放数据",
"return {",
"",
"};",
"},",
"//计算属性 类似于 data 概念",
"computed: {},",
"//监控 data 中的数据变化",
"watch: {},",
"//方法集合",
"methods: {",
"",
"},",
"//生命周期 - 创建完成(可以访问当前 this 实例)",
"created() {",
"",
"},",
"//生命周期 - 挂载完成(可以访问 DOM 元素)",
"mounted() {",
"",
"},",
"beforeCreate() {}, //生命周期 - 创建之前",
"beforeMount() {}, //生命周期 - 挂载之前",
"beforeUpdate() {}, //生命周期 - 更新之前",
"updated() {}, //生命周期 - 更新之后",
"beforeDestroy() {}, //生命周期 - 销毁之前",
"destroyed() {}, //生命周期 - 销毁完成",
"activated() {}, //如果页面有 keep-alive 缓存功能,这个函数会触发","}",
"</script>",
"<style scoped>",
"//@import url($3); 引入公共 css 类",
"$4",
"</style>"
],
"description": "生成 vue 模板"
}
}
之后,只要在代码编写中输入vue,就会有如下提示,右侧的备注,确定之后按回车,就会自动插入大段模板代码。
5,一键执行初始化脚本
课程提供了项目的初始化脚本。
但是要手动逐个建库,执行脚本,还是比较费时间的。
特别是因为虚拟机或者其他原因,学习过程中需要多次初始化数据库,逐个手动执行,很影响效率。
所以,这里写了个Java脚本,一键完成建库、建表、插入初始化数据的工作。
package com.lcy.exercise.mysql;
import cn.hutool.core.util.StrUtil;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
public class SqlScriptExecutor {
private static final String DB_URL = "jdbc:mysql://47.11.7.59:3306/";
private static final String USER = "root"; // 请替换为实际的用户名
private static final String PASS = "68bed551"; // 请替换为实际的密码
public static void main(String[] args) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
File folder = new File("D:\\BaiduNetdiskDownload\\GuliMall_Resources\\GuliMall\\gulimall\\db");
for (File file : folder.listFiles()) {
if (file.isFile() && file.getName().endsWith(".sql")) {
executeSqlScript(file);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void executeSqlScript(File file) throws Exception {
String dbName = file.getName().replace(".sql", "");
System.out.println(StrUtil.format("当前数据库:{}", dbName));
boolean dbExists = checkIfDatabaseExists(dbName);
Connection conn = null;
try {
// 如果数据库不存在,则创建它
if (!dbExists) {
conn = DriverManager.getConnection(StrUtil.format("{}?useSSL=false",DB_URL), USER, PASS);
Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE DATABASE " + dbName);
stmt.close();
}
// 连接到数据库
conn = DriverManager.getConnection(StrUtil.format("{}{}?useSSL=false",DB_URL, dbName), USER, PASS);
Statement stmt = conn.createStatement();
// 读取SQL脚本文件
// Read SQL script file
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
StringBuilder sqlCommand = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sqlCommand.append(line).append('\n');
if (line.trim().endsWith(";")) {
executeSqlCommand(stmt, sqlCommand.toString());
sqlCommand.setLength(0); // Reset StringBuilder
}
}
} catch (IOException e) {
System.out.println("Error reading file: " + e.getMessage());
}
} finally {
if (conn != null) {
conn.close();
}
}
}
private static boolean checkIfDatabaseExists(String dbName) throws Exception {
Connection conn = DriverManager.getConnection(StrUtil.format("{}?useSSL=false",DB_URL), USER, PASS);
Statement stmt = conn.createStatement();
String query = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '" + dbName + "'";
ResultSet rs = stmt.executeQuery(query);
boolean exists = rs.next();
rs.close();
stmt.close();
conn.close();
return exists;
}
private static void executeSqlCommand(Statement stmt, String sqlCommand) {
try {
stmt.execute(sqlCommand);
// System.out.println("Executed: " + sqlCommand);
} catch (Exception e) {
System.out.println("Error executing SQL command: " + sqlCommand);
e.printStackTrace();
}
}
}
下面详细地分析一下上面提供的Java代码。
代码结构概述
- 主类定义 - 定义了一个名为
SqlScriptExecutor
的公共类。 - 主方法 (
main
方法) - 这是程序的入口点,它遍历指定目录下的所有文件。 - 执行SQL脚本的方法 (
executeSqlScript
) - 这个方法负责连接到数据库、创建数据库(如果不存在)、读取并执行SQL脚本文件中的命令。 - 执行SQL命令的方法 (
executeSqlCommand
) - 这个方法用于执行单条SQL命令,并捕获可能发生的异常。
详细解释
1. 主方法 (main
方法)
public static void main(String[] args) {
String path = "D:\\BaiduNetdiskDownload\\GuliMall_Resources\\GuliMall\\gulimall\\db";
File directory = new File(path);
if (!directory.exists() || !directory.isDirectory()) {
System.out.println("Directory does not exist or is not a directory.");
return;
}
for (File file : directory.listFiles()) {
if (file.isFile() && file.getName().endsWith(".sql")) {
String dbName = file.getName().substring(0, file.getName().indexOf('.'));
executeSqlScript(file, dbName);
}
}
}
path
变量存储了要读取的目录路径。- 创建一个
File
对象directory
来表示该目录。 - 检查该路径是否存在并且确实是一个目录。如果不是,打印一条消息并退出程序。
- 使用
listFiles()
方法获取目录下的所有文件,并遍历它们。 - 对于每一个文件,检查它是否是一个
.sql
文件,如果是,则获取文件名(不包括扩展名),这通常会被认为是数据库的名称,并调用executeSqlScript
方法来处理该文件。
2. 执行SQL脚本的方法 (executeSqlScript
方法)
private static void executeSqlScript(File file, String dbName) {
try (Connection conn = DriverManager.getConnection(DB_URL + dbName, USER, PASS)) {
// Check if the database exists and create it if necessary
Statement stmt = conn.createStatement();
String checkDbQuery = "CREATE DATABASE IF NOT EXISTS `" + dbName + "`";
stmt.executeUpdate(checkDbQuery);
// Read SQL script file
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
StringBuilder sqlCommand = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sqlCommand.append(line).append('\n');
if (line.trim().endsWith(";")) {
executeSqlCommand(stmt, sqlCommand.toString());
sqlCommand.setLength(0); // Reset StringBuilder
}
}
} catch (IOException e) {
System.out.println("Error reading file: " + e.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
}
- 使用
DriverManager.getConnection()
方法建立与数据库的连接。 - 使用
createStatement()
方法创建一个Statement
对象。 - 执行
CREATE DATABASE IF NOT EXISTS
语句来确保数据库存在。 - 使用
BufferedReader
从文件中逐行读取内容。 - 将读取的内容追加到
StringBuilder
中,直到遇到分号;
结束符。 - 当遇到分号时,调用
executeSqlCommand
方法执行SQL命令,并清空StringBuilder
准备接收下一个SQL命令。
3. 执行SQL命令的方法 (executeSqlCommand
方法)
private static void executeSqlCommand(Statement stmt, String sqlCommand) {
try {
stmt.execute(sqlCommand);
System.out.println("Executed: " + sqlCommand);
} catch (Exception e) {
System.out.println("Error executing SQL command: " + sqlCommand);
e.printStackTrace();
}
}
- 使用
stmt.execute(sqlCommand)
方法执行SQL命令。 - 如果执行成功,打印出执行的SQL命令。
- 如果执行失败,打印出错误信息和堆栈跟踪。