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