MyBtis(七)逆向工程

逆向工程

MyBatis Generator
简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要我们手工编写。
官方文档地址
http://www.mybatis.org/generator/
官方工程地址
https://github.com/mybatis/generator/releases

MBG使用实操:
创建工程

  • 1、添加依赖
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.6</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.4.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.32</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.32</version>
        <scope>test</scope>
    </dependency>

</dependencies>
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory><!--所在的目录-->
            <includes><!--包括目录下的.properties,.xml文件都会扫描到-->
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>
  • 2、配置mybatis文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
		<setting name="jdbcTypeForNull" value="NULL"/>
		<!--显式的指定每个我们需要更改的配置的值,即使他是默认的。防止版本更新带来的问题  -->
		<setting name="cacheEnabled" value="true"/>
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
	</settings>
	<environments default="dev_mysql">
		<environment id="dev_mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/test?allowMultiQueries=true" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>
	<databaseIdProvider type="DB_VENDOR">
		<!-- 为不同的数据库厂商起别名 -->
		<property name="MySQL" value="mysql"/>
		<property name="Oracle" value="oracle"/>
		<property name="SQL Server" value="sqlserver"/>
	</databaseIdProvider>
	<mappers>
		<package name="com.xiaoqiu.dao"/>
	</mappers>
</configuration>
  • 3、编写MBG的配置文件(重要几处配置)
  • jdbcConnection配置数据库连接信息
  • javaModelGenerator配置javaBean的生成策略
  • sqlMapGenerator 配置sql映射文件生成策略
  • javaClientGenerator配置Mapper接口的生成策略
  • table 配置要逆向解析的数据表
     tableName:表名
     domainObjectName:对应的javaBean名

mbg.xml

<?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>

	<!-- 
		targetRuntime="MyBatis3Simple":生成简单版的CRUD
		MyBatis3:豪华版
	
	 -->
  <context id="DB2Tables" targetRuntime="MyBatis3">
  	<!-- jdbcConnection:指定如何连接到目标数据库 -->
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/test?allowMultiQueries=true"
        userId="root"
        password="123456">
    </jdbcConnection>

	<!-- java类型解析器 -->
    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

	<!-- javaModelGenerator:指定javaBean的生成策略 
	targetPackage="test.model":目标包名
	targetProject="\MBGTestProject\src":目标工程
	(如果运行后没有生成对应的文件,就把此路径改成绝对路径)
	-->
    <javaModelGenerator targetPackage="com.xiaoqiu.bean"
    		targetProject=".\src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

	<!-- sqlMapGenerator:sql映射生成策略: -->
    <sqlMapGenerator targetPackage="com.xiaoqiu.dao"
    	targetProject=".\src">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

	<!-- javaClientGenerator:指定mapper接口所在的位置 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.xiaoqiu.dao"
    	targetProject=".\src">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

	<!-- 指定要逆向分析哪些表:根据表要创建javaBean -->
    <table tableName="tbl_dept" domainObjectName="Department"></table>
    <table tableName="tbl_employee" domainObjectName="Employee"></table>
  </context>
</generatorConfiguration>

注意:
Context标签
targetRuntime=“MyBatis3“可以生成带条件的增删改查
targetRuntime=“MyBatis3Simple“可以生成基本的增删改查
如果再次生成,建议将之前生成的数据删除,避免xml向后追加内容出现的问题。

  • 4、运行代码生成器生成代码
public class MBGTest {
    public static void main(String[] args) {

        try {
            List<String> warnings = new ArrayList<String>();
            File configFile = new File("mbg.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(configFile);
            DefaultShellCallback callback = new DefaultShellCallback(true);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback, warnings);
            myBatisGenerator.generate(null);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

DEBUG 10-18 16:25:46,593 Retrieving column information for table "tbl_dept"  (Log4jImpl.java:46) 
DEBUG 10-18 16:25:46,744 Found column "id", data type 4, in table "test..tbl_dept"  (Log4jImpl.java:46) 
DEBUG 10-18 16:25:46,745 Found column "dept_name", data type 12, in table "test..tbl_dept"  (Log4jImpl.java:46) 
DEBUG 10-18 16:25:46,794 Retrieving column information for table "tbl_employee"  (Log4jImpl.java:46) 
DEBUG 10-18 16:25:46,828 Found column "id", data type 4, in table "test..tbl_employee"  (Log4jImpl.java:46) 
DEBUG 10-18 16:25:46,828 Found column "last_name", data type 12, in table "test..tbl_employee"  (Log4jImpl.java:46) 
DEBUG 10-18 16:25:46,828 Found column "gender", data type 1, in table "test..tbl_employee"  (Log4jImpl.java:46) 
DEBUG 10-18 16:25:46,829 Found column "email", data type 12, in table "test..tbl_employee"  (Log4jImpl.java:46) 
DEBUG 10-18 16:25:46,829 Found column "d_id", data type 4, in table "test..tbl_employee"  (Log4jImpl.java:46) 

Process finished with exit code 0

在这里插入图片描述

  • 5、测试生成的代码
    为了测试效果,给生成的Employee示例添加toString方法
@Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", lastName='" + lastName + '\'' +
                ", gender='" + gender + '\'' +
                ", email='" + email + '\'' +
                ", dId=" + dId +
                '}';
    }

测试代码1:

public class Test {
    public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        //查询所有
        List<Employee> employees = mapper.selectByExample(null);
        employees.forEach(System.out::println);

    }
    public static SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
}

运行结果:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Employee{id=1, lastName='张三', gender='1', email='zhangsan@qq.com', dId=1001}
Employee{id=2, lastName='tom', gender='1', email='tom002@qq.com', dId=1002}
Employee{id=3, lastName='jerry', gender='0', email='jerry@qq.com', dId=1003}
Employee{id=4, lastName='jeck', gender='1', email='jeck004@qq.com', dId=1004}
Employee{id=5, lastName='tom', gender='1', email='tom@qq.com', dId=1005}
Employee{id=7, lastName='lucy', gender='0', email='lucy@qq.com', dId=1001}
Employee{id=10, lastName='李四', gender='1', email='lisi@qq.com', dId=1002}
Employee{id=11, lastName='王五', gender='1', email='wangwu@qq.com', dId=1003}
Employee{id=12, lastName='妍丽', gender='0', email='yanli@qq.com', dId=1004}
Employee{id=13, lastName='静娈', gender='0', email='jingluan@qq.com', dId=1003}
Employee{id=14, lastName='上官思伯', gender='1', email='shangguansibo@qq.com', dId=1004}
Employee{id=15, lastName='式微', gender='0', email='shiwei@qq.com', dId=1003}
Employee{id=16, lastName='琼琚', gender='0', email='qiongju@qq.com', dId=1004}
Employee{id=17, lastName='维曦', gender='1', email='weixi@qq.com', dId=1004}
Employee{id=18, lastName='维曦', gender='1', email='weixi@qq.com', dId=1004}

Process finished with exit code 0

测试代码2:

public class Test {
    public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

        //xxxExample就是封装查询条件的
        EmployeeExample employeeExample = new EmployeeExample();
        //创建一个Criteria,这个Criteria就是拼装查询条件
        EmployeeExample.Criteria criteria = employeeExample.createCriteria();
        criteria.andLastNameLike("%j%");
        List<Employee> employees = mapper.selectByExample(employeeExample);
        employees.forEach(System.out::println);
    }
    public static SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
}

运行结果:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Employee{id=3, lastName='jerry', gender='0', email='jerry@qq.com', dId=1003}
Employee{id=4, lastName='jeck', gender='1', email='jeck004@qq.com', dId=1004}

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值