MyBatis快速入门第八讲——MyBatis逆向工程自动生成代码

2022-09-06 10:21:44 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

什么是逆向工程?

MyBatis一个主要的特点就是需要程序员自己编写SQL,那么如果表太多的话,难免会很麻烦,所以MyBatis官方提供了一个逆向工程,可以针对单表自动生成MyBatis执行所需要的代码(包括po类,mapper.xml映射文件和Mapper接口等)。一般在实际开发中,常用的逆向工程方式是通过数据库的表生成代码。

使用逆向工程

使用MyBatis的逆向工程,需要导入逆向工程的jar包,这里,笔者使用的是mybatis-generator-core-1.3.2.jar,下面开始总结一下MyBatis逆向工程的使用步骤。

新建一个Java工程(重要)

我们要新建一个Java工程,这个工程专门用于使用逆向工程生成代码。有些人可能会问,为什么要新建一个工程呢?直接在原来的工程中你想生成不就可以了么?确实是这样,可以在原来的工程中生成,但是有风险,因为MyBatis是根据配置文件来生成的(下面会说到),如果生成的路径中有相同的文件,那么就会覆盖原来的文件,这就是风险。所以开发中一般都会新建一个Java工程来生成,然后将生成的文件拷贝到自己的工程中,这也不麻烦,而且很安全。

从上图中可以清楚地看到:

  • ①就是要执行的Java代码,执行它即可生成我们需要的代码;
  • ②是执行过程中新建的包,这个包都可以在④的配置文件中指定,最好是跟我们自己项目的包名一致,后面就可以直接拷贝了,也就不需要修改包名了;
  • ③就是jar包咯;
  • ④是配置文件,下面我会对它详细分析。

读者如若需要MyBatis的逆向工程,即generatorSqlmapCustom,可点击 MyBatis的逆向工程——generatorSqlmapCustom 进行下载!

配置逆向工程的配置文件

MyBatis逆向工程生成代码需要有一个配置文件,名字随便起,例如generatorConfig.xml。然后MyBatis会根据这个配置文件中的配置,生成相应的代码。mybatis-generator-core-1.3.2.jar这个jar包里面有帮助文档,打开后里面有配置文件的模板,这里就不再赘述了,下面先把配置文件写好。

代码语言:javascript复制
<?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>
	<context id="testTables" targetRuntime="MyBatis3">
		<commentGenerator>
			<!-- 是否去除自动生成的注释 true:是 : false:否 -->
			<property name="suppressAllComments" value="true" />
		</commentGenerator>
		<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" password="liayun">
		</jdbcConnection>
		<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" userId="yycg" password="yycg"> </jdbcConnection> -->

		<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

		<!-- targetProject:生成PO类的位置 -->
		<javaModelGenerator targetPackage="com.meimeixia.ssm.po" targetProject=".src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
		<sqlMapGenerator targetPackage="com.meimeixia.ssm.mapper" targetProject=".src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>
		<!-- targetPackage:mapper接口生成的位置 -->
		<javaClientGenerator type="XMLMAPPER" targetPackage="com.meimeixia.ssm.mapper" targetProject=".src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>
		<!-- 指定数据库表 -->
		<table schema="" tableName="user"></table>
		<table schema="" tableName="order"></table>
		
		<!-- 有些表的字段需要指定java类型 <table schema="" tableName=""> <columnOverride column="" javaType="" /> </table> -->
	</context>
</generatorConfiguration>

从上面配置文件的内容中可以看出,配置文件主要做的几件事是:

  1. 连接数据库,这是必须的,要不然怎么根据数据库中的表生成相应的代码呢?
  2. 指定要生成代码的位置,要生成的代码包括po类,mapper.xml映射文件和Mapper接口;
  3. 指定数据库中想要生成哪些表。

执行逆向工程生成代码

配置文件搞好了,然后就可以执行以下程序来生成相应的代码了,生成的Java程序在下载的逆向工程文档中都有示例,下面我直接给出了一个这样的Java程序。

代码语言:javascript复制
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

public class GeneratorSqlmap { 
   

	public void generator() throws Exception{ 
   

		List<String> warnings = new ArrayList<String>();
		boolean overwrite = true;
		//指定逆向工程配置文件
		File configFile = new File("generatorConfig.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);

	} 
	public static void main(String[] args) throws Exception { 
   
		try { 
   
			GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
			generatorSqlmap.generator();
		} catch (Exception e) { 
   
			e.printStackTrace();
		}
		
	}

}

运行一下以上程序即可,运行完了后刷新一下工程,就可以看到最新生成的代码了。

这里可以看出有个细节,每个po类多了一个东西,就是XxxExample.java,这个类是给用户自定义SQL使用的,后面我会提到。到这里就生成好了,下面我们就要把生成的代码拷贝到自己的工程中使用了。

逆向工程测试

在这里我把上面生成的代码拷贝到上文《MyBatis快速入门第七讲——MyBatis整合Spring》的工程案例中,如下图所示。

接着在Spring核心配置文件(即applicationContext.xml)添加如下配置。

代码语言:javascript复制
<!-- 动态代理配置的第二种方式:配置包扫描器(推荐使用这种开发方式) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<!-- basePackage属性配置要扫描的包,多个包之间可用","进行分隔 -->
	<!-- <property name="basePackage" value="com.meimeixia.mybatis.mapper" /> -->
	<property name="basePackage" value="com.meimeixia.ssm.mapper" />
</bean>

最后,针对以上UserMapper接口编写一个UserMapperGTest单元测试类,该单元测试类处于工程中的如下图所示的位置。

以上单元测试类的内容如下所示:

代码语言:javascript复制
package com.meimeixia.mybatis.test;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.meimeixia.ssm.mapper.UserMapper;
import com.meimeixia.ssm.po.User;
import com.meimeixia.ssm.po.UserExample;
import com.meimeixia.ssm.po.UserExample.Criteria;

public class UserMapperGTest { 
   
	
	private ApplicationContext applicationContext;
	
	@Before
	public void init() { 
   
		applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
	}

	@Test
	public void testInsertSelective() { 
   
		UserMapper userMapper = applicationContext.getBean(UserMapper.class);
		User user = new User();
		user.setUsername("诸葛亮");
		user.setAddress("广州萝岗");
		user.setSex("1");
		userMapper.insertSelective(user);
	}

	@Test
	public void testSelectByExample() { 
   
		UserMapper userMapper = applicationContext.getBean(UserMapper.class);
		//UserExample类是用来拼装查询条件用的
		UserExample example = new UserExample();
		//创建一个Criteria对象(Criteria类是UserExample类里面的内部类,Criteria类是干什么用的呢?它是专门用于封装自定义查询条件的)
		Criteria criteria = example.createCriteria();
		//设置查询条件
		criteria.andUsernameLike("%范%");
		criteria.andSexEqualTo("2");
		//执行查询
		List<User> list = userMapper.selectByExample(example);
		for (User user : list) { 
   
			System.out.println(user);
		}
	}

	@Test
	public void testSelectByPrimaryKey() { 
   
		UserMapper userMapper = applicationContext.getBean(UserMapper.class);
		User user = userMapper.selectByPrimaryKey(30);
		System.out.println(user);
	}

	@Test
	public void testUpdateByPrimaryKeySelective() { 
   
		fail("Not yet implemented");
	}

}

可以看出,逆向工程生成的代码,基本上和之前使用的差不多,只不过它更规范一点,而且还多了自定义查询条件的Java类,用起来还是挺方便的。关于MyBatis的逆向工程就总结到这吧!

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/150747.html原文链接:https://javaforall.cn

0 人点赞