前期准备
生成项目
在spring官网https://start.spring.io/自动生成springboot项目,这里选择项目自动依赖web/mybatis/mysql,然后点击Generate Project下载项目到本地。
导入项目到idea
解压上面下载的demo.zip文件到~/myproject/,在idea里File->open->~/myproject/demo,项目成功导入。
集成generator
从官网获取generatorConfig文件
http://www.mybatis.org/generator/configreference/xmlconfig.html
复制以下内容到~/myproject/demo/src/main/resources/generator目录,命名generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
connectionURL="jdbc:db2:TEST"
userId="db2admin"
password="db2admin">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
</context>
</generatorConfiguration>
说明:复制到idea项目中mybatis-generator-config_1_0.dtd可能会标红,因为这个文件依赖mybatis-generator-core这个包。
在pom.xml加入依赖即可解决标红问题,记得刷新maven。
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
generatorConfiguration这个标签下的子标签,有如下约束
<!ELEMENT generatorConfiguration (properties?, classPathEntry*, context+)>
第一个子标签如果有则必须是properties
第二个子标签如果有则必须是classPathEntry
第三哥标签context必须有一个或者多个
同样的context子标签有如下约束
<!ELEMENT context (property*, plugin*, commentGenerator?, (connectionFactory | jdbcConnection), javaTypeResolver?,
javaModelGenerator, sqlMapGenerator?, javaClientGenerator?, table+)>
注意:标签有序
修改为mysql可用的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--<properties resource="application.properties"/>-->
<!--这里注释掉,后面集成插件的时候,在pom.xml文件导入驱动-->
<!--<classPathEntry location="~/mysql/mysql-connector-java-8.0.13.jar" />-->
<!--1,MyBatis3:默认的值;
2,MyBatis3Simple:生成的mapper和xml比较简洁干净-->
<context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="javaFileEncoding" value="UTF-8" />
<!--pressAllComments:MyBatis3默认为false,true则默认不生成注释
suppressDate:MyBatis3默认为false,默认不生成时间戳-->
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--新版mysql驱动用的是com.mysql.cj.jdbc.Driver,老版本的是com.mysql.jdbc.Driver-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/dbname"
userId="root"
password="123456">
</jdbcConnection>
<javaModelGenerator targetPackage="com.cyz.demo.entity" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
<javaClientGenerator targetPackage="com.cyz.demo.dao.mapper" targetProject="src/main/java" type="XMLMAPPER"/>
<!--去掉example代码-->
<table tableName="test_table" domainObjectName="TestTable" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
<!--% 表示全部表-->
<!--mysql 配置-->
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
<!--oracle 配置-->
<!-- <generatedKey column="id" sqlStatement="select SEQ_{1}.nextval from dual" identity="false" type="pre"/> -->
</table>
</context>
</generatorConfiguration>
集成插件
在pom.xml中加入以下配置集成插件
<build>
<plugins>
<!--其他插件,复制下面内容即可,从<plugin>到</plugin>-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
刷新maven后,可以在idea的mavenProject里看到
双击即可运行,即可在项目中看到生成的文件。
也可以通过在maven里添加mybatis-generator:generate -e命令运行
注意:这里xml文件如果有则追加,没有则新增。
生成的包运用到Springboot项目中
在application.properties文件中加入以下配置
server.port = 8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/dbname?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=123456
mybatis.typeAliasesPackage = com.cyz.demo.entity
mybatis.mapperLocations = classpath:mapper/*.xml
新增controller和service,TestController.java代码如下
package com.cyz.demo.controller;
import com.cyz.demo.entity.TestTable;
import com.cyz.demo.service.TestTableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestTableService service;
@GetMapping("/get")
public TestTable getTest(
@RequestParam("id") Long id) {
TestTable testTable =service.getTestTable(id);
return testTable;
}
}
TestTableServiceImpl.java代码如下
package com.cyz.demo.service.impl;
import com.cyz.demo.dao.mapper.TestTableMapper;
import com.cyz.demo.entity.TestTable;
import com.cyz.demo.service.TestTableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class TestTableServiceImpl implements TestTableService {
@Autowired
private TestTableMapper mapper;
public TestTable getTestTable(Long id) {
return mapper.selectByPrimaryKey(id);
}
}
TestTableService.java代码如下
package com.cyz.demo.service;
import com.cyz.demo.entity.TestTable;
public interface TestTableService {
TestTable getTestTable(Long id);
}
创建数据库脚本如下
create database dbname;
use dbname;
CREATE TABLE `test_table` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`col1` VARCHAR(70) ,
`col2` VARCHAR(70) ,
`col3` VARCHAR(70) ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
附上代码目录
问题总结:
- Field mapper in com.cyz.demo.service.impl.TestTableServiceImpl required a bean of type ‘com.cyz.demo.dao.mapper.TestTableMapper’ that could not be found.
问题原因:mapper类未扫描到。
解决方案:
DemoApplication类上加注解扫描到mapper
@MapperScan({“com.cyz.demo.dao”}) - Invalid bound statement (not found): com.cyz.demo.dao.mapper.TestTableMapper.selectByPrimaryKey] with root cause
问题原因:mapper.xml路径配置错误
检查xml文件目录是否与application.properties里的mybatis.mapperLocations = classpath:mapper/*.xml一致。