Mybatis逆向工程

  针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码

Maven导入依赖

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

    如果生成的路径中有相同的文件,那么就会覆盖原来的文件,这样会有风险。所以开发中一般都会新建一个java工程来生成

逆向工程配置文件

  mybatis逆向工程生成代码需要一个配置文件,然后mybatis会根据这个配置文件中的配置,生成相应的代码,generatorConfig.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>
    <context id="testTables" targetRuntime="Mybatis3">
        <commentGenerator>
            <!--是否自动生成注解-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="admin" password="admin">
        </jdbcConnection>
        <!--默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL和NUMERIC类型解析
            为java.math.BigDecimal-->
        <javaTypeResolver>
            <property name="forceBigdEcimals" value="false"/>
        </javaTypeResolver>
        <!--targetProject:生成的PO类的位置-->
        <javaModelGenerator targetPackage="mybatis.domain" targetProject=".\src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="mybatis.mapper" targetProject=".\src">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!--targetPackage:mapper接口生成的位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="mybatis.mapper" targetProject=".\src">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- 指定数据库表,要生成哪些表,就写哪些表,要和数据库中对应,不能写错! -->
        <table tableName="user"></table>
    </context>
</generatorConfiguration>
<?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>
            <!--是否自动生成注解-->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="admin" password="admin">
        </jdbcConnection>
        <!--默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL和NUMERIC类型解析
            为java.math.BigDecimal-->
        <javaTypeResolver>
            <property name="forceBigdEcimals" value="false"/>
        </javaTypeResolver>
        <!--targetProject:生成的PO类的位置-->
        <javaModelGenerator targetPackage="mybatis.domain" targetProject=".\src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="mybatis.mapper" targetProject=".\src">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!--targetPackage:mapper接口生成的位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="mybatis.mapper" targetProject=".\src">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- 指定数据库表,要生成哪些表,就写哪些表,要和数据库中对应 -->
        <table tableName="user"></table>
    </context>
</generatorConfiguration>

执行程序

package mybatis.reverse;

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 java.io.File;
import java.util.ArrayList;
import java.util.List;

public class GeneratorSqlmap {

    public void gernerator() throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite=true;
        File configFile = new File("generatorConfig.xml"); //这个是相对于工程目录
        ConfigurationParser configParse = new ConfigurationParser(warnings);
        Configuration config = configParse.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback,warnings);
        myBatisGenerator.generate(null);
    }

    public static void main(String[] args){
        GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
        try {
            generatorSqlmap.gernerator();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  多了一个东西,就是xxxExample.java

 @Test
    public void testUserByCriteria(){
        SqlSession sqlSession=null;
        try{
            sqlSession = SqlSessionFactoryUtil.openSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            UserExample userExample = new UserExample();
            UserExample.Criteria criteria = userExample.createCriteria();
            criteria.andUsernameEqualTo("jim");
            List<User> users = (List<User>) userMapper.selectByExample(userExample);
            System.out.println(users);
        }finally {
            if (sqlSession!=null)
                sqlSession.close();
        }
    }

测试

    @Test
    public void testUserByCriteria(){
        SqlSession sqlSession=null;
        try{
            sqlSession = SqlSessionFactoryUtil.openSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            UserExample userExample = new UserExample();
            UserExample.Criteria criteria = userExample.createCriteria();
            criteria.andUsernameEqualTo("jim");
            List<User> users = (List<User>) userMapper.selectByExample(userExample);
            System.out.println(users);
        }finally {
            if (sqlSession!=null)
                sqlSession.close();
        }
    }

     问题:在Maven进行测试时,出现Invalid bound statement (not found)?

  由于xml文件在编译的时候,不一定总能立即从源目录复制到class文件的编译目录,有时候源目录中的xml文件已经修改好,而class所在的目录里面还是旧的。因此真正确定有效的方式是将正确的xml文件复制到class输出目录。

  Jenkins通过maven把项目打成war包,或者Eclipse通过使用maven命令tomcat7:deploy远程自动部署项目打成的war包,war包里面缺少Mapper对应的xml文件,就是没有把xml文件打包进去。解决办法是,在pom.xml文件中的build标签中添加如下代码,显示的强制将xml文件打到war包中:

<build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
</build>

  

参考: 

  https://blog.csdn.net/eson_15/article/details/51694684

posted on 2018-11-08 23:25  溪水静幽  阅读(136)  评论(0)    收藏  举报