美文网首页Tool
springboot+maven+tk.mybatis+gene

springboot+maven+tk.mybatis+gene

作者: 瑜Z酱 | 来源:发表于2018-10-18 15:10 被阅读721次

    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

    相关文章

      网友评论

        本文标题:springboot+maven+tk.mybatis+gene

        本文链接:https://www.haomeiwen.com/subject/xoxszftx.html