《MyBatis代码自动生成器》
建议先看 https://www.jianshu.com/p/c558bc213d0c 《SpringBoot集成MyBatis》我的这篇文章,因为配置环境之类的依赖,在这篇文章中我就不讲了。
接着上篇文章的讲解,如何在SpringBoot中集成代码自动生成器。
简介
我们通过代码自动生成器可以一键生成entity、 dao、mapper相关基础代码,可以有效的节省我们的开发时间,提高效率。
这里我介绍的是生成mapper.xml方式,也可以生成注解方式的代码。
代码自动生成器是通过maven运行的,所以先配置项目pom.xml
maven依赖配置如下:
<!--Mybatis代码自动生成器-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
org.mybatis.generator插件运行配置:
<!--Mybatis代码自动生成器-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId> mysql</groupId>
<artifactId> mysql-connector-java</artifactId>
<version> 5.1.39</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!-- 自动生成的配置 -->
<configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
</configuration>
</plugin>
注意 以上xml配置中有一项
<!-- 自动生成的配置 -->
<configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
这个是具体你想生成什么样的代码内容以及都生成在什么地方,配置在mybatis-generator.xml这个文件中,在项目的resources目录下创建此文件,内容如下:
<?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="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接地址账号密码-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/apptest" userId="root" password="yu123456">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成Model类存放位置-->
<javaModelGenerator targetPackage="com.yu.scloud.baseframe.frame.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成Dao类存放位置-->
<!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.yu.scloud.baseframe.frame.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成对应表及类名-->
<!--<table tableName="stocktradeinfo" domainObjectName="StockTradeInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>-->
<table tableName="theme" domainObjectName="Theme" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<!--添加属性useActualColumnNames为true,那么生成的对象字段就跟表一样-->
<property name="useActualColumnNames" value="true"/>
</table>
<!--<table tableName="stockTheme" domainObjectName="StockTheme" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>-->
</context>
</generatorConfiguration>
接着在数据库中创建theme表:
OK!MyBatis代码自动生成器配置完成了,我们使用maven运行一下吧。成功会
在model包中生成Theme.java实体类
在dao包中生成ThemeMapper.java接口
在resources/mapper目录中生成ThemeMapper.xml映射文件
以上文件生成无误的话,我们创建controller和service使用并测试一下吧。
ThemeAutoGenTestService.java接口
import com.yu.scloud.baseframe.frame.model.Theme;
public interface ThemeAutoGenTestService {
int insertSelective(Theme record);
Theme selectByPrimaryKey(Integer id);
}
ThemeAutoGenTestServiceImpl.java实现类__
import com.yu.scloud.baseframe.frame.dao.ThemeMapper;
import com.yu.scloud.baseframe.frame.model.Theme;
import com.yu.scloud.baseframe.frame.service.ThemeAutoGenTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(value = "themeAutoGenTestService")
public class ThemeAutoGenTestServiceImpl implements ThemeAutoGenTestService {
@Autowired
ThemeMapper dao;
@Override
public int insertSelective(Theme record) {
return dao.insertSelective(record);
}
@Override
public Theme selectByPrimaryKey(Integer id) {
return dao.selectByPrimaryKey(id);
}
}
MyBatisTestController.java控制器类
import com.github.pagehelper.PageHelper;
import com.yu.scloud.baseframe.frame.model.Theme;
import com.yu.scloud.baseframe.frame.service.ThemeAutoGenTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class MyBatisTestController {
@Autowired
private ThemeAutoGenTestService themeAutoGenTestService;//测试通过自动生成器生成代码的例子
//-------通过代码自动生成器生成的数据库表对象相关类:
//Theme 实体类
//ThemeMapper接口 dao
//ThemeMapper.xml xml映射dao操作数据库
@ResponseBody
@PostMapping("/addtheme")
public int insertTheme(Theme theme)
{
return themeAutoGenTestService.insertSelective(theme);
}
@ResponseBody
@GetMapping("/gettheme")
public Theme getThemeById(int id)
{
return themeAutoGenTestService.selectByPrimaryKey(id);
}
}
启动服务,访问controller接口,dung!!!报错了,数据中包含create_date字段时报错了,应该是String无法转成Date对象的错误,这个问题本不在此篇文章的讲解中,但是遇到了简单讲一下吧。
默认SpringMVC进行covert时,参数中含有Date对象的类型时,是不会自动格式化并转换的,需要我们添加一个formatter的Bean,配置如下:
StringToDateConverter字符串转Date日期对象的转换器
_创建StringToDateConverter.java 字符串转Date日期对象的转换器
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
import org.springframework.util.StringUtils;
public class StringToDateConverter implements Converter<String, Date> {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
@Override
public Date convert(String value) {
if(StringUtils.isEmpty(value)) {
return null;
}
value = value.trim();
try {
if(value.contains("-")) {
SimpleDateFormat formatter;
if(value.contains(":")) {
formatter = new SimpleDateFormat(dateFormat);
}else {
formatter = new SimpleDateFormat(shortDateFormat);
}
Date dtDate = formatter.parse(value);
return dtDate;
}else if(value.matches("^\\d+$")) {
Long lDate = new Long(value);
return new Date(lDate);
}
} catch (Exception e) {
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
}
创建全局Configuration配置 ,WebConfigBeans.java
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
@Configuration
public class WebConfigBeans {
@Autowired
private RequestMappingHandlerAdapter handlerAdapter;
/**
* 增加字符串转日期的功能
*/
@PostConstruct
public void initEditableAvlidation() {
ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer)handlerAdapter.getWebBindingInitializer();
if(initializer.getConversionService()!=null) {
GenericConversionService genericConversionService = (GenericConversionService)initializer.getConversionService();
genericConversionService.addConverter(new StringToDateConverter());
}
}
}
好。配置完转换器后,再启动服务,访问接口,可以正常读写数据库了,传递Date对象也不怕报错了。