06、MyBatis 逆向工程

来源:https://www.cnblogs.com/CSAH/archive/2020/06/27/13152416.html
-Advertisement-
Play Games

1.MyBatis逆向簡介 mybatis需要程式員自己編寫sql語句,mybatis官方提供逆向工程,可以針對單表自動生成mybatis執行所需要的代碼(mapper.java、mapper.xml、pojo…),可以讓程式員將更多的精力放在繁雜的業務邏輯上。 1).generator下載 2). ...


1.MyBatis逆向簡介   mybatis需要程式員自己編寫sql語句,mybatis官方提供逆向工程,可以針對單表自動生成mybatis執行所需要的代碼(mapper.java、mapper.xml、pojo…),可以讓程式員將更多的精力放在繁雜的業務邏輯上。 1).generator下載 2).generator文檔 3).jar包
ehcache-core-2.6.8.jar log4j.jar mybatis-3.4.1.jar mybatis-ehcache-1.0.3.jar mybatis-generator-core-1.3.2.jar mysql-connector-java-5.1.37-bin.jar ojdbc6.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.2.jar
4).MBG使用步驟 (1).編寫MBG的配置文件(重要幾處配置) ①.jdbcConnection:配置資料庫連接信息 ②.javaModelGenerator:配置javaBean的生成策略 ③.sqlMapGenerator:配置sql映射文件生成策略 ④.javaClientGenerator:配置Mapper介面的生成策略 ⑤.table:配置要逆向解析的數據表;tableName:表名;domainObjectName:對應的javaBean名   (2).運行代碼生成器生成代碼 5).MBG註意 (1).targetRuntime=“MyBatis3“可以生成帶條件的增刪改查 (2).targetRuntime=“MyBatis3Simple“可以生成基本的增刪改查 (3).如果再次生成,建議將之前生成的數據刪除,避免xml向後追加內容出現的問題。 2.Generator 1).配置Generator http://mybatis.org/generator/configreference/xmlconfig.html (1).<context> <context>元素用於指定生成一組對象的環境。子元素用於指定要連接的資料庫,要生成的對象的類型以及要進行自檢的表。 參考文檔:http://mybatis.org/generator/configreference/context.html
	<!-- <context>元素用於指定生成一組對象的環境。子元素用於指定要連接的資料庫,要生成的對象的類型以及要進行自檢的表。 -->
	<!-- targetRuntime="MyBatis3Simple":生成簡單版的CRUD -->
	<!-- targetRuntime="MyBatis3":生成複雜版的CRUD -->
	<!-- id:此上下文的唯一標識符。該值將在某些錯誤消息中使用。 -->
	<context id="DB2Tables" targetRuntime="MyBatis3">
	</context>
    (2).jdbcConnection 該元素用於指定內省表所需的資料庫連接的屬性。MyBatis Generator使用JDBC的DatabaseMetaData類來發現您在配置中指定的表的屬性。每個<context>元素都需要一個<connectionFactory>或<jdbcConnection >元素。 參考文檔:http://mybatis.org/generator/configreference/jdbcConnection.html
	<!-- jdbcConnection:指定如何連接到目標資料庫 -->
	<!-- MyBatis Generator使用JDBC的DatabaseMetaData類來發現您在配置中指定的表的屬性。-->
	<!-- 每個<context>元素都需要一個<connectionFactory>或<jdbcConnection >元素。 -->
		<jdbcConnection	driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true" 
			userId="root" 
			password="root123">
		</jdbcConnection>

  

  (3).javaTypeResolver <javaTypeResolver>元素用於定義Java Type Resolver的屬性。Java類型解析器用於根據資料庫列信息計算Java類型。預設的Java Type Resolver嘗試通過儘可能替換Integral類型(Long,Integer,Short等)來使JDBC DECIMAL和NUMERIC類型更易於使用。如果這種行為是不希望的,請將屬性“ forceBigDecimals”設置為“ true”。如果您想要不同於預設行為的行為,也可以替換自己的實現。此元素是<context>元素的可選子元素。 參考文檔:http://mybatis.org/generator/configreference/javaTypeResolver.html
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

  

  (4).javaModelGenerator <javaModelGenerator>元素用於定義Java模型生成器的屬性。Java模型生成器將構建與自省表匹配的主鍵類,記錄類和“按示例查詢”類。此元素是<context>元素的必需子元素。 參考文檔:http://mybatis.org/generator/configreference/javaModelGenerator.html
		<!-- javaModelGenerator:指定javaBean的生成策略  -->
		<!-- targetProject:生成目標包名 -->
		<!-- targetProject:目標工程 -->
		<!-- http://mybatis.org/generator/configreference/javaModelGenerator.html -->
		<javaModelGenerator targetPackage="com.atguigu.mybatis.bean"
			targetProject=".\src">
			<property name="enableSubPackages" value="true" />
			<property name="trimStrings" value="true" />
		</javaModelGenerator>

  

  (5).sqlMapGenerator 該元素用於定義SQL映射生成器的屬性。SQL Map Generator為每個自省表構建MyBatis格式的SQL map XML文件。 僅當您選擇的javaClientGenerator需要XML時,此元素才是<context>元素的必需子元素。 基於MyBatis Dynamic SQL的運行時不會生成XML,並且如果指定了該元素,則會忽略該元素。 如果未指定javaClientGenerator,則適用以下規則:
  • 如果指定sqlMapGenerator,則MBG將僅生成SQL映射XML文件和模型類。
  • 如果您未指定sqlMapGenerator,則MBG將僅生成模型類。
參考文檔:http://mybatis.org/generator/configreference/sqlMapGenerator.html
		<!-- sqlMapGenerator:sql映射生成策略; -->
		<sqlMapGenerator targetPackage="com.atguigu.mybatis.dao"
			targetProject=".\conf">
			<property name="enableSubPackages" value="true" />
		</sqlMapGenerator>

  

  (6).javaClientGenerator 該元素用於定義Java客戶端生成器的屬性。 Java客戶端生成器構建Java介面和類,以方便使用所生成的Java模型和XML映射文件。對於MyBatis,生成的對象採用mapper介面的形式。 該元素是<context>元素的可選子元素。如果未指定此元素,則MyBatis Generator(MBG)將不會生成Java客戶端介面和類。 參考文檔:http://mybatis.org/generator/configreference/javaClientGenerator.html
		<!-- javaClientGenerator:指定mapper介面所在的位置 -->
		<!-- http://mybatis.org/generator/configreference/javaClientGenerator.html -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.atguigu.mybatis.dao" targetProject=".\src">
			<property name="enableSubPackages" value="true" />
		</javaClientGenerator>

  

  (7).table <table>元素用於選擇資料庫中用於自省的表。選定的表將導致為每個表生成以下對象:
  • MyBatis格式化的SQL Map文件
  • 構成表“模型”的一組類,包括:
  • 一個與表的主鍵匹配的類(如果表具有主鍵)。
  • 一個類,用於匹配表中不在主鍵中的欄位和非BLOB欄位。如果有,該類將擴展主鍵。
  • 一個用於保存表中任何BLOB欄位(如果有)的類。該類將擴展前兩個類之一,具體取決於表的配置。
  • 一個用於在不同的“按示例”方法(selectByExample,deleteByExample)中生成動態where子句的類。
  • (可選)MyBatis映射器界面
必須至少指定一個<table>元素作為<context>元素的必需子元素。您可以指定無限的表元素。
		<!-- 指定要逆向分析哪些表:根據表要創建javaBean -->
		<!-- http://mybatis.org/generator/configreference/table.html -->
    	<table tableName="tbl_dept" domainObjectName="Department"></table>
    	<table tableName="tbl_employee" domainObjectName="Employee"></table>

  

  2).運行Generator (1).選擇MBG運行方式 MyBatis Generator(MBG)可以通過以下方式運行 每種方法在鏈接頁面上都有詳細說明。 原版: 中文翻譯: (2).MBG XML運行方式 ①.生成所需文件XML|JAVA
	@Test
	public void testMbg() throws Exception {
		   List<String> warnings = new ArrayList<String>();
		   boolean overwrite = true;
		   File configFile = new File("mbg.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);
	}

  

  ②.獲取ID(在Simple情況下)
	@Test
	public void testSimple() throws IOException {
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			List<Employee> list = mapper.selectAll();
			for (Employee employee : list) {
				System.out.println(employee.getId());
			}
		}finally {
			openSession.close();
		}
	}

  

  ③.拼接查詢條件(在MyBatis3情況下)
	@Test
	public void testMyBatis3() throws IOException{
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession openSession = sqlSessionFactory.openSession();
		try{
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			//1.查詢所有ID
			List<Employee> emps = mapper.selectByExample(null);
//			for(Employee employee:emps) {
//				System.out.println(employee.getId());
//			}
			
			//2.查詢查詢員工名字中有e字母的和員工性別是1的 封裝員工查詢條件的example
			EmployeeExample example = new EmployeeExample();
			//創建一個Criteria,這個Criteria就是拼裝查詢條件;
			Criteria criteria = example.createCriteria();
			criteria.andLastNameLike("%e%");
			criteria.andGenderEqualTo("1");
			
			Criteria criteria2 = example.createCriteria();
			criteria2.andEmailLike("%e");
			example.or(criteria2);
			
			List<Employee> list = mapper.selectByExample(example);
			for(Employee employee:list) {
				System.out.println(employee.getId());
			}
			
		}finally{
			openSession.close();
		}
	}

  

  ④.完整Test代碼
package com.atguigu.mybatis.test;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import com.atguigu.mybatis.bean.Employee;
import com.atguigu.mybatis.bean.EmployeeExample;
import com.atguigu.mybatis.bean.EmployeeExample.Criteria;
import com.atguigu.mybatis.dao.EmployeeMapper;




class MyBatisTest {

	public SqlSessionFactory getSqlSessionFactory() throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		return new SqlSessionFactoryBuilder().build(inputStream);
	}
	 
	@Test
	public void testMbg() throws Exception {
		   List<String> warnings = new ArrayList<String>();
		   boolean overwrite = true;
		   File configFile = new File("mbg.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);
	}
	
//	@Test
//	public void testSimple() throws IOException {
//		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//		SqlSession openSession = sqlSessionFactory.openSession();
//		try {
//			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
//			List<Employee> list = mapper.selectAll();
//			for (Employee employee : list) {
//				System.out.println(employee.getId());
//			}
//		}finally {
//			openSession.close();
//		}
//	}
	
	@Test
	public void testMyBatis3() throws IOException{
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession openSession = sqlSessionFactory.openSession();
		try{
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			//1.查詢所有ID
			List<Employee> emps = mapper.selectByExample(null);
//			for(Employee employee:emps) {
//				System.out.println(employee.getId());
//			}
			
			//2.查詢查詢員工名字中有e字母的和員工性別是1的 封裝員工查詢條件的example
			EmployeeExample example = new EmployeeExample();
			//創建一個Criteria,這個Criteria就是拼裝查詢條件;
			Criteria criteria = example.createCriteria();
			criteria.andLastNameLike("%e%");
			criteria.andGenderEqualTo("1");
			
			Criteria criteria2 = example.createCriteria();
			criteria2.andEmailLike("%e");
			example.or(criteria2);
			
			List<Employee> list = mapper.selectByExample(example);
			for(Employee employee:list) {
				System.out.println(employee.getId());
			}
			
		}finally{
			openSession.close();
		}
	}
	
	
}

  

  參考文檔:https://github.com/mybatis/generator http://mybatis.org/generator/quickstart.html