逆向工程

逆向工程是mybatis官方为我们提供的一个特别方便的技术

所谓有逆向就有正向,什么是正向呢?

我们根据一个数据表  ---->   创建对应的javaBean类   ----->  创建Mapper接口操作数据表    ----->   创建xml

这个过程就是一个正向的操作过程,而逆向就是根据这张数据表,mybatis可以逆向的分析数据表,根据数据表创建对应的javaBean类,以及Mapper接口跟xml文件

Mybatis Generator,简称MBG,是一个专门为Mybatis框架使用者定制的代码生成器

使用

要使用首先得导包

如果使用maven可以如下导入依赖

<!-- 导入mybatis generator相关依赖 -->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.7</version>
</dependency>

配置

接下来就是书写配置文件了

编写配置文件需要以下几个属性:

  • jdbcConnection:这个属性是配置要连接的数据库的相关属性的,有username、password、url、classDriver
  • javaModelGenerator:指定实体类的生成策略,位置信息等

  • sqlMapGenerator:定义sql映射文件的生成规则,位置信息等

  • javaClientGenerator:定义Mapper接口生成策略

  • table:定义要逆向分析的表,以及生成的实体类名

配置文件的编写如下

<?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="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password="123">
        </jdbcConnection>

        <javaTypeResolver >
            <!-- forceBigDecimals:是否强制转换BigDecimal -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <javaModelGenerator targetPackage="main.java.com.jx.mbg.bean" targetProject=".\src">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="main.resources.mybatis"  targetProject=".\src">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="main.java.com.jx.mbg.mapper"  targetProject=".\src">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <table tableName="tb1_dept" domainObjectName="Department"></table>
        <table tableName="tb1_employee" domainObjectName="Employee"></table>

    </context>
</generatorConfiguration>

下面对配置文件中出现的一些标签进行解释

context: 指定mybatis的代码生成器的环境

  id:必须属性,给这个context一个唯一标识

  targetRuntime:此属性用于指定生成代码的运行时目标, MyBatis3Simple:生成简单的CRUD(不带有if这些动态标签)MyBatis3:可以生成带动态where标签的CRUD

jdbcConnection:指定如何连接到目标数据库

  driverClass: 指定数据库驱动,com.mysql.jdbc.Driver

  connectionURL:数据库连接地址,即jdbc:mysql://localhost:3306/database

  uerId:数据库用户名

  password:数据库密码 

javaTypeResolver:使用什么样的java类型解析器

例:

<javaTypeResolver >

    <!-- forceBigDecimals:是否强制转换BigDecimal -->

    <property name="forceBigDecimals" value="false" />

</javaTypeResolver> 

javaModelGenerator:指定javaBean的生形成策略

  targetPackage:目标的包名,即javaBean生成的表名

  targetProject:目标工程, .\src:当前工程的src

sqlMapGeneratorsql映射生成策略

  targetPackage:映射文件的生成目录

  targetProject:目标工程, .\conf:当前工程的config

javaClientGenerator:指定Mapper接口所在位置

  targetPackage:接口生成的包名

  targetProject:目标工程, .\src:当前工程的src

table:指定要逆向分析哪些表,根据表创建javaBean

  tableName:指定要分析表的名字

  domainObjectName:指定要生成对象的名字

例:

<table tableName="tb1_dept" domainObjectName="Department"></table>

<table tableName="tb1_emp" domainObjectName="Employee"></table>

运行

在写好配置文件后,就可以将MBG跑起来逆向生成了

执行下面的代码即可:

@Test
public void test() 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);
}

使用复杂类型查询

我们在书写配置文件的时候会给contexttargetRuntime设置值,这个属性表示我们要生成怎样的查询语句,使用MyBatis3Simple只会生成简单的CRUD,但是如果使用MyBatis3则会生成复杂的带动态标签的CRUD,使用MyBatis3生成bean时还会生成对应的Example

这种Example类是用于封装查询条件的

例如:

现在要查询员工中名字有e字母的,和员工性别是1的数据

@Test
public void test2() throws IOException {
    String configPath = "mybatis/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(configPath);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession(true);
    try {
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        // 查询员工中名字有e字母的,和员工性别是1的
        // 封装查询条件的example
        EmployeeExample employeeExample = new EmployeeExample();
        // 创建Creteria, 这个Criteria就是瓶装查询条件的
        EmployeeExample.Criteria criteria = employeeExample.createCriteria();
        criteria.andLastNameLike("%e%");
        criteria.andGenderEqualTo("1");
        
	 List<Employee> employees = mapper.selectByExample(employeeExample);
        employees.forEach((e) -> System.out.printf("%d %s %s,", e.getdId(), e.getGender(), e.getLastName()));
    } finally {
        session.close();
    }
}

现在有一个问题,如果在SQL查询中想要表达或的关系应该怎样做?

例如:现在要查询员工中名字有e字母的,和员工性别是1的,或者是email中带有1

在表达或的时候,并不能使用criteria.orxxx(),如果要表达或的关系,应该再创建一个criteria,然后用example.or()将新创建的criteria或进去即可

@Test
public void test2() throws IOException {
    String configPath = "mybatis/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(configPath);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession(true);
    try {
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        // 查询员工中名字有e字母的,和员工性别是1的
        // 封装查询条件的example
        EmployeeExample employeeExample = new EmployeeExample();
        // 创建Creteria, 这个Criteria就是瓶装查询条件的
        EmployeeExample.Criteria criteria = employeeExample.createCriteria();
        criteria.andLastNameLike("%e%");
        criteria.andGenderEqualTo("1");
        // 如果想要表达或的关系,可以使用两个Criteria,两个Criteria之间就是或的关系
        EmployeeExample.Criteria criteria1 = employeeExample.createCriteria();
        criteria1.andEmailLike("%1%");
        employeeExample.or(criteria1);      // 将新创建的criteria1或进去即可
        List<Employee> employees = mapper.selectByExample(employeeExample);
        employees.forEach((e) -> System.out.printf("%d %s %s,", e.getdId(), e.getGender(), e.getLastName()));
    } finally {
        session.close();
    }
}

 

posted @ 2018-11-11 19:10  Jin同学  阅读(282)  评论(0)    收藏  举报