IDEA2020.1+MySQL8.0、Mybatis逆向工程创建并测试
安装软件:
IDEA2020.1;
MySQL8.0;
注:IDEA需要配置好maven
一、MySQL建立数据库表
建立了一个student数据库,包含person、school、score三个表,测试只展示score表的处理,这里贴出了score表中的数据。
注:对于表的建立可以通过SQL语句也可以在MySQL中手动建立,这里不展示。
二、IDEA建立spring initializr项目
开始代码之前需要在IDEA中建立一个spring initializr项目,我用的jdk版本是1.8的,网上很多都采用建立maven项目,这也是可以的。
这里只列出重点需要注意的地方。
Java version选 8 ,接下来按如图选择需要的模块:
next,直到项目建立完成。
三、pom.xml文件引入依赖
IDEA中建好spring initializr项目后,打开pom.xml,引入依赖,这里展示我的完整pom文件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>mybatis-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
</project>
需要注意,这里的<build>
内容是一键生成pojo、dao、mapper的关键,没有这个插件就需要创建单独的代码类或者maven来执行了。
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration> <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
四、逆向工程generatorConfig.xml 配置
这里也是直接贴上我的完整文件,详细说明都在注释里了。
需要说明,这里的文件名为了直接扫描到命名为generatorConfig.xml
,文件位置是在resource
文件夹下。
<?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.yml"/>-->
<!-- 引入本地Mysql连接 ,指定当前JDBC的驱动-->
<classPathEntry location="E:\maven_repository\mysql\mysql-connector-java\8.0.21\mysql-connector-java-8.0.21.jar" />
<context id="test" targetRuntime="MyBatis3">
<!-- 实体类生成toString 方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- Mysql数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/student?serverTimezone=GMT"
userId="root"
password="123456">
</jdbcConnection>
<!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制
默认false,把jdbc decimal 和 numeric 类型解析为integer
true,把jdbc decimal 和 numeric 类型解析为java.math.bigdecimal-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
-->
<!-- targetProject:生成POJO类的位置 -->
<javaModelGenerator targetPackage="com.example.mybatisdemo.entity" targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
<!-- <property name="mergeable" value="true"/>-->
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置,为每一个数据库的表生成对应的mapper.xml文件-->
<sqlMapGenerator targetPackage="com.example.mybatisdemo.mapper" targetProject=".\src\main\resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的映射文件
type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
-->
<!-- targetProject:mapper(DAO)接口生成的的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mybatisdemo.mapper" targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据表 你想要生成那些表就添加几个 tableName:表名; domainObjectName:对应的DO,是实体类名 -->
<table schema="" tableName="person" domainObjectName="Person" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="false"
enableSelectByExample="true" selectByExampleQueryId="true" selectByPrimaryKeyQueryId="true" enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true"/>
<table schema="" tableName="school" domainObjectName="School" selectByPrimaryKeyQueryId="true" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="false"
enableSelectByExample="true" selectByExampleQueryId="true" enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true"/>
<table schema="" tableName="score" domainObjectName="Score" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="false"
enableSelectByExample="true" selectByExampleQueryId="true" selectByPrimaryKeyQueryId="true" enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true"/>
</context>
</generatorConfiguration>
需要注意的是:
<sqlMapGenerator targetPackage="com.example.mybatisdemo.mapper"
和如下
<javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mybatisdemo.mapper"
这里的targetPackage
必须一致,不一致的话会导致
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
异常,若两者想要放到不同targetPackage
又不抛异常就需要配置文件中做其他设置了。
五、一键生成pojo、dao、mapper映射文件
以上工作完成后在IEDA右侧maven小窗install
一下,可以看到多出一个插件mybatis-generator(这个插件页可以通过setting来安装)
双击mybatis-generator:generate,即可生成pojo、dao、mapper映射文件。
生成后IDEA查看文件目录树如下图:
注:图中service包存放的是下面一步中的interface和implement类,其他.xml .yml .properties是我做其他用途的,不用关心。
pojo、dao、mapper映射文件如图:
到这里,mybatis逆向工程就完成了。
六、测试
6.1 编写测试interface、implement、test类
这里只测试根据id查询和根据指定的属性来更新这两个方法,其他方法代码都差不多。
首先看service包下的类
这里就直接放代码了:
ScoreService.java
package com.example.mybatisdemo.service;
import com.example.mybatisdemo.entity.Score;
import java.util.List;
public interface ScoreService {
int updateScoreBySelectId(Score score);
List<Score> listScoreById(int id);
}
ScoreServiceImpl.java
package com.example.mybatisdemo.service;
import com.example.mybatisdemo.entity.Score;
import com.example.mybatisdemo.entity.ScoreExample;
import com.example.mybatisdemo.mapper.ScoreMapper;
import com.google.common.base.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ScoreServiceImpl implements ScoreService {
@Autowired
private ScoreMapper scoreMapper;
/**
*
* @Param score: 待更新的对象,id不能为空且数据库中存在此id
* @return: int 更新了几条记录
**/
@Override
public int updateScoreBySelectId(Score score) {
Preconditions.checkNotNull(score, "更新的信息 score 不能为空");
ScoreExample scoreExample = new ScoreExample();
ScoreExample.Criteria criteria = scoreExample.createCriteria();
criteria.andScrIdEqualTo(score.getScrId());
return scoreMapper.updateByExampleSelective(score, scoreExample);
}
@Override
public List<Score> listScoreById(int id) {
ScoreExample scoreExample = new ScoreExample();
ScoreExample.Criteria criteria = scoreExample.createCriteria();
criteria.andScrIdEqualTo(Integer.valueOf(id));
List<Score> scoreList = scoreMapper.selectByExample(scoreExample);
return scoreList;
}
}
代码完成后需要注意的是,这里需要在mapper包下的每一个***Mapper文件加上@Mapper
注解,因为我这里用@Test注解测试,所以采用这种麻烦的方法,如果是用@Controller注解测试的话只在启动类上采用一个@MappeScan注解就行了。如下图:
好了,现在就可以尽情的debug和run代码了。
6.2 测试结果