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

1.父工程的pom.xml中導(dǎo)入依賴和插件,當(dāng)前完整的文件如下:

<?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>

<!-- 允許移動(dòng)生成的文件 -->

<verbose>true</verbose>

<!-- 是否覆蓋 -->

<overwrite>true</overwrite>

<!-- 配置文件 -->

<configurationFile>

src/main/resources/generatorConfig.xml

</configurationFile>

</configuration>

<!--此處添加一個(gè)mysql-connector-java依賴可以防止找不到j(luò)dbc 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>

<!-- 核心模塊,包括自動(dòng)配置支持、日志和YAML -->

<dependency>

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

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

</dependency>

<!-- 測(cè)試模塊,包括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相關(guān) -->

<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>

添加完逆向工程的插件以后,會(huì)在右側(cè)找到插件

設(shè)置所需的配置文件

2. generatorConfig.xml? -->這個(gè)配置生成的實(shí)體類是自帶注解的

<?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相關(guān)類及方法 -->

<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 對(duì)象重寫 toString方法 -->

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

<!-- 生成 JavaBean 對(duì)象繼承 Serializable 類 -->

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

<!-- 生成 JavaBean 對(duì)象重寫 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:數(shù)據(jù)庫(kù)表名,domainObjectName:生成文件名 ,schema:數(shù)據(jù)源-->

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

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

</table>

</context>

</generatorConfiguration>

3.application.properties

#配置數(shù)據(jù)庫(kù)

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設(shè)置生成后的配置文件位置

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

# 頁(yè)面默認(rèn)前綴目錄

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

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

# 響應(yīng)頁(yè)面默認(rèn)后綴

spring.mvc.view.suffix=.jsp

4.編寫生成Mapper的集成接口IBaseMapper

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

5.雙擊插件運(yùn)行(注意是web層的插件,不然的話,會(huì)報(bào)對(duì)應(yīng)的子工程缺少application.properties和generatorConfig.xml的錯(cuò)誤)

6.生成的實(shí)體類以及mapper.xml文件

搭建過程中遇到的問題:

錯(cuò)誤: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標(biāo)簽配置正確的type屬性即可。

使用的targetRuntime="MyBatis3Simple",有以下兩種可選type。

XMLMAPPER:生成的對(duì)象是 MyBatis 3.x 映射器基礎(chǔ)結(jié)構(gòu)的 Java接口和XML映射文件。

ANNOTATEDMAPPER:生成的對(duì)象是 MyBatis 3.x 映射器基礎(chǔ)結(jié)構(gòu)的Java接口(使用注解),無XML文件。

習(xí)慣使用XMLMAPPER,配置如下:

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

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

錯(cuò)誤: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

解決:這個(gè)是找不到mysql的驅(qū)動(dòng)包,我用的辦法是在插件中再添加一次mysql依賴

<!--此處添加一個(gè)mysql-connector-java依賴可以防止找不到j(luò)dbc 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>

錯(cuò)誤:

Could not resolve dependencies for project

個(gè)人理解:項(xiàng)目中不同模塊可能會(huì)有相互關(guān)系的依賴,所以必須把自己完成的模塊放入本地maven倉(cāng)庫(kù)中,才能夠讓項(xiàng)目在運(yùn)行時(shí),

各個(gè)模塊找到其對(duì)應(yīng)的依賴。所以將母項(xiàng)目安裝到maven倉(cāng)庫(kù)可以解決這個(gè)問題。

建議將pom所在的包c(diǎn)lean一下? 然后install一下

錯(cuò)誤:

[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]

解決:和上面一個(gè)錯(cuò)誤是連接的,我這個(gè)是在父工程中打包,百度了一下,說是因?yàn)閜om.xml文件中引入了

<plugin>

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

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

</plugin>

這里引入了spring-boot-maven-plugin,打包時(shí)會(huì)去掃描項(xiàng)目main方法入口,也就是說引入該配置,你就必須在項(xiàng)目src/main/java/下創(chuàng)建一個(gè)spring-boot啟動(dòng)類:

@SpringBootApplication

@MapperScan("com.sino.mapper")

public classWebApplication {

public static voidmain(String[] args) {

SpringApplication.run(WebApplication.class);

}

}

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

解決方案:

1.?添加spring-boot啟動(dòng)類。

2.?將pom.xml中的spring-boot-maven-plugin相關(guān)配置注釋掉

3.?pom.xml中spring-boot-maven-plugin相關(guān)配置修改為普通的maven--plugin配置即可。

錯(cuò)誤:mybatis逆向工程運(yùn)行成功卻沒有生成相應(yīng)的包和文件

原因1:逆向工程中的路徑問題,windows和mac等的文件系統(tǒng)路徑不同

mac和Linux下應(yīng)該使用./,windows下應(yīng)該使用.\

原因2:運(yùn)行的插件不對(duì),應(yīng)該運(yùn)行web下的插件,而不是父工程下的

測(cè)試錯(cuò)誤:

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

解決:在mybatis文件下加兩個(gè)文件

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注冊(cè)后再加載MapperScannerConfigurer,否則會(huì)報(bào)錯(cuò)

@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這個(gè)類接下來會(huì)創(chuàng)建

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

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

//特別注意mapperScannerConfigurer的引入import tk.mybatis.spring.mapper.MapperScannerConfigurer;引入錯(cuò)誤則沒下面這個(gè)方法

mapperScannerConfigurer.setProperties(properties);

returnmapperScannerConfigurer;

}

}

錯(cuò)誤: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 中的一個(gè) datetime 字段時(shí)碰到了一個(gè) Cause: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp 異常,之前使用都沒有問題,今天突然出現(xiàn)故障。所以我就仔細(xì)查看了一下代碼,看看最近是否有人改動(dòng)。通過最終的搜索排查,我把整個(gè)過程分享給大家!

根據(jù)異常信息,我翻譯了一下,大概意思是說,'0000-00-00 00:00:00' 這個(gè)時(shí)間不能用 Java 來表示。雖然數(shù)據(jù)庫(kù)中可以存放這個(gè)值,但是 Java 中的時(shí)間都是從 1970 年開始的。格林威治時(shí)間 1970年01月01日00時(shí)00分00秒(UTC+8北京時(shí)間1970年01月01日08時(shí)00分00秒),所以你這個(gè) '0000-00-00 00:00:00' 的時(shí)間,Java 表示不了,所以就拋出了這個(gè)異常。

完整的異常信息如下:

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)

那么知道這個(gè)異常產(chǎn)生的原因后,該如何解決呢?

根據(jù) stackoverflow 上一部分人的回答,我得出可以使用下面的方式連接數(shù)據(jù)庫(kù)來解決:

1

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

MySQL 的官方資料對(duì) zeroDateTimeBehavior 屬性做出了詳細(xì)的解釋,相見參考資料。

設(shè)置 zeroDateTimeBehavior 屬性,當(dāng)遇到 DATETIME 值完全由 0 組成時(shí),最終的有效值可以設(shè)置為,異常(exception),一個(gè)近似值(round),或?qū)⑦@個(gè)值轉(zhuǎn)換為 null(convertToNull)。

默認(rèn)情況為 exception,設(shè)置這個(gè)屬性會(huì)拋出一個(gè) SQLException 異常,也就是文章開頭所說到的異常。其 SQLSate 碼為 S1009。這個(gè)狀態(tài)碼在寫存儲(chǔ)過程處理異常時(shí)也可以用到。

convertToNull,返回 null 來替代 0000-00-00 這樣的日期。

round,將日期轉(zhuǎn)換為 0001-01-01。

因此,出現(xiàn) 0000-00-00 屬于一個(gè)無效日期,用 convertToNull 屬性即可。

下面我們?cè)僖黄饋砘仡櫼幌?Java 中對(duì)日期類型的處理方法。

首先 Java 中能表示日期的提供了 4 個(gè)類,分別是:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp。

它們的繼承關(guān)系如下:

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 日期格式為:年月日時(shí)分秒

* java.sql.Date 日期格式為:年月日[只存儲(chǔ)日期數(shù)據(jù)不存儲(chǔ)時(shí)間數(shù)據(jù)]

* java.sql.Time 日期格式為:時(shí)分秒

* java.sql.Timestamp 日期格式為:年月日時(shí)分秒納秒(毫微秒)

從上可以看出 java.util.Date 這個(gè)類是 java.sql.Date, ?java.sql.Time, ?java.slq.Timestamp 這三個(gè)類的父類。這三個(gè)類對(duì) java.util.Date 類進(jìn)行了包裝。

java.sql.Date 類屏蔽了 java.util.Date 類的時(shí)間有關(guān)的方法(形如:hh:mm:ss),因此,不可以通過這個(gè)類訪問時(shí)間有關(guān)的信息,比如,如果你通過 sqlDate.getHour() 方法去訪問小時(shí)信息,此方法會(huì)拋出一個(gè)IllegalArgumentException異常。這是因?yàn)?java.sql.Date 在繼承 java.util.Date 類的時(shí)候?qū)Ω割愡M(jìn)行了重寫,禁用了時(shí)間訪問的方法。之所以這么處理,是為了和數(shù)據(jù)庫(kù)的Date數(shù)據(jù)類型相匹配,數(shù)據(jù)庫(kù)的Date數(shù)據(jù)類行只是保存日期有關(guān)的字段。

Java.sql.Time 類屏蔽了 java.util.Date 的日期有關(guān)的字段(形如:yyyy-MM-dd),因此,不能通過這個(gè)類訪問日期有關(guān)的信息,比如:如果你通過 sqlTime.getYear() 方法去獲取年有關(guān)的信息,此方法會(huì)拋出一個(gè) IllegalArgumentException 異常。這是因?yàn)?java.sql.Time 在繼承 java.util.Date 類的時(shí)候?qū)Ω割愡M(jìn)行了重寫,禁用了日期訪問的方法。之所以這么處理,是為了和數(shù)據(jù)庫(kù)的 Time 數(shù)據(jù)類型相匹配,數(shù)據(jù)庫(kù)的Time數(shù)據(jù)類行只是保存時(shí)間有關(guān)的字段。

Java.sql.Timestamp 字段則對(duì) java.util.Date 這個(gè)類進(jìn)行了擴(kuò)充,它在 java.util.Date 類的基礎(chǔ)上增加了毫秒的時(shí)間訪問控制,因此,你可以通過 getNanos()方法去獲取時(shí)間的毫微秒數(shù)(注意此處獲取的時(shí)間是以毫微秒為單位的,1秒等于十億毫微秒),同樣的,這也是為了和數(shù)據(jù)庫(kù)中的Timestamp數(shù)據(jù)類型進(jìn)行匹配。

理清了上述四個(gè)類的關(guān)系,那么 java.util.Date 和 java.util.Calendar 類有什么關(guān)系呢?

Java.util.Calendar 類是 java.util.Date 類的一個(gè)更加深入,更加全面的替代。Java.util.Calendar 類支持 java.util.Date 的所有功能,此外,Calendar 還引入了多語言,多區(qū)域的特性,可以根據(jù)需要獲取不同區(qū)域,不同時(shí)區(qū)的時(shí)間,Calendar 還增加了比 Date 更加方便和快捷的許多操作,如獲取一年當(dāng)中的第幾個(gè)星期,各個(gè)月的天數(shù)等便捷的方法。

java.util.Calendar 區(qū)別與 java.util.Date 的幾個(gè)地方也需要注意一下:首先,Calendar 增加了毫秒的時(shí)間段,通過它可以獲取時(shí)間點(diǎn)的毫秒值,而 java.util.Date 只是精確到秒。其次,Calendar 過去年的時(shí)候是當(dāng)前年份比如:2010,而 Date 獲取年份的時(shí)獲取到的是當(dāng)前年份-1900的一個(gè)值(2010-1900=110,因此,你調(diào)用 getYear 后過去的值就是110)。最后 Calendar 是一個(gè)抽象類,之所以能夠?qū)嵗?,是因?yàn)榇颂幍?Calendar 充當(dāng)了一個(gè)類似于工廠的作用,在 getInstance 方法中實(shí)例化了 Calendar 子類 GregorianCalendar,并把它返回給用戶使用。

針對(duì)不同的數(shù)據(jù)庫(kù)選用不同的日期類型 。例如:Oracle的Date類型,只需要年月日,選擇使用java.sql.Date類型;MySQL 和 Sqlserver 數(shù)據(jù)庫(kù)的 DateTime 類型,需要年月日時(shí)分秒,選擇 java.sql.Timestamp 類型。


解決方法:

  將日期改為正常日期即可。

Mysql 時(shí)間格式默認(rèn)插入值為空時(shí),會(huì)以'0000-00-00 00:00:00'填充,這時(shí)如果select時(shí)會(huì)拋出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/庫(kù)名?zeroDateTimeBehavior=convertToNull">

</property>

另還有一種解決方案:

方法二:select 語句中做如下處理:

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

這里將createDate格式轉(zhuǎn)換為”null“展示,不再拋出SQLException。

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

問題描述,在java應(yīng)用程序中,數(shù)據(jù)表中有記錄的time字段(屬性為timestamp)其值為:“0000-00-00 00:00:00”

程序使用select 語句從中取數(shù)據(jù)時(shí)出現(xiàn)以下異常:

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

這是因?yàn)?“0000-00-00 00:00:00”在mysql中是作為一個(gè)特殊值存在的,但是在Java中,?java.sql.Date 會(huì)被視為 不合法的值,被JVM認(rèn)為格式不正確。

解決辦法:

在jdbc的url加上 ? zeroDateTimeBehavior參數(shù):

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

對(duì)于值為0000-00-00 ? 00:00:00(默認(rèn)值)的紀(jì)錄,根據(jù)不同的配置,會(huì)返回不同的結(jié)果:

不配置:默認(rèn)返回異常

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

zeroDateTimeBehavior=convertToNull ? null

但這樣有可能會(huì)報(bào)新的Exception:

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

其原因可能是在Properties文件或者xml文件中忘記進(jìn)行特殊符號(hào)的轉(zhuǎn)譯了,

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?

有以下幾類字符要進(jìn)行轉(zhuǎn)義替換:

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

在此基礎(chǔ)之上添加分頁(yè)插件

1.在pom.xml中添加分頁(yè)插件依賴,指定版本號(hào),最好是4.x版本,5.x的新版會(huì)報(bào)錯(cuò)

<!--分頁(yè)插件-->

<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

//加上這個(gè)注解,使得支持事務(wù)

@EnableTransactionManagement

public classMyBatisConfigimplementsTransactionManagementConfigurer {

@Autowired

privateDataSourcedataSource;

@Override

publicPlatformTransactionManager annotationDrivenTransactionManager() {

return newDataSourceTransactionManager(dataSource);

}

@Bean(name ="sqlSessionFactory")

publicSqlSessionFactory sqlSessionFactoryBean(PageHelper pageHelper) {

SqlSessionFactoryBean bean =newSqlSessionFactoryBean();

bean.setDataSource(dataSource);

//自定義數(shù)據(jù)庫(kù)配置的時(shí)候,需要將pageHelper的bean注入到Plugins中,如果采用系統(tǒng)默認(rèn)的數(shù)據(jù)庫(kù)配置,則只需要定義pageHelper的bean,會(huì)自動(dòng)注入。

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;

}

}

至于這個(gè)注入一致報(bào)紅線并沒有找到原因,但是不影響運(yùn)行

分頁(yè)測(cè)試:

UserController.java

@RestController

public classUserController {

@Autowired

privateUserServiceuserService;

@RequestMapping("/page")

publicList<User> selectAll(){

/*

* 第一個(gè)參數(shù)是第幾頁(yè);第二個(gè)參數(shù)是每頁(yè)顯示條數(shù)。

*/

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,706評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,451評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,677評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,857評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,407評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,643評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,836評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,925評(píng)論 6 342
  • 1 Mybatis入門 1.1 單獨(dú)使用jdbc編程問題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,321評(píng)論 0 38
  • 愿找到內(nèi)心新生的力量。我半年才見上一面的老朋友,吃驚她瘦了好多,半疑問的笑問,喲,身材挺好,怎么半年沒見瘦這么多?...
    a410e343588b閱讀 164評(píng)論 0 0
  • 超級(jí)漂亮的鉛筆?好喜歡~ 我知道你肯定會(huì)黑我,說鉛筆上的英文能不能看的懂。嗯~ 有小驚喜的感覺真好。么么噠!
    蓬蓬蓬的毛毛熊閱讀 166評(píng)論 1 1