springboot+maven+tk.mybatis+generator逆向工程

1.父工程的pom.xml中导入依赖和插件,当前完整的文件如下:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.sino

demo_parent

pom

1.0-SNAPSHOT

bos

org.springframework.boot

spring-boot-starter-parent

2.0.5.RELEASE

UTF-8

UTF-8

1.8

org.springframework.boot

spring-boot-maven-plugin

org.mybatis.generator

mybatis-generator-maven-plugin

1.3.2

true

true

src/main/resources/generatorConfig.xml

mysql

mysql-connector-java

5.1.47

runtime

tk.mybatis

mapper

3.3.9

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.2

org.mybatis.generator

mybatis-generator-core

1.3.2

tk.mybatis

mapper

3.3.9

mysql

mysql-connector-java

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-jdbc

org.springframework.boot

spring-boot-starter-tomcat

org.apache.tomcat.embed

tomcat-embed-jasper

添加完逆向工程的插件以后,会在右侧找到插件

springboot+maven+tk.mybatis+generator逆向工程_第1张图片

设置所需的配置文件

springboot+maven+tk.mybatis+generator逆向工程_第2张图片

2. generatorConfig.xml  -->这个配置生成的实体类是自带注解的

PUBLIC"-//mybatis.org//DTDMyBatis Generator Configuration 1.0//EN"

"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

connectionURL="${spring.datasource.url}"

userId="${spring.datasource.username}"

password="${spring.datasource.password}">

targetProject="${generator.targetProject}"/>

targetProject="${generator.targetProject}"/>

targetProject="${generator.targetProject}"type="XMLMAPPER"/>

3.application.properties

#配置数据库

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8

spring.datasource.username=root

spring.datasource.password=root

#Tomcat

server.port=8080

server.tomcat-uri-encoding=UTF-8

# mybatis接口文件位置

mybatis.mapper-locations=classpath:mapper/*.xml

mybatis.type-aliases-package=com.sino.domain

# Generator设置生成后的配置文件位置

generator.targetProject=./src/main/java

generator.mappers=com.sino.common.IBaseMapper

generator.javaModel-targetPackage=com.sino.domain

generator.sqlMap-targetPackage=com.sino.dao

generator.javaClient-targetPackage=com.sino.dao

# 页面默认前缀目录

#webapp/WEB-INF/jsp/index.jsp

spring.mvc.view.prefix=/WEB-INF/jsp/

# 响应页面默认后缀

spring.mvc.view.suffix=.jsp

4.编写生成Mapper的集成接口IBaseMapper

springboot+maven+tk.mybatis+generator逆向工程_第3张图片

集成的 Mapper 以及 MySqlMapper 几乎包含了你所有的 CRUD方法。

5.双击插件运行(注意是web层的插件,不然的话,会报对应的子工程缺少application.properties和generatorConfig.xml的错误)

6.生成的实体类以及mapper.xml文件

springboot+maven+tk.mybatis+generator逆向工程_第4张图片
springboot+maven+tk.mybatis+generator逆向工程_第5张图片

搭建过程中遇到的问题:

错误:java.lang.RuntimeException: Cannot instantiate object of type org.mybatis.generator.plugins.field.FieldsPlugin

    at org.mybatis.generator.internal.ObjectFactory.createInternalObject(ObjectFactory.java:182)

    at org.mybatis.generator.internal.ObjectFactory.createPlugin(ObjectFactory.java:219)

    at org.mybatis.generator.config.Context.generateFiles(Context.java:500)

    at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:269)

    at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:139)

    at com.sino.generator.GeneratorSqlmap.generator(GeneratorSqlmap.java:25)

    at com.sino.generator.GeneratorSqlmap.main(GeneratorSqlmap.java:31)

Caused by: java.lang.ClassNotFoundException: org.mybatis.generator.plugins.field.FieldsPlugin

解决办法:

给javaClientGenerator标签配置正确的type属性即可。

使用的targetRuntime="MyBatis3Simple",有以下两种可选type。

XMLMAPPER:生成的对象是 MyBatis 3.x 映射器基础结构的 Java接口和XML映射文件。

ANNOTATEDMAPPER:生成的对象是 MyBatis 3.x 映射器基础结构的Java接口(使用注解),无XML文件。

习惯使用XMLMAPPER,配置如下:

targetProject="${generator.targetProject}"type="XMLMAPPER"/>

错误:java.lang.RuntimeException: Exception getting JDBC Driver

at org.mybatis.generator.internal.db.ConnectionFactory.getDriver(ConnectionFactory.java:85)

at org.mybatis.generator.internal.db.ConnectionFactory.getConnection(ConnectionFactory.java:54)

at org.mybatis.generator.config.Context.getConnection(Context.java:526)

at org.mybatis.generator.config.Context.introspectTables(Context.java:436)

at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:222)

at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:133)

at GeneratorMain.main(GeneratorMain.java:29)

Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 

atjava.net.URLClassLoader$1.run(UnknownSource)

atjava.net.URLClassLoader$1.run(UnknownSource)

at java.security.AccessController.doPrivileged(Native Method)

atjava.net.URLClassLoader.findClass(UnknownSource)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Unknown Source)

at org.mybatis.generator.internal.ObjectFactory.internalClassForName(ObjectFactory.java:150)

at org.mybatis.generator.internal.ObjectFactory.externalClassForName(ObjectFactory.java:121)

at org.mybatis.generator.internal.db.ConnectionFactory.getDriver(ConnectionFactory.java:82)

... 6 more

解决:这个是找不到mysql的驱动包,我用的办法是在插件中再添加一次mysql依赖

mysql

mysql-connector-java

5.1.47

runtime

错误:

Could not resolve dependencies for project

个人理解:项目中不同模块可能会有相互关系的依赖,所以必须把自己完成的模块放入本地maven仓库中,才能够让项目在运行时,

各个模块找到其对应的依赖。所以将母项目安装到maven仓库可以解决这个问题。

建议将pom所在的包clean一下  然后install一下

错误:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.0.5.RELEASE:repackage (default) on project util: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:2.0.5.RELEASE:repackage failed: Unable to find main class -> [Help 1]

[ERROR]

解决:和上面一个错误是连接的,我这个是在父工程中打包,百度了一下,说是因为pom.xml文件中引入了

org.springframework.boot

spring-boot-maven-plugin

这里引入了spring-boot-maven-plugin,打包时会去扫描项目main方法入口,也就是说引入该配置,你就必须在项目src/main/java/下创建一个spring-boot启动类:

@SpringBootApplication

@MapperScan("com.sino.mapper")

public classWebApplication {

public static voidmain(String[] args) {

SpringApplication.run(WebApplication.class);

}

}

入口类上一定要加上注解@SpringBootApplication

解决方案:

1. 添加spring-boot启动类。

2. 将pom.xml中的spring-boot-maven-plugin相关配置注释掉

3. pom.xml中spring-boot-maven-plugin相关配置修改为普通的maven--plugin配置即可。

错误:mybatis逆向工程运行成功却没有生成相应的包和文件

原因1:逆向工程中的路径问题,windows和mac等的文件系统路径不同

mac和Linux下应该使用./,windows下应该使用.\

原因2:运行的插件不对,应该运行web下的插件,而不是父工程下的

测试错误:

java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.()

解决:在mybatis文件下加两个文件

MybatisConfig.java

packagecom.sino.mapper.mybatis;

importorg.apache.ibatis.session.SqlSessionFactory;

importorg.mybatis.spring.SqlSessionFactoryBean;

importorg.springframework.context.annotation.Bean;

public classMyBatisConfig {

@Bean(name ="sqlSessionFactory")

publicSqlSessionFactory sqlSessionFactoryBean(){

SqlSessionFactoryBean bean =newSqlSessionFactoryBean();

// bean.setDataSource(dataSource());

bean.setTypeAliasesPackage("com.sino.domain");

try{

//基于注解扫描Mapper,不需配置xml路径

//bean.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"));

returnbean.getObject();

}catch(Exception e) {

//TODO Auto-generated catch block

e.printStackTrace();

throw newRuntimeException(e);

}

}

}

MyBatisMapperScannerConfig.java

packagecom.sino.mapper.mybatis;

importjava.util.Properties;

importcommon.IBaseMapper;

importorg.springframework.boot.autoconfigure.AutoConfigureAfter;

importorg.springframework.context.annotation.Bean;

importorg.springframework.context.annotation.Configuration;

importtk.mybatis.spring.mapper.MapperScannerConfigurer;

@Configuration

//必须在MyBatisConfig注册后再加载MapperScannerConfigurer,否则会报错

@AutoConfigureAfter(MyBatisConfig.class)

public classMyBatisMapperScannerConfig {

@Bean

publicMapperScannerConfigurer mapperScannerConfigurer(){

MapperScannerConfigurer mapperScannerConfigurer =newMapperScannerConfigurer();

mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");

//"com.lkt.Professional.mapper.mybatis"

mapperScannerConfigurer.setBasePackage("com.sino.mapper.mybatis");

Properties properties =newProperties();

properties.setProperty("mappers", IBaseMapper.class.getName());//IBaseMapper这个类接下来会创建

properties.setProperty("notEmpty","false");

properties.setProperty("IDENTITY","MYSQL");

//特别注意mapperScannerConfigurer的引入import tk.mybatis.spring.mapper.MapperScannerConfigurer;引入错误则没下面这个方法

mapperScannerConfigurer.setProperties(properties);

returnmapperScannerConfigurer;

}

}

错误:This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Sep 26 09:43:47 CST 2018

There was an unexpected error (type=Internal Server Error, status=500).

Error attempting to get column 'create_date' from result set. Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp ; ]; Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp; nested exception is java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

今天在使用 Mysql 中的一个 datetime 字段时碰到了一个 Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp 异常,之前使用都没有问题,今天突然出现故障。所以我就仔细查看了一下代码,看看最近是否有人改动。通过最终的搜索排查,我把整个过程分享给大家!

根据异常信息,我翻译了一下,大概意思是说,'0000-00-00 00:00:00' 这个时间不能用 Java 来表示。虽然数据库中可以存放这个值,但是 Java 中的时间都是从 1970 年开始的。格林威治时间 1970年01月01日00时00分00秒(UTC+8北京时间1970年01月01日08时00分00秒),所以你这个 '0000-00-00 00:00:00' 的时间,Java 表示不了,所以就抛出了这个异常。

完整的异常信息如下:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'audit_time' from result set.  Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'audit_time' from result set.  Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)

    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)

    at com.sun.proxy.$Proxy127.selectOne(Unknown Source)

    at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)

    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:82)

    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)

    at com.sun.proxy.$Proxy134.findOrderInfo(Unknown Source)

那么知道这个异常产生的原因后,该如何解决呢?

根据 stackoverflow 上一部分人的回答,我得出可以使用下面的方式连接数据库来解决:

1

jdbc:mysql://www.xttblog.com:3306/xttblog?zeroDateTimeBehavior=convertToNull

MySQL 的官方资料对 zeroDateTimeBehavior 属性做出了详细的解释,相见参考资料。

设置 zeroDateTimeBehavior 属性,当遇到 DATETIME 值完全由 0 组成时,最终的有效值可以设置为,异常(exception),一个近似值(round),或将这个值转换为 null(convertToNull)。

默认情况为 exception,设置这个属性会抛出一个 SQLException 异常,也就是文章开头所说到的异常。其 SQLSate 码为 S1009。这个状态码在写存储过程处理异常时也可以用到。

convertToNull,返回 null 来替代 0000-00-00 这样的日期。

round,将日期转换为 0001-01-01。

因此,出现 0000-00-00 属于一个无效日期,用 convertToNull 属性即可。

下面我们再一起来回顾一下 Java 中对日期类型的处理方法。

首先 Java 中能表示日期的提供了 4 个类,分别是:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp。

它们的继承关系如下:

1

2

3

4

5

java.lang.Object

....|__java.util.Date

..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time

....|__java.security.Timestamp

* java.util.Date 日期格式为:年月日时分秒

* java.sql.Date 日期格式为:年月日[只存储日期数据不存储时间数据]

* java.sql.Time 日期格式为:时分秒

* java.sql.Timestamp 日期格式为:年月日时分秒纳秒(毫微秒)

从上可以看出 java.util.Date 这个类是 java.sql.Date,  java.sql.Time,  java.slq.Timestamp 这三个类的父类。这三个类对 java.util.Date 类进行了包装。

java.sql.Date 类屏蔽了 java.util.Date 类的时间有关的方法(形如:hh:mm:ss),因此,不可以通过这个类访问时间有关的信息,比如,如果你通过 sqlDate.getHour() 方法去访问小时信息,此方法会抛出一个IllegalArgumentException异常。这是因为 java.sql.Date 在继承 java.util.Date 类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。

Java.sql.Time 类屏蔽了 java.util.Date 的日期有关的字段(形如:yyyy-MM-dd),因此,不能通过这个类访问日期有关的信息,比如:如果你通过 sqlTime.getYear() 方法去获取年有关的信息,此方法会抛出一个 IllegalArgumentException 异常。这是因为 java.sql.Time 在继承 java.util.Date 类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的 Time 数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。

Java.sql.Timestamp 字段则对 java.util.Date 这个类进行了扩充,它在 java.util.Date 类的基础上增加了毫秒的时间访问控制,因此,你可以通过 getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1秒等于十亿毫微秒),同样的,这也是为了和数据库中的Timestamp数据类型进行匹配。

理清了上述四个类的关系,那么 java.util.Date 和 java.util.Calendar 类有什么关系呢?

Java.util.Calendar 类是 java.util.Date 类的一个更加深入,更加全面的替代。Java.util.Calendar 类支持 java.util.Date 的所有功能,此外,Calendar 还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar 还增加了比 Date 更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。

java.util.Calendar 区别与 java.util.Date 的几个地方也需要注意一下:首先,Calendar 增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而 java.util.Date 只是精确到秒。其次,Calendar 过去年的时候是当前年份比如:2010,而 Date 获取年份的时获取到的是当前年份-1900的一个值(2010-1900=110,因此,你调用 getYear 后过去的值就是110)。最后 Calendar 是一个抽象类,之所以能够实例化,是因为此处的 Calendar 充当了一个类似于工厂的作用,在 getInstance 方法中实例化了 Calendar 子类 GregorianCalendar,并把它返回给用户使用。

针对不同的数据库选用不同的日期类型 。例如:Oracle的Date类型,只需要年月日,选择使用java.sql.Date类型;MySQL 和 Sqlserver 数据库的 DateTime 类型,需要年月日时分秒,选择 java.sql.Timestamp 类型。


解决方法:

  将日期改为正常日期即可。

Mysql 时间格式默认插入值为空时,会以'0000-00-00 00:00:00'填充,这时如果select时会抛出SQLExecption如下:

java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

解决方案:

value="jdbc:mysql://xxx.xxx.x.xxx:3306/库名?zeroDateTimeBehavior=convertToNull">

另还有一种解决方案:

方法二:select 语句中做如下处理:

SELECT ID, IF(createDate='0000-00-00 00:00:00','null',createDate)createDate FROM T_DateTest;

这里将createDate格式转换为”null“展示,不再抛出SQLException。

java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

问题描述,在java应用程序中,数据表中有记录的time字段(属性为timestamp)其值为:“0000-00-00 00:00:00”

程序使用select 语句从中取数据时出现以下异常:

java.sql.SQLException:Value '0000-00-00' can not be represented as java.sql.Date

这是因为 “0000-00-00 00:00:00”在mysql中是作为一个特殊值存在的,但是在Java中, java.sql.Date 会被视为 不合法的值,被JVM认为格式不正确。

解决办法:

在jdbc的url加上   zeroDateTimeBehavior参数:

datasource.url=jdbc:mysql://localhost:3306/pe?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull

对于值为0000-00-00   00:00:00(默认值)的纪录,根据不同的配置,会返回不同的结果:

不配置:默认返回异常

zeroDateTimeBehavior=round   0001-01-01   00:00:00.0

zeroDateTimeBehavior=convertToNull   null

但这样有可能会报新的Exception:

The reference to entity "characterEncoding" must end with the ';' delimiter   

其原因可能是在Properties文件或者xml文件中忘记进行特殊符号的转译了,

jdbc:mysql://192.168.1.155:3306/diandi?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

需要改为:

jdbc:mysql://192.168.1.155:3306/diandi?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull 

有以下几类字符要进行转义替换:

springboot+maven+tk.mybatis+generator逆向工程_第6张图片

====================================================================

在此基础之上添加分页插件

1.在pom.xml中添加分页插件依赖,指定版本号,最好是4.x版本,5.x的新版会报错

com.github.pagehelper

pagehelper

4.2.1

2.在MyBatisConfig.java类中配置

springboot+maven+tk.mybatis+generator逆向工程_第7张图片

packagecom.sino.mapper.mybatis;

importcom.github.pagehelper.PageHelper;

importorg.apache.ibatis.plugin.Interceptor;

importorg.apache.ibatis.session.SqlSessionFactory;

importorg.mybatis.spring.SqlSessionFactoryBean;

importorg.mybatis.spring.SqlSessionTemplate;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

importorg.springframework.context.annotation.Bean;

importorg.springframework.context.annotation.Configuration;

importorg.springframework.jdbc.datasource.DataSourceTransactionManager;

importorg.springframework.transaction.PlatformTransactionManager;

importorg.springframework.transaction.annotation.EnableTransactionManagement;

importorg.springframework.transaction.annotation.TransactionManagementConfigurer;

importjavax.sql.DataSource;

importjava.util.Properties;

@Configuration

//加上这个注解,使得支持事务

@EnableTransactionManagement

public classMyBatisConfigimplementsTransactionManagementConfigurer {

@Autowired

privateDataSourcedataSource;

@Override

publicPlatformTransactionManager annotationDrivenTransactionManager() {

return newDataSourceTransactionManager(dataSource);

}

@Bean(name ="sqlSessionFactory")

publicSqlSessionFactory sqlSessionFactoryBean(PageHelper pageHelper) {

SqlSessionFactoryBean bean =newSqlSessionFactoryBean();

bean.setDataSource(dataSource);

//自定义数据库配置的时候,需要将pageHelper的bean注入到Plugins中,如果采用系统默认的数据库配置,则只需要定义pageHelper的bean,会自动注入。

bean.setPlugins(newInterceptor[] { pageHelper });

try{

returnbean.getObject();

}catch(Exception e) {

e.printStackTrace();

throw newRuntimeException(e);

}

}

@Bean

publicSqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {

return newSqlSessionTemplate(sqlSessionFactory);

}

@Bean

publicPageHelper pageHelper() {

PageHelper pageHelper =newPageHelper();

Properties p =newProperties();

p.setProperty("offsetAsPageNum","true");

p.setProperty("rowBoundsWithCount","true");

p.setProperty("reasonable","true");

p.setProperty("dialect","mysql");

pageHelper.setProperties(p);

returnpageHelper;

}

}

至于这个注入一致报红线并没有找到原因,但是不影响运行

分页测试:

UserController.java

@RestController

public classUserController {

@Autowired

privateUserServiceuserService;

@RequestMapping("/page")

publicList selectAll(){

/*

* 第一个参数是第几页;第二个参数是每页显示条数。

*/

PageHelper.startPage(1,2);

List list=userService.selectAll();

returnlist;

}

}

public interfaceUserService {

User getUser(longid);

List selectAll();

}

@Service

@Transactional

public classUserServiceImplimplementsUserService {

@Autowired

privateUserMapperuserMapper;

@Override

publicUser getUser(longid) {

returnuserMapper.selectByPrimaryKey(id);

}

@Override

publicList selectAll() {

returnuserMapper.selectAll();

}

}

http://127.0.0.1:8080/page

你可能感兴趣的:(springboot+maven+tk.mybatis+generator逆向工程)