SpringBoot工作日记(1)——开发准备-Mybatis 映射文件自动生成器
工作半年了,很久一段时间不写博客了。一个是忙,另一个是懒。但是怎么说在****收了这么多帮助还是要回馈一点微不足道的吧。每天午休醒来写一点,以后公司来新人了就直接甩给他看。
下面开始正题:SpringBoot+Mybatis 前端后端分离的开发模式
在制作模板工程之前,需要做点技术铺垫。如果没有学过SpringMvc的也没关系,多看看别人的博客。
Mybatis我就不多介绍了。首先我们先准备一个自动生成器。来生成开发需要的Mapper文件和POJO文件。
我们先在Eclipse 或者IDEA上创建一个Maven工程,我JDK用的是1.8。我先用的Eclipse后用的IDEA,所以IDEA的配置会比较完善。
新建maven工程不用说了吧,明天写一篇maven的配置。
建工程的时候不用选依赖,我直接分享我的pom.xml。
IDEA的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>mybatis_generator</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<!--自动生成的核心-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- springboot 对mybatis的支持-->
<!--<dependency>-->
<!--<groupId>org.mybatis.spring.boot</groupId>-->
<!--<artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--<version>1.2.0</version>-->
<!--</dependency>-->
<!--日志工具,自由更换-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!--mysql 的连接工具-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!--阿里巴巴的json工具-->
<!--<dependency>-->
<!--<groupId>com.alibaba</groupId>-->
<!--<artifactId>fastjson</artifactId>-->
<!--<version>1.2.46</version>-->
<!--</dependency>-->
</dependencies>
</project>
eclipse的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Demo</groupId>
<artifactId>D4_mybatis_Generator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
</project>
但你替换好pom.xml之后等maven自动下载好依赖。
然后我们在贴一份log4j的配置
log4j.rootLogger = all,appender1
#控制台输出
log4j.appender.appender1 = org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout = org.apache.log4j.PatternLayout
log4j.appender.appender1.layout.ConversionPattern =%p %d{yyyy-MM-dd HH:mm:ssS} %l %m %n
现在我们看一下工程的目录结构
这是我IDEA中已经弄好的,目前我们还缺少了generatorConfig.xml和一个Gen.java
这个xml是主要配置文件,指定我们要自动生成的表。
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">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<!-- 自动实现序列化 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!-- 自动生成toString
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
-->
<commentGenerator>
<!-- 是否去除知道生成的注释 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- JavaBean 实现 序列化 接口 -->
<!-- mysql -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root" password="123456">
</jdbcConnection>
<!-- oracle
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:spring_test"
userId="root" password="123456">
</jdbcConnection>
-->
<!-- 默认是false 。
把JDBC DECIMAL 和 NUMERIC 类型解析为Integer,
为ture时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal
-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成po类的位置 -->
<javaModelGenerator targetPackage="com.study.demo.web.user.pojo" targetProject="./src/main/java">
<!-- 是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- mapper映射文件生成位置 -->
<sqlMapGenerator targetPackage="com.study.demo.web.user.mapper" targetProject="./src/main/java">
<!-- 是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.study.demo.web.user.mapper" targetProject="./src/main/java">
<!-- 是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!--
mapperName : mapper接口和配置文件的生成文件名,可无
domainObjectName :pojo的名字,可无
schema:框架名,可无
tableName:要生成的表
-->
<table tableName="user" domainObjectName="User">
<!-- 是否使用数据库返回结果列名 :true——按数据库 ,false——原样映射-->
<property name="useActualColumnNames" value="true"/>
</table>
<!-- 有些表的字段需要指定java类型
<table tableName=""schema="">
<columnOverride column="" javaType=""/>
</table>
-->
</context>
</generatorConfiguration>
注释里面写了节点的作用。因为我用了lombok插件(会自动写get、set、tostring的插件),所以我不需要自动生成toString方法,序列化是因为要符合POJO的规范。
比如我要自动生成我本地的mysql 的 test数据库中的user表的mpper和pojo ,我就在jdbcConnection节点将数据库的信息进行替换。
然后在下面的javaModelGenerator、sqlMapGenerator、和javaClientGenerator三个节点指定生成的包结构。
我的包结构习惯是com.公司.项目名.web.表名.pojo/mapper/service/controller,如下
最后还要table节点要写上指定的数据库名和生成的JAVA类名。
这样配置文件就准备好了。这个配置文件是经常要根据生成的表而修改的。这样每次换应该表要改好几处,有的人嫌麻烦的可以找找其他人的方法。
最后我们需要一个执行自动生成的方法
IDEA是通过maven执行的。我们先看Eclipse。
Gen.java:
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.net.URI;
import java.util.ArrayList;
import java.util.List;
public class Gen {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// File configFile = Resources.getResourceAsFile("generatorConfig.xml");
File configFile;
//用相对路径来加载配置
String path = Gen.class.getClassLoader().getResource("generatorConfig.xml").getPath();
URI uri = new URI(path);
configFile = new File(uri.getPath());
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
注释掉那一句是我以前使用的,很容易出现拒绝访问(IO异常不多说了),所以采用了这样的方式去读取配置文件。
eclipse上只要在这个文件右键Run as Java Appliccation 。然后看控制台,
灰掉了就执行完了。刷新一下工程目录。
多出了四个文件,我们直接把这个包拷贝到我们工程中对应的包下就行了,比如我会直接把这个包移动到
Eclipse的自动生成就完成了。接下来是IDEA:
IDEA不需要Gen.java文件,往回看我们可以发现在build里面已经配置好generatorConfig.xml的位置了。
我们需要把这个工程加到maven里面去执行。
IDEA的工具栏中的快捷工具,展开列表,选择Edit Configurations。
弹出这么一个窗口,点击“+”号,然后选择Maven,
在右边改一下名称,然后working directory 是指定工作目录的选到我们的项目目录就好,然后Command line 里填入
mybatis-generator:generate -e
右下角点OK保存,然后快捷工具里面下拉就可以看到刚刚添加的了
我们改好generatorConfig.xml之后,选择mybatis-genrator,然后点击右边的绿三角就会执行自动生成。
生成之后不需要刷新,因为IDEA本身就是自动刷新的
这里面出现了红下滑线,打开Mapper 接口一看
都是@Param注解报的错误,因为@Param 是mybaits核心包的东西,而我只导了mybatis gen 的包,所以会报错,但是项目里肯定会有个mybatis核心包的,所以无妨,如果强迫症犯了就把mybatis核心包导了,把上面我的“springboot对mybatis的支持”那个的注释去掉。
最后还要一点比较重要
不论是eclipse还是IDEA都要在Mapper接口上面添加注解@Mapper
然后就可以正常使用了。