mybatis generator代码生成虽然好用,但是好像不支持sqlserver获取备注信息,这里我主要分享mybatis generator改写后支持sqlserver获取备注信息,mysql以及oracle数据库经过简单的配置再加以修改即可。针对sqlserver的命名规则,将字段NickName对应实体类的nickName,实现mysql以及sqlserver数据库共存情况下使用一个实体类。

项目结构如下:

1.这里主要需要添加的代码有:

引用的jar包

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
<scope>runtime</scope>
</dependency>
<!--jdbc启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.3.1.jre8-preview</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.intellij/annotations -->
<dependency>
<groupId>com.intellij</groupId>
<artifactId>annotations</artifactId>
<version>12.0</version>
</dependency>
</dependencies>

sqlServerGeneratorConfig.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"> <generatorConfiguration>
<!-- 指定数据库驱动的jdbc驱动jar包的位置,这里需要写绝对位置 -->
<classPathEntry location="D:\Java\myCodeMaven\maven-repository\com\microsoft\sqlserver\mssql-jdbc\8.3.1.jre8-preview\mssql-jdbc-8.3.1.jre8-preview.jar"/>
<context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
<!-- 生成的 Java 文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 格式化 Java 代码 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化 XML 代码 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<!-- hasLombok -->
<plugin type="org.mybatis.generator.plugins.LombokPlugin" >
<property name="hasLombok" value="true"/>
</plugin>
<!--生成mapper.xml时覆盖原文件,防止追加-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<!-- 自定义注释生成器 -->
<commentGenerator type="com.zsy.codegenerato.mbgcomment.MySQLCommentGenerator">
<property name="author" value="zsy"/>
<property name="dateFormat" value="yyyy/MM/dd"/>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 配置数据库连接 -->
<jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
connectionURL="jdbc:sqlserver://127.0.0.1;DatabaseName=User"
userId="sa"
password="123456">
<!-- Mysql数据库设置 useInformationSchema 属性为 true -->
<property name="useInformationSchema" value="true" />
<!-- 针对oracle数据库 -->
<property name="remarksReporting" value="true"/>
<!--设置可以获取remarks信息-->
<property name="allProceduresAreCallable" value="true"/>
<!--解决多个数据库表同名导致的问题,这个配置也很重要-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 生成实体的位置 -->
<javaModelGenerator targetPackage="com.zsy.codegenerato.models"
targetProject="code-generato/src/main/java">
<property name="enableSubPackages" value="true"/>
<!--以下配置将所有的实体类都继承至该基类-->
<!--<property name="rootClass" value=""/>-->
</javaModelGenerator> <!-- 生成 Mapper XML 的位置 -->
<sqlMapGenerator targetPackage="mybatis.mapper"
targetProject="code-generato/src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator> <!-- 生成 Mapper 接口的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.zsy.codegenerato.mapper"
targetProject="code-generato/src/main/java">
<property name="enableSubPackages" value="true"/>
<!-- <property name="rootInterface" value="java.io.Serializable"/>-->
</javaClientGenerator>
<!-- 设置数据库的表名和实体类名 -->
<!-- <table tableName="t_trade" domainObjectName="Trade"></table>-->
<table tableName="UserInfo" domainObjectName="UserInfo"></table>
</context> </generatorConfiguration>
EmptyCommentGenerator.java
package com.zsy.codegenerato.mbgcomment;

import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.XmlElement; import java.util.Properties;
import java.util.Set; public class EmptyCommentGenerator implements CommentGenerator { @Override
public void addConfigurationProperties(Properties properties) { } @Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { } @Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable) { } @Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { } @Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) { } @Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) { } @Override
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) { } @Override
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { } @Override
public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { } @Override
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) { } @Override
public void addJavaFileComment(CompilationUnit compilationUnit) { } @Override
public void addComment(XmlElement xmlElement) { } @Override
public void addRootComment(XmlElement xmlElement) { } @Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { } @Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) { } @Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { } @Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) { } @Override
public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) { }
}
MySQLCommentGenerator.java
package com.zsy.codegenerato.mbgcomment;

import org.mybatis.generator.api.FullyQualifiedTable;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.TableConfiguration;
import org.mybatis.generator.internal.db.ActualTableName; import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*; public class MySQLCommentGenerator extends EmptyCommentGenerator { private final Properties properties;
private TopLevelClass topLevelClass; public MySQLCommentGenerator() {
properties = new Properties();
} @Override
public void addConfigurationProperties(Properties properties) {
// 获取自定义的 properties
this.properties.putAll(properties);
} @Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
String author = properties.getProperty("author");
String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat); //导入包
//topLevelClass.addJavaDocLine("import javax.persistence.*;");
topLevelClass.addJavaDocLine("import java.io.Serializable;");
topLevelClass.addJavaDocLine("import io.swagger.annotations.*;");
topLevelClass.addJavaDocLine("import lombok.*;");
FullyQualifiedTable aa = introspectedTable.getFullyQualifiedTable(); // 获取表注释
String remarks = introspectedTable.getRemarks();
topLevelClass.addJavaDocLine("");
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * @Description " + remarks);
topLevelClass.addJavaDocLine(" * @Author " + author);
topLevelClass.addJavaDocLine(" * @Date " + dateFormatter.format(new Date()));
topLevelClass.addJavaDocLine(" */");
topLevelClass.addJavaDocLine("@Data");
topLevelClass.addJavaDocLine("@ApiModel(description= \""+remarks+"\")"); //添加默认继承的接口(配置只有类继承类rootClass,接口继承接口rootInterface)
topLevelClass.addSuperInterface(new FullyQualifiedJavaType("Serializable"));
} @Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
//获取列所处的位置
List<IntrospectedColumn> allColumnList = introspectedTable.getAllColumns();
int position = allColumnList.indexOf(introspectedColumn);
if(position==0){
field.addJavaDocLine("");
field.addJavaDocLine(genSerialID());
}
field.addJavaDocLine("");
// 获取列注释
String remarks = introspectedColumn.getRemarks();
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + remarks);
field.addJavaDocLine(" */");
field.addJavaDocLine("@ApiModelProperty(value = \""+remarks+"\", position = "+position+")");
//针对UserName 字段的处理,变成userName;userMessage还是userMessage
//&& !Character.isLowerCase(columnName.charAt(0))
String columnName = introspectedColumn.getActualColumnName();
if(!columnName.contains("_") ){
columnName = (new StringBuilder()).append(Character.toLowerCase(columnName.charAt(0))).append(columnName.substring(1)).toString();
field.setName(columnName);
}
} private static String genSerialID()
{
return "private static final long serialVersionUID = "+Math.abs(new Random().nextLong())+"L;";
}
}
LombokPlugin.java;这里是重点,去除了getter、setter,同时针对sqlserver数据库获取备注信息。
//这个包名保持这个
package org.mybatis.generator.plugins; import org.mybatis.generator.api.ConnectionFactory;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.Element;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.JDBCConnectionConfiguration;
import org.mybatis.generator.internal.JDBCConnectionFactory;
import org.mybatis.generator.internal.ObjectFactory; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List; /**
* @author zsy 20200706
*/
public class LombokPlugin extends PluginAdapter { @Override
public boolean validate(List<String> list) {
return true;
} @Override
public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
//不生成getter
return false;
} @Override
public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
//不生成setter
return false;
} @Override
public boolean sqlMapResultMapWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
List<Element> elist = element.getElements();
System.out.println("element.getName()="+element.getName());
Integer elistCount = elist.size();
for(Integer i=0;i<elistCount;i++){
XmlElement xmlElement = (XmlElement)(elist.get(i));
String columnName = "";
List<Attribute> attributes = xmlElement.getAttributes();
int attributeCount = attributes.size();
for(Integer j=0;j<attributeCount;j++){
Attribute attribute = attributes.get(j);
Attribute attributeNew=null;
if(attribute.getName().equals("column")){
columnName = attribute.getValue();
}else if(attribute.getName().equals("property")){
if(!"".equals(columnName) && attribute.getName().equals("property")){
// && !Character.isLowerCase(columnName.charAt(0))
if(!columnName.contains("_")){
attributeNew = new Attribute(attribute.getName(),
(new StringBuilder()).append(Character.toLowerCase(columnName.charAt(0))).append(columnName.substring(1)).toString());
attributes.remove(attribute);
attributes.add(attributeNew);
}
}
}
}
}
// XmlElement xe = new XmlElement("result");
// xe.addAttribute(new Attribute("column", "tablesite"));
// xe.addAttribute(new Attribute("property", "tablesite"));
// xe.addAttribute(new Attribute("jdbcType", "INTEGER"));
// elist.add(xe);
//return super.sqlMapResultMapWithoutBLOBsElementGenerated(element, introspectedTable);
return true;
} @Override
public boolean sqlMapResultMapWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
//将首字母大写改为小写,后面的大小写不变(不存在"_"的时候)
List<Element> elist = element.getElements();
Integer elistCount = elist.size();
for(Integer i=0;i<elistCount;i++){
XmlElement xmlElement = (XmlElement)(elist.get(i));
String columnName = "";
List<Attribute> attributes = xmlElement.getAttributes();
int attributeCount = attributes.size();
for(Integer j=0;j<attributeCount;j++){
Attribute attribute = attributes.get(j);
Attribute attributeNew=null;
if(attribute.getName().equals("column")){
columnName = attribute.getValue();
}else if(attribute.getName().equals("property")){
if(!"".equals(columnName) && attribute.getName().equals("property")){
// && !Character.isLowerCase(columnName.charAt(0))
if(!columnName.contains("_")){
attributeNew = new Attribute(attribute.getName(),
(new StringBuilder()).append(Character.toLowerCase(columnName.charAt(0))).append(columnName.substring(1)).toString());
attributes.remove(attribute);
attributes.add(attributeNew);
}
}
}
}
}
return true;
//return super.sqlMapResultMapWithoutBLOBsElementGenerated(element, introspectedTable);
} @Override
public void initialized(IntrospectedTable introspectedTable) {
Connection connection = null;
try {
connection = getConnection();
ResultSet sqlServerResultSet = null;
ResultSet sqlServerTableResultSet = null;
boolean isSqlServer = connection.getMetaData().getDriverName().toUpperCase()
.indexOf("SQL SERVER") != -1;
if (isSqlServer) {
//添加注释
//sqljdbc与sqljdbc4不同,sqlserver中间有空格
String sql = "SELECT\n" +
"\tconvert(varchar(1000), D.value) AS TABLEREMARKS,\n"+
"\tB.name AS COLUMNNAME,\n"+
"\tconvert(varchar(1000), C.\n" +
"VALUE)\n" +
"\tAS REMARKS\n" +
"FROM\n" +
"\tsys.tables A\n" +
"INNER JOIN sys.columns B ON B.object_id = A.object_id\n" +
"LEFT JOIN sys.extended_properties C ON C.major_id = B.object_id\n" +
"AND C.minor_id = B.column_id\n" +
"LEFT JOIN sys.extended_properties D ON D.major_id = A.object_id AND D.minor_id = 0\n"+
"WHERE\n" +
"\tA.name = ? ";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, introspectedTable.getFullyQualifiedTable().getIntrospectedTableName());
sqlServerResultSet = ps.executeQuery();
if(sqlServerResultSet!=null){
List<IntrospectedColumn> allColumnList = introspectedTable.getAllColumns();
Integer index = 0;
int length = allColumnList.size();
while (sqlServerResultSet.next()){
if(index == 0){
introspectedTable.setRemarks(sqlServerResultSet.getString("TABLEREMARKS"));
index++;
}
for(Integer i=0;i<length;i++){
IntrospectedColumn columnInfo = allColumnList.get(i);
if(sqlServerResultSet.getString("COLUMNNAME").equals(columnInfo.getActualColumnName())){
allColumnList.get(i).setRemarks(sqlServerResultSet.getString("REMARKS"));
}
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeConnection(connection);
}
introspectedTable.getAllColumns().forEach(m->{
System.out.println(m.getActualColumnName()+"==="+m.getRemarks());
});
} private Connection getConnection() throws SQLException {
Object connectionFactory;
JDBCConnectionConfiguration jdbcConnectionConfiguration = context.getJdbcConnectionConfiguration();
if (jdbcConnectionConfiguration != null) {
connectionFactory = new JDBCConnectionFactory(jdbcConnectionConfiguration);
} else {
connectionFactory = ObjectFactory.createConnectionFactory(context);
} return ((ConnectionFactory)connectionFactory).getConnection();
} private void closeConnection(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException var3) {
}
} }
}
SqlServerGenerator.java
package com.zsy.codegenerato;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File;
import java.util.ArrayList;
import java.util.List; /**
* 使用 Java 的方式来运行 MBG
* @see <a href="http://www.mybatis.org/generator/running/runningWithJava.html">Running MyBatis Generator With Java</a>
*/
public class SqlServerGenerator { public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>(2);
ConfigurationParser cp = new ConfigurationParser(warnings); File configFile = new File("sqlServerGeneratorConfig.xml");
Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(true); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}

2.将LombokPlugin.java文件生成的LombokPlugin.class放到本地仓库:D:\Java\myCodeMaven\maven-repository\org\mybatis\generator\mybatis-generator-core\1.3.7\mybatis-generator-core-1.3.7.jar\org\mybatis\generator\plugins下,需要用压缩文件打开mybatis-generator-core-1.3.7.jar,并将LombokPlugin.class文件复制到其中。

3.直接运行SqlServerGenerator.java即可。

Java IDEA 根据mybatis-generator-core自动生成代码支持sqlserver获取备注(二)的更多相关文章

  1. Eclipse 使用mybatis generator插件自动生成代码

    Eclipse 使用mybatis generator插件自动生成代码 标签: mybatis 2016-12-07 15:10 5247人阅读 评论(0) 收藏 举报 .embody{ paddin ...

  2. JAVA入门[7]-Mybatis generator(MBG)自动生成mybatis代码

    一.新建测试项目 新建Maven项目MybatisDemo2,修改pom.xml引入依赖.dependencies在上节基础上新增 <dependency> <groupId> ...

  3. springboot(十三):springboot结合mybatis generator逆向工程自动生成代码

    错信息generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver 上网查了一下,发现原来是generator这个插件在运 ...

  4. java如何在eclipse编译时自动生成代码

    用eclipse写java代码,自动编译时,如何能够触发一个动作,这个动作是生成本项目的代码,并且编译完成后,自动生成的代码也编译好了, java编辑器中就可以做到对新生成的代码的自动提示? 不生成代 ...

  5. 02 使用Mybatis的逆向工程自动生成代码

    1.逆向工程的作用 Mybatis 官方提供了逆向工程,可以针对数据库表自动生成Mybatis执行所需要的代码(包括mapper.xml.Mapper.java.pojo). 2.逆向工程的使用方法 ...

  6. 使用Mybatis的逆向工程自动生成代码

    1.逆向工程的作用 Mybatis 官方提供了逆向工程,可以针对数据库表自动生成Mybatis执行所需要的代码(包括mapper.xml.Mapper.java.pojo). 2.逆向工程的使用方法 ...

  7. Spring Boot MyBatis 通用Mapper 自动生成代码

    一.在pom.xml文件中进入mybatis自动生成代码相关的jar包: 注意: <configurationFile>标签中配置的是“generatorConfig.xml”文件位置. ...

  8. 使用Mybatis Generator插件自动生成映射文件(cmd无法进入文件,dns服务器对区域没有权威等问题)遇到问题

           使用Mybatis Genertor插件自动生MyBatis所需要的DAO接口,实体模型类,Mapping映射文件,将生成的代码赋值到项目工程中即可.     有命令行,Eclipse插 ...

  9. 使用eclipse插件mybatis generator来自动生成实体类及映射文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...

随机推荐

  1. 2020-2021-1 20209306 《linux内核原理与分析》第一周作业

    学习过程中遇到了如下的问题,通过探索找到了可以解决的方法 1.如何退回主目录或者编辑某个文件夹. 使用cd/home可以退回主目录,这里注意的是绝对路径和相对路径的区别,在学习时我试图切换到home目 ...

  2. windows.h和WinSock2.h出现重定义API

    有两种常用的解决方法:1.把WinSock2.h写在windows.h之前   2.使用宏定义#define WIN32_LEAN_AND_MEAN

  3. 八皇后问题-recall算法

    #!/usr/bin/env python3# -*- coding: utf-8 -*-import numbersimport numpyimport math'''八皇后为题:在国际象棋棋盘上摆 ...

  4. 自己动手实现一个简单的 IOC容器

    控制反转,即Inversion of Control(IoC),是面向对象中的一种设计原则,可以用有效降低架构代码的耦合度,从对象调用者角度又叫做依赖注入,即Dependency Injection( ...

  5. Bootstrap 实现图片翻滚

    今天给大家带来的是Bootstrap 实现的图片翻滚 效果图如下 点击左右箭头可以实现向左向右转动,这个功能在Bootstrap 官网和菜鸟教程上都有讲解,有点bootstrap基础的都能看明白 ,这 ...

  6. 关于java中的类加载器

    什么是类加载器? 类加载器是专门负责加载类的命令或者说工具 ClassLoader java中的3个类加载器 JDK中自带了3个类加载器 启动类加载器 扩展类加载器 应用类加载器 假设有这样一段代码 ...

  7. 【SpringBoot】14. SpringBoot多环境配置

    SpringBoot多环境配置 Spring Boot 1.5.19.RELEASE 假设项目中需要3个环境--开发.测试.生产 profile :代表的就是一个环境变量 语法结构:applicati ...

  8. CSS三大特性及权重叠加

    层叠性: 1.样式冲突,遵循的原则是就近原则,哪个样式离结构近,就执行哪个样式 2.样式不冲突,不会层叠 继承性: 子标签会继承父标签的某些样式,如文本颜色和字号 优先级: 当同一个元素指定多个选择器 ...

  9. 快速识别烂项目!试试这款项目代码统计IDEA插件

    编程是一个很奇妙的事情,大部分的我们把大部分时间实际都花在了复制粘贴,而后修改代码上面. 很多时候,我们并不关注代码质量,只要功能能实现,我才不管一个类的代码有多长.一个方法的代码有多长. 因此,我们 ...

  10. Css gray 无法覆盖IE10

    网站变灰这个效果很常见,在我这里暂时没有找到最优解决方式, 先把今天的研究结果记录一下. 第一种方案 : 对所有静态资源文件进行灰度处理,得到新一个资源目录,例如asset_ori 原始资源    a ...