概述
所谓Mybatis逆向工程,就是Mybatis会根据我们设计好的数据表,自动生成pojo、mapper、mapper.xml以及example类(用于添加条件,相当where语句后面的部分),我们在开发的过程操作多个表,一个个去写pojo类就已经够麻烦了。通过Mybatis逆向工程可以把基本的配置自动完成,省了许多事,当然自动生成的代码通常与业务相差甚远,我基本用来生成pojo类,也可以都生成,根据自己需要进行选择。
Generator
MyBatis Generator(MBG)是MyBatis的代码生成器。它将为所有版本的MyBatis以及2.2.0之后的iBATIS版本生成代码。这将减少在设置对象、配置文件以及数据库表交互方面的麻烦。MBG寻求对数据库进行简单的CRUD(增,查,改,删)操作,但仍需要为连接查询或存储过程手动编写SQL和对象代码。简单来说,它会自动帮我们生成实体类、接口、SQL映射文件。
实现逆向工程
1、添加依赖
在pom.xml文件中添加Generator的依赖环境。
<dependencies>
<!-- MySQL依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 加入MyBatis 依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--mybatis自动生成jar包-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<!--配置相关的资源进行打包-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2、编写generator.xml
在main/java/resources下新建generator.xml。
需要使用本地的一个数据库连接包mysql-connector-java-5.1.0-bin.jar
,用于连接数据库通过数据库字段生成实体和简单的CRUD映射。
创建项目的目录结构,在main.java下创建如com.coydone.entity(实体类)、mapper(映射类)、utils(工具类)、ui(测试类)包结构。
<?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="D:\mysql-connector-java-5.1.0-bin.jar" />
<context id="Mysql2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"></property>
<property name="suppressAllComments" value="true"></property>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/testdb"
userId="root"
password="root123">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--指定生成实体所有在的包 targetProject如果为项目下的模块,要加上模块名-->
<javaModelGenerator targetPackage="com.coydone.entity" targetProject="day04_mybatis/src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--指定sql映射文件的位置-->
<sqlMapGenerator targetPackage="com.coydone.mapper" targetProject="day04_mybatis/src/main/java">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--指定接口存放的位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.coydone.mapper" targetProject="day04_mybatis/src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--添加需要反向工程的表 设置为true表示加入某个功能-->
<table tableName="grade" enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
</table>
<table tableName="student" enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="true" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
3、运行MybatisGeneratorUtil工具类
package com.coydone.utils;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class MybatisGeneratorUtil {
public static void main(String[] args) {
try {
System.out.println("start generator ...");
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//如果想对路径有问题,则使用generator.xml在硬盘上的绝对路径
//File configFile = new File(MybatisGeneratorUtil.class.getResource("/generator.xml").getFile());
File configFile = new File("E:\\javaSE\\idea\\Installation Path\\idea_workspace\\u3_ssm\\day04_mybatis\\src\\main\\resources\\generator.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
System.out.println("end generator!");
} catch (IOException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
} catch (InvalidConfigurationException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
实现效果
注意:逆向工程生成代码之后,这些逆向工程所需的依赖和工具类都可以进行删除,它只是帮助我们简化Mybatis开发,在项目运行时不需要。
测试
以学生类为例,我们可以看见,在StudentMapper.java中,它帮助我们生成了基本的CURD方法。
public interface StudentMapper {
int deleteByPrimaryKey(Integer xh);
int insert(Student record);
int insertSelective(Student record);
List<Student> selectByExample(StudentExample example);
Student selectByPrimaryKey(Integer xh);
int updateByPrimaryKeySelective(Student record);
int updateByPrimaryKey(Student record);
}
我们可以用逆向工程生成的StudentExample来做条件查询。调用StudentMapper中的selectByExample()
方法。
public class StudentTest {
StudentMapper studentMapper = MyBatisUtil.getSession().getMapper(StudentMapper.class);
//条件查询20-50岁
@Test
public void findAllByExample(){
StudentExample studentExample = new StudentExample();
StudentExample.Criteria criteria = studentExample.createCriteria();
StudentExample.Criteria ageBetween = criteria.andAgeBetween(new Byte("20"), new Byte("50"));
List<Student> students = studentMapper.selectByExample(studentExample);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (Student student : students) {
String birthday = sdf.format(student.getBirthday());
System.out.println(student);
System.out.println(birthday);
}
}
}
评论区