Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)
一、实现功能(原创,转载请告知)
1.自动配置pom配置文件
2.自动识别数据库及数据表,创建Entity、Dao、Service、Controller等
3.自动创建database.properties、mybatis-config.xml等数据库文件
4.自动创建spring-dao.xml spring-mvc.xml spring-service.xml等配置文件
5.自动生成web.xml配置文件
总结:你只需要写前端、sql语句、controller控制逻辑,即可完成SSM整合项目!
二、代码
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
import java.util.*;public class auto_main {public static void main(String[] args) {System.out.println("Designed by LJL");Scanner scanner = new Scanner(System.in);System.out.println("请输入昵称:");String name = scanner.nextLine();if (name != null && !name.equals("")) {System.out.println("请输入数据库账号:");String sqlName = scanner.nextLine();System.out.println("请输入数据库密码:");String sqlPassword = scanner.nextLine();System.out.println("请输入项目数据库名称:");String sqlProjectName = scanner.nextLine();// 获取当前工作目录的路径String currentDir = System.getProperty("user.dir");// 构建上级目录的路径,并创建名为src的文件夹String java_Dir = currentDir + File.separator + "src/main/java/com/" + name;//TODO pom文件依赖覆盖String pomxml = currentDir + File.separator + "/pom.xml";String pomxmlcontent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" +" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +" <modelVersion>4.0.0</modelVersion>\n" +"\n" +" <groupId>com." + name + "</groupId>\n" +" <artifactId>book-management</artifactId>\n" +" <version>1.0-SNAPSHOT</version>\n" +" <packaging>war</packaging>\n" +"\n" +" <properties>\n" +" <spring.version>5.3.9</spring.version>\n" +" <mybatis.version>3.5.7</mybatis.version>\n" +" </properties>\n" +"\n" +" <dependencies>\n" +" <!-- Spring -->\n" +" <dependency>\n" +" <groupId>org.springframework</groupId>\n" +" <artifactId>spring-webmvc</artifactId>\n" +" <version>5.3.20</version>\n" +" </dependency>\n" +" <dependency>\n" +" <groupId>org.springframework</groupId>\n" +" <artifactId>spring-jdbc</artifactId>\n" +" <version>5.3.9</version>\n" +" </dependency>\n" +" <dependency>\n" +" <groupId>org.springframework</groupId>\n" +" <artifactId>spring-context</artifactId>\n" +" <version>5.3.10</version>\n" +" </dependency>\n" +"\n" +" <!-- MyBatis -->\n" +" <dependency>\n" +" <groupId>org.mybatis</groupId>\n" +" <artifactId>mybatis</artifactId>\n" +" <version>3.5.11</version>\n" +" </dependency>\n" +" <dependency>\n" +" <groupId>org.mybatis</groupId>\n" +" <artifactId>mybatis-spring</artifactId>\n" +" <version>2.0.6</version>\n" +" </dependency>\n" +"\n" +" <!-- MySQL -->\n" +" <dependency>\n" +" <groupId>mysql</groupId>\n" +" <artifactId>mysql-connector-java</artifactId>\n" +" <version>8.0.32</version>\n" +" </dependency>\n" +"\n" +" <!-- 数据库连接池 -->\n" +" <dependency>\n" +" <groupId>com.mchange</groupId>\n" +" <artifactId>c3p0</artifactId>\n" +" <version>0.9.5.5</version>\n" +" </dependency>\n" +"\n" +" <!-- Lombok -->\n" +" <dependency>\n" +" <groupId>org.projectlombok</groupId>\n" +" <artifactId>lombok</artifactId>\n" +" <version>1.18.36</version>\n" +" <scope>provided</scope>\n" +" </dependency>\n" +"\n" +" <!-- Servlet & JSP -->\n" +" <dependency>\n" +" <groupId>javax.servlet</groupId>\n" +" <artifactId>javax.servlet-api</artifactId>\n" +" <version>4.0.1</version>\n" +" <scope>provided</scope>\n" +" </dependency>\n" +" <dependency>\n" +" <groupId>javax.servlet.jsp</groupId>\n" +" <artifactId>jsp-api</artifactId>\n" +" <version>2.2</version>\n" +" <scope>provided</scope>\n" +" </dependency>\n" +" <dependency>\n" +" <groupId>javax.servlet</groupId>\n" +" <artifactId>jstl</artifactId>\n" +" <version>1.2</version>\n" +" </dependency>\n" +"\n" +" <!-- JUnit -->\n" +" <dependency>\n" +" <groupId>org.junit.jupiter</groupId>\n" +" <artifactId>junit-jupiter</artifactId>\n" +" <version>RELEASE</version>\n" +" <scope>compile</scope>\n" +" </dependency>\n" +"\n" +" <!-- Jackson -->\n" +" <dependency>\n" +" <groupId>com.fasterxml.jackson.core</groupId>\n" +" <artifactId>jackson-core</artifactId>\n" +" <version>2.15.4</version>\n" +" </dependency>\n" +" <dependency>\n" +" <groupId>com.fasterxml.jackson.core</groupId>\n" +" <artifactId>jackson-databind</artifactId>\n" +" <version>2.15.4</version>\n" +" </dependency>\n" +"\n" +" <!-- 文件上传库 -->\n" +" <dependency>\n" +" <groupId>commons-fileupload</groupId>\n" +" <artifactId>commons-fileupload</artifactId>\n" +" <version>1.4</version>\n" +" </dependency>\n" +"\n" +" <!-- Minio -->\n" +" <dependency>\n" +" <groupId>io.minio</groupId>\n" +" <artifactId>minio</artifactId>\n" +" <version>8.5.4</version>\n" +" </dependency>\n" +" </dependencies>\n" +"\n" +" <build>\n" +" <plugins>\n" +" <plugin>\n" +" <groupId>org.apache.maven.plugins</groupId>\n" +" <artifactId>maven-compiler-plugin</artifactId>\n" +" <version>3.8.1</version>\n" +" <configuration>\n" +" <source>1.8</source>\n" +" <target>1.8</target>\n" +" </configuration>\n" +" </plugin>\n" +" </plugins>\n" +" </build>\n" +"</project>";updateFile(pomxml, pomxmlcontent);System.out.println("等待用户进行pom依赖更新!\n完成后请输入:1");int user_input = scanner.nextInt();if (user_input == 1) {int sql_status = 0;for (int i = 0; i < 2; i++) {sql_status = connectMysql(sqlName, sqlPassword, sqlProjectName);if (sql_status == 1) {continue;}try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}if (sql_status == 1) {//TODO Entity目录String Entity_Dir = java_Dir + File.separator + "Entity";//TODO Dao目录String Dao_Dir = java_Dir + File.separator + "Dao";//TODO Service及Impl目录String Service_Dir = java_Dir + File.separator + "Service";String ServiceImpl_Dir = Service_Dir + File.separator + "Impl";//TODO Controller目录String Controller_Dir = java_Dir + File.separator + "Controller";//TODO resources/spring目录,存放配置文件String resources_Dir = currentDir + File.separator + "src" + File.separator + "main" + File.separator + "resources";String spring_Dir = resources_Dir + File.separator + "spring";//TODO webapp/WEB-INF/pages目录String pages_Dir = currentDir + File.separator + "src/main/webapp/WEB-INF/pages/";createDir(spring_Dir);createDir(Entity_Dir);createDir(Dao_Dir);createDir(Service_Dir);createDir(ServiceImpl_Dir);createDir(Controller_Dir);createDir(pages_Dir);String springdaoxml = spring_Dir + "/spring-dao.xml";String springmvcxml = spring_Dir + "/spring-mvc.xml";String springservicexml = spring_Dir + "/spring-service.xml";String databaseproperties = resources_Dir + "/database.properties";String mybatisconfigxml = resources_Dir + "/mybatis-config.xml";String webxml = currentDir + File.separator + "src/main/webapp/WEB-INF/web.xml";String indexjsp = currentDir + File.separator + "src/main/webapp/index.jsp";String springdaocontent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<beans xmlns=\"http://www.springframework.org/schema/beans\"\n" +" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +" xmlns:context=\"http://www.springframework.org/schema/context\"\n" +" xmlns:tx=\"http://www.springframework.org/schema/tx\"\n" +" xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n" +" http://www.springframework.org/schema/beans/spring-beans.xsd\n" +" http://www.springframework.org/schema/context\n" +" http://www.springframework.org/schema/context/spring-context.xsd\n" +" http://www.springframework.org/schema/tx\n" +" http://www.springframework.org/schema/tx/spring-tx.xsd\">\n" +"\n" +" <!-- 配置整合mybatis -->\n" +" <!-- 1.关联数据库文件 -->\n" +" <context:property-placeholder location=\"classpath:database.properties\"/>\n" +"\n" +" <!-- 2.数据库连接池 -->\n" +" <bean id=\"dataSource\" class=\"com.mchange.v2.c3p0.ComboPooledDataSource\">\n" +" <!-- 配置连接池属性 -->\n" +" <property name=\"driverClass\" value=\"${jdbc.driver}\"/>\n" +" <property name=\"jdbcUrl\" value=\"${jdbc.url}\"/>\n" +" <property name=\"user\" value=\"${jdbc.username}\"/>\n" +" <property name=\"password\" value=\"${jdbc.password}\"/>\n" +"\n" +" <!-- 基本连接池配置 -->\n" +" <property name=\"initialPoolSize\" value=\"5\"/>\n" +" <property name=\"maxPoolSize\" value=\"30\"/>\n" +" <property name=\"minPoolSize\" value=\"10\"/>\n" +" </bean>\n" +"\n" +" <!-- 3.配置SqlSessionFactory对象 -->\n" +" <bean id=\"sqlSessionFactory\" class=\"org.mybatis.spring.SqlSessionFactoryBean\">\n" +" <!-- 注入数据库连接池 -->\n" +" <property name=\"dataSource\" ref=\"dataSource\"/>\n" +" <!-- 配置MyBatis全局配置文件:mybatis-config.xml -->\n" +" <property name=\"configLocation\" value=\"classpath:mybatis-config.xml\"/>\n" +" <!-- 扫描entity包 使用别名 -->\n" +" <property name=\"typeAliasesPackage\" value=\"com." + name + ".Entity\"/>\n" +" </bean>\n" +"\n" +" <!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->\n" +" <bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\">\n" +" <!-- 注入sqlSessionFactory -->\n" +" <property name=\"sqlSessionFactoryBeanName\" value=\"sqlSessionFactory\"/>\n" +" <!-- 给出需要扫描Dao接口包 -->\n" +" <property name=\"basePackage\" value=\"com." + name + ".Dao\"/>\n" +" </bean>\n" +"\n" +" <!-- 5.配置事务管理器 -->\n" +" <bean id=\"transactionManager\" class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\">\n" +" <!-- 注入数据库连接池 -->\n" +" <property name=\"dataSource\" ref=\"dataSource\"/>\n" +" </bean>\n" +"\n" +" <!-- 6.开启事务注解 -->\n" +" <tx:annotation-driven transaction-manager=\"transactionManager\"/>\n" +"</beans> ";String springmvccontent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<beans xmlns=\"http://www.springframework.org/schema/beans\"\n" +" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +" xmlns:context=\"http://www.springframework.org/schema/context\"\n" +" xmlns:mvc=\"http://www.springframework.org/schema/mvc\"\n" +" xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n" +" http://www.springframework.org/schema/beans/spring-beans.xsd\n" +" http://www.springframework.org/schema/context\n" +" http://www.springframework.org/schema/context/spring-context.xsd\n" +" http://www.springframework.org/schema/mvc\n" +" http://www.springframework.org/schema/mvc/spring-mvc.xsd\">\n" +"\n" +" <!-- 1.开启SpringMVC注解驱动 -->\n" +" <mvc:annotation-driven/>\n" +" \n" +" <!-- 2.静态资源默认配置 -->\n" +" <mvc:default-servlet-handler/>\n" +"\n" +" <!-- 3.配置jsp 显示ViewResolver视图解析器 -->\n" +" <bean class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\">\n" +" <property name=\"viewClass\" value=\"org.springframework.web.servlet.view.JstlView\"/>\n" +" <property name=\"prefix\" value=\"/WEB-INF/pages/\"/>\n" +" <property name=\"suffix\" value=\".jsp\"/>\n" +" </bean>\n" +"\n" +" <!-- 4.扫描web相关的bean -->\n" +" <context:component-scan base-package=\"com." + name + ".Controller\"/>\n" +"<bean id=\"multipartResolver\" class=\"org.springframework.web.multipart.commons.CommonsMultipartResolver\">\n" +" <property name=\"defaultEncoding\" value=\"UTF-8\"/>\n" +" <property name=\"maxUploadSize\" value=\"2097152\"/>\n" +" </bean>\n" +"</beans> \n";String springservicecontent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<beans xmlns=\"http://www.springframework.org/schema/beans\"\n" +" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +" xmlns:context=\"http://www.springframework.org/schema/context\"\n" +" xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n" +" http://www.springframework.org/schema/beans/spring-beans.xsd\n" +" http://www.springframework.org/schema/context\n" +" http://www.springframework.org/schema/context/spring-context.xsd\">\n" +"\n" +" <!-- 扫描service相关的bean -->\n" +" <context:component-scan base-package=\"com." + name + ".Service\" />\n" +"</beans> ";String databasepropertiescontent = "jdbc.driver=com.mysql.cj.jdbc.Driver\n" +"jdbc.url=jdbc:mysql://localhost:3306/" + sqlProjectName + "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8\n" +"jdbc.username=" + sqlName +"\n" +"jdbc.password=" + sqlPassword;String mybatisconfigxmlcontent = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +"<!DOCTYPE configuration\n" +" PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"\n" +" \"http://mybatis.org/dtd/mybatis-3-config.dtd\">\n" +"<configuration>\n" +" <!-- 配置全局属性 -->\n" +" <settings>\n" +" <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->\n" +" <setting name=\"useGeneratedKeys\" value=\"true\" />\n" +" <!-- 使用列别名替换列名 默认:true -->\n" +" <setting name=\"useColumnLabel\" value=\"true\" />\n" +" <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->\n" +" <setting name=\"mapUnderscoreToCamelCase\" value=\"true\" />\n" +" </settings>\n" +"</configuration> ";String webxmlcontent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<web-app xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\"\n" +" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +" xsi:schemaLocation=\"http://xmlns.jcp.org/xml/ns/javaee\n" +" http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd\"\n" +" version=\"4.0\">\n" +"\n" +" <!--允许访问jpg。 并且必须加在springmvc的servlet之前-->\n" +" <servlet-mapping>\n" +" <servlet-name>default</servlet-name>\n" +" <url-pattern>*.jpg</url-pattern>\n" +" </servlet-mapping>\n" +" <servlet-mapping>\n" +" <servlet-name>default</servlet-name>\n" +" <url-pattern>*.docx</url-pattern>\n" +" </servlet-mapping>\n" +" <servlet-mapping>\n" +" <servlet-name>default</servlet-name>\n" +" <url-pattern>*.pdf</url-pattern>\n" +" </servlet-mapping>\n" +"\n" +" <!-- 配置Spring的监听器,默认只加载WEB-INF目录下的applicationContext.xml配置文件 -->\n" +" <listener>\n" +" <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>\n" +" </listener>\n" +"\n" +" <!-- 配置Spring配置文件的位置 -->\n" +" <context-param>\n" +" <param-name>contextConfigLocation</param-name>\n" +" <param-value>\n" +" classpath:spring/spring-dao.xml\n" +" classpath:spring/spring-service.xml\n" +" </param-value>\n" +" </context-param>\n" +"\n" +" <!-- 配置DispatcherServlet -->\n" +" <servlet>\n" +" <servlet-name>DispatcherServlet</servlet-name>\n" +" <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>\n" +" <init-param>\n" +" <param-name>contextConfigLocation</param-name>\n" +" <param-value>classpath:spring/spring-mvc.xml</param-value>\n" +" </init-param>\n" +" <load-on-startup>1</load-on-startup>\n" +" </servlet>\n" +" <servlet-mapping>\n" +" <servlet-name>DispatcherServlet</servlet-name>\n" +" <url-pattern>/</url-pattern>\n" +" </servlet-mapping>\n" +"\n" +" <!-- 编码过滤器 -->\n" +" <filter>\n" +" <filter-name>encodingFilter</filter-name>\n" +" <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>\n" +" <init-param>\n" +" <param-name>encoding</param-name>\n" +" <param-value>UTF-8</param-value>\n" +" </init-param>\n" +" </filter>\n" +" <filter-mapping>\n" +" <filter-name>encodingFilter</filter-name>\n" +" <url-pattern>/*</url-pattern>\n" +" </filter-mapping>\n" +"</web-app>\n";String indexjspcontent = "<%@ page contentType=\"text/html;charset=UTF-8\" language=\"java\" %>\n" +"<% response.sendRedirect(request.getContextPath() + \"/\"); %>";createXml(springdaoxml, springdaocontent);createXml(springmvcxml, springmvccontent);createXml(springservicexml, springservicecontent);createXml(databaseproperties, databasepropertiescontent);createXml(mybatisconfigxml, mybatisconfigxmlcontent);updateFile(webxml, webxmlcontent);updateFile(indexjsp, indexjspcontent);//TODO 根据数据库创建Entity实体类、Service、ImplList<Map<String, Object>> tablesAndColumns = getMySQL(sqlName, sqlPassword, sqlProjectName);for (Map<String, Object> tableInfo : tablesAndColumns) {String tableName = (String) tableInfo.get("TABLE_NAME");//TODO EntityString Entityjava = Entity_Dir + "/" + tableName + ".java";String Entitycontent = "package com." + name + ".Entity;\n" +"\n" +"import lombok.Data;\n" +"import java.math.BigDecimal;\n" +"@Data\n" +"public class " + tableName + "{\n" +"\n";//TODO ServiceString Service = Service_Dir + "/" + tableName + "Service.java";String Servicecontent = "package com." + name + ".Service;\n" +"\n" +"import com." + name + ".Entity." + tableName + ";\n" +"import java.util.List;\n" +"\n" +"public interface " + tableName + "Service {\n" +"} ";//TODO ServiceImplString ServiceImpl = Service_Dir + "/Impl/" + tableName + "ServiceImpl.java";String ServiceImplcontent = "package com." + name + ".Service.Impl;\n" +"\n" +"import com." + name + ".Dao." + tableName + "Mapper;\n" +"import com." + name + ".Entity." + tableName + ";\n" +"import com." + name + ".Service." + tableName + "Service;\n" +"import org.springframework.beans.factory.annotation.Autowired;\n" +"import org.springframework.stereotype.Service;\n" +"\n" +"import java.util.List;\n" +"\n" +"@Service\n" +"public class " + tableName + "ServiceImpl implements " + tableName + "Service {\n" +"} ";//TODO DaoString Dao = Dao_Dir + "/" + tableName + "Mapper.java";String Daocontent = "package com." + name + ".Dao;\n" +"\n" +"import com." + name + ".Entity." + tableName + ";\n" +"import org.apache.ibatis.annotations.*;\n" +"\n" +"import java.util.List;\n" +"\n" +"public interface " + tableName + "Mapper{\n" +"} ";//TODO ControllerString Controller = Controller_Dir + "/" + tableName + "Controller.java";String Controllercontent = "package com." + name + ".Controller;\n" +"\n" +"\n" +"import org.springframework.beans.factory.annotation.Autowired;\n" +"import org.springframework.stereotype.Controller;\n" +"import org.springframework.web.bind.annotation.GetMapping;\n" +"import org.springframework.web.bind.annotation.PostMapping;\n" +"import org.springframework.web.bind.annotation.RequestMapping;\n" +"import org.springframework.web.bind.annotation.ResponseBody;\n" +"\n" +"@Controller\n" +"public class " + tableName + "Controller {\n" +"}";System.out.println("Table Name: " + tableName);List<Map<String, String>> columnsInfo = (List<Map<String, String>>) tableInfo.get("COLUMNS");int id_count = 0;for (Map<String, String> columnInfo : columnsInfo) {String columnName = columnInfo.get("COLUMN_NAME");String columnType = columnInfo.get("TYPE");if (columnName.equals("id")) {id_count = id_count + 1;}if (id_count > 1) {continue;} else {Entitycontent = Entitycontent + " " + "private " + columnType + " " + columnName + ";\n";System.out.println(" Column Name: " + columnName + ", Type: " + columnType);}}Entitycontent = Entitycontent + "}";createXml(Entityjava, Entitycontent);createXml(Service, Servicecontent);createXml(ServiceImpl, ServiceImplcontent);createXml(Dao, Daocontent);createXml(Controller, Controllercontent);}}else {System.out.println("\n请再次运行程序,以开始创建必要插件!\n");}}else {System.out.println("用户输入有误!");}} else {System.out.println("输入错误!");}}private static int connectMysql(String username, String password, String projectName) {// 数据库URL,用户名和密码String url = "jdbc:mysql://localhost:3306/" + projectName + "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8";// 加载JDBC驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {System.out.println(e.getMessage());return 0;}// 建立连接try (Connection connection = DriverManager.getConnection(url, username, password)) {return 1;} catch (SQLException e) {e.printStackTrace();return 0;}}public static List<Map<String, Object>> getMySQL(String username, String password, String projectName) {List<Map<String, Object>> tableInfoList = new ArrayList<>();// 数据库URL,用户名和密码String url = "jdbc:mysql://localhost:3306/" + projectName + "?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8";try (Connection connection = DriverManager.getConnection(url, username, password)) {DatabaseMetaData metaData = connection.getMetaData();// 获取所有表ResultSet tables = metaData.getTables(projectName, null, "%", new String[]{"TABLE"});while (tables.next()) {String tableName = tables.getString("TABLE_NAME");Map<String, Object> tableInfo = new HashMap<>();tableInfo.put("TABLE_NAME", tableName);// 获取表的字段和类型ResultSet columns = metaData.getColumns(null, null, tableName, null);List<Map<String, String>> columnsInfo = new ArrayList<>();while (columns.next()) {Map<String, String> columnInfo = new HashMap<>();String columnName = columns.getString("COLUMN_NAME");String columnType = columns.getString("TYPE_NAME");String javaType = getJavaType(columnType);columnInfo.put("COLUMN_NAME", columnName);columnInfo.put("TYPE", javaType); // 使用Java类型名称columnsInfo.add(columnInfo);}columns.close();tableInfo.put("COLUMNS", columnsInfo); // 直接存储列表tableInfoList.add(tableInfo);}tables.close();} catch (SQLException e) {e.printStackTrace();}return tableInfoList;}private static String getJavaType(String mysqlType) {switch (mysqlType.toUpperCase()) {case "INT":case "TINYINT":case "SMALLINT":case "MEDIUMINT":case "BIGINT":return "int";case "VARCHAR":case "CHAR":case "TEXT":case "TINYTEXT":case "MEDIUMTEXT":case "LONGTEXT":return "String";case "DECIMAL":case "DOUBLE":return "Double";// Add more cases for other types as neededdefault:return mysqlType; // Return the original type if not recognized}}private static void createDir(String dirPath) {File dir = new File(dirPath);if (dir.mkdirs()) {System.out.println("目录 " + dirPath + " 创建成功!");} else {System.out.println("目录 " + dirPath + " 创建失败!");}}private static void createXml(String fileName, String fileContent){try (FileWriter writer = new FileWriter(fileName)) {writer.write(fileContent);System.out.println("XML文件创建成功:" + fileName);} catch (IOException e) {System.out.println("创建XML文件时出错:" + e.getMessage());}}private static void updateFile(String fileName, String fileContent){try (FileWriter writer = new FileWriter(fileName, false)) { // false表示不追加,清空文件writer.write(fileContent);System.out.println("文件内容已更新。");} catch (IOException e) {System.out.println("处理文件时出错:" + e.getMessage());}}
}
三、食用指南
1.在spring项目中创建java文件
2.把上面代码放在项目中任意位置
3.运行代码
4.按照提示输入昵称、数据库账号、密码、数据表名称
5.手动更新pom文件
6.重启代码
7.恭喜,成功解放双手!!!!
相关文章:
Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)
一、实现功能(原创,转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表,创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …...
Llama系列关键知识总结
系列文章目录 第一章:LoRA微调系列笔记 第二章:Llama系列关键知识总结 第三章:LLaVA模型讲解与总结 文章目录 系列文章目录Llama: Open and Efficient Foundation Language Models关键要点LLaMa模型架构:Llama2分组查询注意力 (G…...
分布式系统架构6:链路追踪
这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…...
flink cdc使用flink sql方式运行一直报Make sure a planner module is on the classpath
flink cdc使用flink sql方式运行一直报Make sure a planner module is on the classpath 引入jar包信息: flink-connector-oracle-cdc:3.2.1 flink:1.20.0 flink-table-runtime:1.20.0 flink-streaming-java:1.20.0 flink-clients:1.20.0 Exception in thread &q…...
Vue.js组件开发-怎样将style私有化
Vue.js组件开发中,将style私有可以通过使用<style scoped>来实现的。scoped属性会告诉Vue为这个组件的CSS样式添加一个数据属性,从而确保这些样式只应用于该组件的元素,而不会影响到其他组件或全局样式。 示例: 展示如何使…...
第十届“挑战杯”大学生课外学术科技作品竞赛解析及资料
“挑战杯”被誉为大学生科技创新创业的“奥林匹克”盛会,它汇聚了来自各个学科、各个年级的精英人才。在这里,同学们带着对未知的好奇和对知识的渴望,组成一个个团队,向难题发起挑战。现在,第十届“挑战杯”大学生课外…...
从0入门自主空中机器人-2-1【无人机硬件框架】
关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…...
跟着逻辑先生学习FPGA-实战篇第一课 6-1 LED灯闪烁实验
硬件平台:征战Pro开发板 软件平台:Vivado2018.3 仿真软件:Modelsim10.6d 文本编译器:Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 LED,又名…...
【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(四)
****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 四、提示范式(Explanation for Prompting Paradigm) 随着语言模型规模的扩大,基于提示(prom…...
分布式算法(五):初识ZAB协议
文章目录 一、什么是Zookeeper二、ZAB与Zookeeper的关系为什么Zookeeper不直接使用Paxos 三、ZAB简介1.名词解释提案(Proposal)事务(Transaction)原子广播(Atomic Broadcast) 2.集群角色领导者(…...
用Python操作字节流中的Excel工作簿
Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络…...
PHP-Casbin v4.0.0 发布,支持 ACL、RBAC、ABAC 等模型的访问控制框架
PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架,支持 ACL、RBAC、ABAC 多种模型。它采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。 更新内容: http…...
MIT S081 Lab 2 System Calls
Lab链接 一 实现trace功能 1 题目要求 In this assignment you will add a system call tracing feature that may help you when debugging later labs. You’ll create a new trace system call that will control tracing. It should take one argument, an integer “ma…...
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库 目录 Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库一、配置…...
(leetcode算法题)10. 正则表达式匹配
10. 正则表达式匹配 - 力扣(LeetCode) 此题的要求一个字符串 s 和一个字符规律 p之间支持 . 和 * 的正则表达式匹配 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串…...
Hive性能调优考量
Hive作为大数据领域常见的数据仓库组件,在设计和开发阶段需要注意效率。影响Hive效率的不仅仅是数据量过大,数据倾斜、job(小文件过多)或者磁盘I/O过多、MapReduce分配不合理等因素都会对Hive的效率有影响。对Hive的调优可以从架构…...
2024-12-29-sklearn学习(26)模型选择与评估-交叉验证:评估估算器的表现 今夜偏知春气暖,虫声新透绿窗纱。
文章目录 sklearn学习(26) 模型选择与评估-交叉验证:评估估算器的表现26.1 计算交叉验证的指标26.1.1 cross_validate 函数和多度量评估26.1.2 通过交叉验证获取预测 26.2 交叉验证迭代器26.2.1 交叉验证迭代器–循环遍历数据26.2.1.1 K 折26.2.1.2 重复 K-折交叉验…...
Spring Boot + MinIO 实现分段、断点续传,让文件传输更高效
一、引言 在当今的互联网应用中,文件上传是一个常见的功能需求。然而,传统的文件上传方式在面对大文件或不稳定的网络环境时,可能会出现性能瓶颈和上传失败的问题。 传统文件上传,就像是用一辆小推车搬运大型家具,一…...
获取用户详细信息-ThreadLocal优化
Thread全局接口可用,不用再重复编写。所以为了代码的复用,使用Thread。把之前的内容(函数的参数和map与username)注释掉,换为Thread传过来的内容(map与username)。 因为Thread需要在拦截器里面…...
R语言6种将字符转成数字的方法,写在新年来临之际
咱们临床研究中,拿到数据后首先要对数据进行清洗,把数据变成咱们想要的格式,才能进行下一步分析,其中数据中的字符转成数字是个重要的内容,因为字符中常含有特殊符号,不利于分析,转成数字后才能…...
Go语言方法和接收器类型详解
Go语言方法和接收器类型详解 1. 方法接收器类型 1.1 值接收器 值接收器方法不会改变接收器的状态,因为Go语言会在调用时复制接收器的值。因此,任何对接收器成员变量的修改都只会影响副本,而不会影响原始结构体实例。 type Person struct …...
Linux常用命令总结
目录 查询java服务的pid查询pid上的进程占用的端口方法 1:使用 lsof 查询端口方法 2:使用 netstat 查询端口方法 3:使用 ss 命令查询端口 system相关命令 查询java服务的pid JPS查询pid上的进程占用的端口 要根据进程 ID(PID&am…...
Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录
Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录 由于网上很多的mysql8.0安装教程都是老版本或者安装过程记录有问题,导致经常安装到一半需要删除重新安装。所以将成功的实操安装过程记录一下,方面后面查阅,大家还有问题的可以在此讨…...
ROS2软件架构全面解析-学习如何设计通信中间件框架
前言 ROS(Robot Operating System) 2 是一个用于开发机器人应用的软件平台,也称为机器人软件开发工具包 (SDK)。 ROS2是ROS1的迭代升级版本 ,最主要的升级点是引入DDS(Data Distribution Service)为基础的…...
基于微信小程序的校园自助打印系统
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…...
Linux命令——3.网络与用户
文章目录 一、网络1.网络测试与诊断2.网络接口配置3.无线网络配置4.防火墙与网络管理6.防火墙管理1)firewalld命令2)iptables命令 二、用户和群组1.管理员模式2.用户账户管理1)useradd创建2)usermod修改3)userdel 删除…...
2、redis的持久化
redis的持久化 在redist当中,高可用的技术包括持久化,主从复制,哨兵模式,集群。 持久化是最简单的高可用的方法,作用就是备份数据。即将数据保存到硬盘,防止进程退出导致数据丢失。 redis持久化方式&…...
建造者模式 Builder Pattern
在创建一个对象的时候,构造器参数有点多,而且有些参数还是可选的,再者还有不少同类型的,那就更应该使用 builder 模式了。 使用 Builder 模式的初衷是 把易变性(mutability)移动到Builder类,而…...
制作一个类似ChatGPT的AI对话网站,模型能力使用ChatGPT
要快速搭建一个类似ChatGPT的AI对话网站,并且使用类似ChatGPT的模型能力,可以考虑以下技术和工具: ### 1. **使用现有的AI模型平台** - **OpenAI API**: 如果你希望使用类似于ChatGPT的能力,OpenAI提供了强大的API服务(…...
LinuxC高级day2
1.在家目录下创建目录文件,dir a.dir下创建dir1和dir2 b.把当前目录下的所有文件拷贝到dir1中, c.把当前目录下的所有脚本文件拷贝到dir2中 d.把dir2打包并压缩为dir2.tar.xz e.再把dir2.tar.xz移动到dir1中 f.解压dir1中的压缩包 g.使用tree工具&#x…...
Word格式修改
经常修改格式,留下这篇汇总 Word的累加符号上下标变右标指定目录:word如何取消封面或者目录下方的页码,页码从正文开始加参考文献:【Word】怎样给论文添加引用参考文献删空白页: word中无法删除空白页怎么办ÿ…...
深度学习-稀疏卷积
步骤: 1、构建输入输出哈希表; 输入哈希表的键为激活点的索引,值为激活点的坐标;输出哈希表的键为激活点对应的输出点的索引,值为输出点的坐标。 2、构建规则书; 规则书的每一行包含4个值,分别是…...
Microsoft Visual Studio中的/MT, /MTd,/MD,/MDd分别是什么意思?
1. /MT,/MTd,/MD,/MDd的含义 /MT,/MTd,/MD,/MDd是 Microsoft Visual C 编译器的运行时库链接选项。它们决定了程序如何链接 C 运行时库(CRT)。具体含义如下: /MT&#x…...
交换机关于环路、接口绑定、链路聚合的相关知识
文章目录 1、对交换机SW-1进行配置,仅允许Host-1通过Ethernet0/0/1接口与Host-3和Host-4通信,Host-2无法与其他主机通信。2、关闭生成树协议,验证环路造成的影响3、关闭生成树协议通过链路聚合实现两条链路正常通信并提高链路可靠性。 内容包…...
5.微服务灰度发布落地实践(rocketmq增强)
文章目录 前言发送端灰度增强订阅端灰度增强 前言 上一篇分析了,在灰度发布实现中为什么要对消息队列灰度发布进行增强。本篇主要介绍如何实现rocketmq 灰度发布的增强. 发送端灰度增强 订阅端灰度增强...
32单片机从入门到精通之开发环境——库文件(六)
每个人都有自己的追求和梦想,但要实现这些梦想并不容易。在追逐梦想的路上,我们会遇到各种困难和挫折,甚至会感到无助和失望。然而,正是这些困难和挫折让我们更加坚韧和坚定地追求自己的目标。不要害怕失败,失败只是暂…...
大电流和大电压采样电路
大电压采样电路: 需要串联多个电阻进行分压,从而一级一级降低电压,防止电阻损坏或者短路直接打穿MCU。 为什么需要加电压跟随器:进行阻抗的隔离,防止MCU的IO阻抗对分压产生影响: 大电流检测电路ÿ…...
用户态和内核态?
目录 一、定义与特点 二、功能与权限差异 三、安全性与稳定性 四、系统调用与交互 五、参考 用户态和内核态是操作系统中的两种基本运行状态,它们各自具有不同的特点和权限,共同构成了操作系统的运行基础。以下是对用户态和内核态的详细解释&#x…...
Qt天气预报系统设计界面布局第四部分左边
Qt天气预报系统设计 1、第四部分左边的第一部分1.1添加控件1.2修改控件名字 2、第四部分左边的第二部分2.1添加控件2.2修改控件名字 3、第四部分左边的第三部分3.1添加控件3.2修改控件名字 4、对整个widget04l调整 1、第四部分左边的第一部分 1.1添加控件 拖入一个widget&…...
【Spring MVC 常用注解】注解驱动开发的魔法
在 Spring MVC 中,注解可以说是开发者的“魔法棒”,通过简单的注解配置,开发者能够实现请求处理、参数绑定、响应返回等复杂功能,真正做到“少写代码多干活”。 我们接下来就来一起看看 Spring MVC 中常用的注解,它们的…...
FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.4,SDP协议分析
SDP在4566 中有详细描述。 SDP 全称是 Session Description Protocol, 翻译过来就是描述会话的协议。 主要用于两个会话实体之间的媒体协商。 什么叫会话呢,比如一次网络电话、一次电话会议、一次视频聊天,这些都可以称之为一次会话。 那为什…...
STM32 高级 WIFi案例1:测试AT指令
需求描述 测试AT指令是否能够正常控制ESP32的wifi,比如重启、读取设备信息等。 思路: stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置: 第一步:对ESP32芯片烧录可以读取stm32命令的固件(fac…...
Mono里运行C#脚本18—mono_image_load_names
前面已经分析完成加载CLR的流表,接着下来就是使用前面分析的数据,更进一步来处理了。下面就是通过函数mono_image_load_names获得程序集的名称和模块名称。 在CLI定义的文档里,表Assembly : 0x20: Assembly表结构信息,以下是该表各列的简要说明: HashAlgId: 这是一个4字…...
Java和Python区别: 应用领域与性能抉择的深度解析
文章目录 1. 引言2. 语言特性对比:灵活性与严谨性的碰撞3. 应用场景分析:专注任务的工具选择3.1 数据库交互:Java 的优势所在3.2 图像识别与计算:Python 的专长3.3 Web 开发 4. 高并发请求处理:架构设计与硬件选择4.1 …...
SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者
SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者 文章目录 目录 前言 一、启动SQL server服务的三种方法 1.不启动SQL server服务的影响 2.方法一:利用cmd启动SQL server服务 3.方法二:利用SQL Serv…...
基于Docker+模拟器的Appium自动化测试(二)
模拟器的设置 打开“夜神模拟器”的系统设置,切换到“手机与网络”页,选中网络设置下的“开启网络连接”和“开启网络桥接模式”复选框,而后选择“静态IP”单选框,在IP地址中输入“192.168.0.105”,网关等内容不再赘述…...
CSS系列(47)-- Animation Timeline详解
前端技术探索系列:CSS Animation Timeline详解 ⏱️ 致读者:探索动画时间线的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Animation Timeline,这个强大的动画控制特性。 基础概念 🚀 时间线定义 …...
1、pycharm、python下载与安装
1、去官网下载pycharm 官网:https://www.jetbrains.com/pycharm/download/?sectionwindows 2、在等待期间,去下载python 进入官网地址:https://www.python.org/downloads/windows/ 3、安装pycharm 桌面会出现快捷方式 4、安装python…...
【翻译】优化加速像素着色器执行的方法
中文翻译 在回复我的 Twitter 私信时,我遇到了一个关于如何提高像素/片段着色器执行速度的问题。这是一个相当广泛的问题,具体取决于每个 GPU/平台和游戏内容的特性,但我在本帖中扩展了我“头脑风暴”式的回答,以便其他人也觉得有用。这不是一份详尽的清单,更像是一个高层…...
ZLib库使用详细教程 以及标准ZLib函数和QT自带压缩函数比较
1. 下载Zlib 官网下载地址如下:http://www.zlib.net/ 2. 利用cmake编译zlib 有两种方法可以打开cmake-gui winR输入cmd打开命令行,在命令行中输入cmake-gui可以直接打开应用界面找到你一开始安装cmake的文件夹,在bin子文件夹中双击cmake-…...