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&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
需要改為:
jdbc:mysql://192.168.1.155:3306/diandi?useUnicode=true&characterEncoding=UTF-8&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