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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 千百撸[通俗易懂]

    千百撸[通俗易懂]千百撸(黄网)

    2022年7月2日
    23
  • CSS3 opacity属性

    CSS3 opacity属性CSS3opacity属性记录设置一个div元素的透明度级别实现原理:opacity属性在实现的原理上极度类似于PS中的蒙版概念样式:div{opacity:0.5;}取值范围:0~1注意:IE8和早期版本支持另一种过滤器属性。像:filter:Alpha(opacity=50)属性说明默认值:1继承性:no(不继承)版本:CSS3属性:object.style.opacity问题1.如果父元素设置opacity属性,那么这个的所有子元素都

    2022年5月26日
    35
  • Linux网络抓包工具tcpdump[通俗易懂]

    Linux网络抓包工具tcpdump[通俗易懂]一、tcpdump介绍tcpdump是一个运行在命令行下的抓包工具。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。tcpdump适用于大多数的类Unix系统操作系统(如linux,BSD等)。二、安装&用法说明2.1、安装$yum-yinstalltcpdump2.2、用法说明tcpdump采用命令行方式,它的命令格式为tcpdump[-DenNqvX][-ccount][-Ffile][-iinterfac

    2022年8月22日
    4
  • sklearn.cross_validation找不到_找不到有效的openpgp数据

    sklearn.cross_validation找不到_找不到有效的openpgp数据解决Cesium1.50对gltf2.0/3dtiles数据读取的问题

    2022年4月21日
    28
  • 108是几位数_印度尼西亚总人口数

    108是几位数_印度尼西亚总人口数求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:17=24+2018=24+2120=24+22输入格式第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。输出格式只包含一个整数,表示满足条件的数的个数。数据范围1≤X≤Y≤231−1,1≤K≤20,2≤B≤10输入样例:15 2022输出样例:3#include<bit

    2022年8月9日
    0
  • ubuntu18.04超级简单的安装wine QQ教程

    第一步打开UbuntuSoftware,搜索wine第二步下载wine和Winetricks,并打开Winetricks(如图)ps:有可能会跳出一些提示框,直接点ok第三步选择安装一个windows应用,并选择qq安装ps:会下载安装包以及一些插件,可能不能一次成功,再进行一次相同的操作即可第四步安装QQ完成ps:这个Win…

    2022年4月6日
    259

发表回复

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

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