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

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

<?xml version="1.0"encoding="UTF-8"?>

<projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.sino</groupId>

<artifactId>demo_parent</artifactId>

<packaging>pom</packaging>

<version>1.0-SNAPSHOT</version>

<modules>

<module>bos</module>

</modules>

<!-- 在这里添加继承Springboot示例工程的说明 -->

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.0.5.RELEASE</version>

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

</properties>

<!--mybatis逆向工程插件-->

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

<!-- MyBatis 逆向工程 插件 -->

<plugin>

<groupId>org.mybatis.generator</groupId>

<artifactId>mybatis-generator-maven-plugin</artifactId>

<version>1.3.2</version>

<configuration>

<!-- 允许移动生成的文件 -->

<verbose>true</verbose>

<!-- 是否覆盖 -->

<overwrite>true</overwrite>

<!-- 配置文件 -->

<configurationFile>

src/main/resources/generatorConfig.xml

</configurationFile>

</configuration>

<!--此处添加一个mysql-connector-java依赖可以防止找不到jdbc Driver-->

<dependencies>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.47</version>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>tk.mybatis</groupId>

<artifactId>mapper</artifactId>

<version>3.3.9</version>

</dependency>

</dependencies>

</plugin>

</plugins>

</build>

<dependencies>

<!--springboot mybatis-->

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.3.2</version>

</dependency>

<!-- SpringBoot - MyBatis 逆向工程 -->

<dependency>

<groupId>org.mybatis.generator</groupId>

<artifactId>mybatis-generator-core</artifactId>

<version>1.3.2</version>

</dependency>

<!--SpringBoot - 通用Mapper-->

<dependency>

<groupId>tk.mybatis</groupId>

<artifactId>mapper</artifactId>

<version>3.3.9</version>

</dependency>

<!-- <dependency>

<groupId>com.github.pagehelper</groupId>

<artifactId>pagehelper</artifactId>

</dependency>-->

<!-- mysql -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

</dependency>

<!-- 核心模块,包括自动配置支持、日志和YAML -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter</artifactId>

</dependency>

<!-- 测试模块,包括JUnit、Hamcrest、Mockito -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

<!-- Web模块 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!-- 引入datasource相关 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jdbc</artifactId>

</dependency>

<!--添加jsp依赖 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-tomcat</artifactId>

</dependency>

<dependency>

<groupId>org.apache.tomcat.embed</groupId>

<artifactId>tomcat-embed-jasper</artifactId>

</dependency>

</dependencies>

</project>

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

设置所需的配置文件

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

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPEgeneratorConfiguration

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

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

<generatorConfiguration>

<!-- 引入 application.properties -->

<propertiesresource="application.properties"/>

<!-- MyBatis3Simple:不生成 Example相关类及方法 -->

<contextid="Mysql"targetRuntime="MyBatis3Simple"defaultModelType="flat">

<propertyname="beginningDelimiter"value="`"/>

<propertyname="endingDelimiter"value="`"/>

<!-- 指定生成 Mapper 的继承模板 -->

<plugintype="tk.mybatis.mapper.generator.MapperPlugin">

<propertyname="mappers"value="${generator.mappers}"/>

</plugin>

<!-- 生成 JavaBean 对象重写 toString方法 -->

<plugintype="org.mybatis.generator.plugins.ToStringPlugin"/>

<!-- 生成 JavaBean 对象继承 Serializable 类 -->

<plugintype="org.mybatis.generator.plugins.SerializablePlugin"/>

<!-- 生成 JavaBean 对象重写 equals 和 hashCode 方法 -->

<!-- <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" /> -->

<!-- jdbc 连接配置 -->

<jdbcConnectiondriverClass="${spring.datasource.driver-class-name}"

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

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

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

</jdbcConnection>

<!-- 逆向工程生成文件的位置,在application.properties中配置 -->

<javaModelGeneratortargetPackage="${generator.javaModel-targetPackage}"

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

<sqlMapGeneratortargetPackage="${generator.sqlMap-targetPackage}"

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

<javaClientGeneratortargetPackage="${generator.javaClient-targetPackage}"

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

<!-- Mysql 配置 -->

<!-- <generatedKey column="id" sqlStatement="Mysql" identity="true" /> -->

<!-- Oracle 配置 -->

<!-- <generatedKey column="id" sqlStatement="select SEQ_{1}.nextval from dual" identity="false" type="pre"/> -->

<!-- tableName:数据库表名,domainObjectName:生成文件名 ,schema:数据源-->

<tabletableName="user"domainObjectName="User">

<generatedKeycolumn="id"sqlStatement="Mysql"identity="true"/>

</table>

</context>

</generatorConfiguration>

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

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

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

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

搭建过程中遇到的问题:

错误: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,配置如下:

<javaClientGeneratortargetPackage="${generator.javaClient-targetPackage}"

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-connector-java依赖可以防止找不到jdbc Driver-->

<build>

<plugins>

<plugin>

<dependencies>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.47</version>

<scope>runtime</scope>

</dependency>

</dependencies>

</plugin>

</plugins>

</build>

错误:

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文件中引入了

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</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.<init>()

解决:在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

解决方案:<property name="url"

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

</property>

另还有一种解决方案:

方法二: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&amp;characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

需要改为:

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

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

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

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

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

<!--分页插件-->

<dependency>

<groupId>com.github.pagehelper</groupId>

<artifactId>pagehelper</artifactId>

<version>4.2.1</version>

</dependency>

2.在MyBatisConfig.java类中配置

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<User> selectAll(){

/*

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

*/

PageHelper.startPage(1,2);

List<User> list=userService.selectAll();

returnlist;

}

}

public interfaceUserService {

User getUser(longid);

List<User> selectAll();

}

@Service

@Transactional

public classUserServiceImplimplementsUserService {

@Autowired

privateUserMapperuserMapper;

@Override

publicUser getUser(longid) {

returnuserMapper.selectByPrimaryKey(id);

}

@Override

publicList<User> selectAll() {

returnuserMapper.selectAll();

}

}

http://127.0.0.1:8080/page

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,601评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,748评论 6 342
  • 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使...
    哇哈哈E阅读 3,293评论 0 38
  • 愿找到内心新生的力量。我半年才见上一面的老朋友,吃惊她瘦了好多,半疑问的笑问,哟,身材挺好,怎么半年没见瘦这么多?...
    a410e343588b阅读 158评论 0 0
  • 超级漂亮的铅笔✏好喜欢~ 我知道你肯定会黑我,说铅笔上的英文能不能看的懂。嗯~ 有小惊喜的感觉真好。么么哒!
    蓬蓬蓬的毛毛熊阅读 153评论 1 1