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

MyBatis快速入门第八讲——MyBatis逆向工程自动生成代码MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码什么是逆向工程MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。使用逆向工程

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

什么是逆向工程?

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包里面有帮助文档,打开后里面有配置文件的模板,这里就不再赘述了,下面先把配置文件写好。

<?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程序。

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)添加如下配置。

<!-- 动态代理配置的第二种方式:配置包扫描器(推荐使用这种开发方式) -->
<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单元测试类,该单元测试类处于工程中的如下图所示的位置。
在这里插入图片描述
以上单元测试类的内容如下所示:

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.net/150747.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 英语考研词汇[通俗易懂]

    英语考研词汇[通俗易懂]1.WithmyownearsIclearlyheardtheheartbeatofthenuclearbomb.我亲耳清楚地听到原子弹的心脏的跳动。2.Nextyearthebeardedbearwillbearadearbabyintherear.明年,长胡子的熊将在后方产一头可爱的小崽.3.EarlyIsearchedt

    2022年5月12日
    41
  • matlab 二次函数图像「建议收藏」

    matlab 二次函数图像「建议收藏」二次函数图像clc,clear;holdonforx=-2:0.01:2y=x^2;plot(x,y,’c.’);end

    2025年9月25日
    7
  • 网络信息安全——访问控制「建议收藏」

    网络信息安全——访问控制「建议收藏」**访问控制**访问控制是给出一套方法,将系统中的所有功能标识出来,组织起来,托管起来,将所有的数据组织起来标识出来托管起来,然后提供一个简单的唯一的接口,这个接口的一端是应用系统一端是权限引擎。权限引擎所回答的只是:谁是否对某资源具有实施某个动作(运动、计算)的权限。返回的结果只有:有、没有、权限引擎异常了。访问控制是几乎所有系统(包括计算机系统和非计算机系统)都需要用到的一种技术。访问控制是按用户身份及其所归属的某项定义组来限制用户对某些信息项的访问,或限制对某些控制功能的使用的一种技术。

    2022年7月23日
    14
  • java判断一个数是否为质数的代码_逻辑代数最小项

    java判断一个数是否为质数的代码_逻辑代数最小项给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问数列中第 l∼r 个数的和。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一行。数据范围1≤N,M≤105,|d|≤10000,|A[i]|≤1

    2022年8月10日
    5
  • java单例指令重排_java实现数组去重

    java单例指令重排_java实现数组去重java指令重排案例。

    2022年10月17日
    3
  • 下列那个类有获取PropertyDescriptor实例的方法_java反射怎么理解

    下列那个类有获取PropertyDescriptor实例的方法_java反射怎么理解JAVA中反射机制(JavaBean的内省与BeanUtils库)内省(Introspector)是Java语言对JavaBean类属性、事件的一种缺省处理方法。  JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(ValueOb…

    2022年10月1日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号