1.父工程的pom.xml中导入依赖和插件,当前完整的文件如下:
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"> src/main/resources/generatorConfig.xml 添加完逆向工程的插件以后,会在右侧找到插件 设置所需的配置文件 2. generatorConfig.xml -->这个配置生成的实体类是自带注解的
PUBLIC"-//mybatis.org//DTDMyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> connectionURL="${spring.datasource.url}" userId="${spring.datasource.username}" password="${spring.datasource.password}"> targetProject="${generator.targetProject}"/> targetProject="${generator.targetProject}"/> targetProject="${generator.targetProject}"type="XMLMAPPER"/> 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,配置如下: 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依赖 错误: 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文件中引入了 这里引入了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. 解决:在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 解决方案: value="jdbc:mysql://xxx.xxx.x.xxx:3306/库名?zeroDateTimeBehavior=convertToNull"> 另还有一种解决方案: 方法二: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的新版会报错 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 /* * 第一个参数是第几页;第二个参数是每页显示条数。 */ PageHelper.startPage(1,2); List returnlist; } } public interfaceUserService { User getUser(longid); List } @Service @Transactional public classUserServiceImplimplementsUserService { @Autowired privateUserMapperuserMapper; @Override publicUser getUser(longid) { returnuserMapper.selectByPrimaryKey(id); } @Override publicList returnuserMapper.selectAll(); } } http://127.0.0.1:8080/page