zoukankan      html  css  js  c++  java
  • Mybatis学习笔记(九) —— Mybatis逆向工程

    一、什么是Mybatis逆向工程?

      简单的解释就是通过数据库中的单表,自动生成java代码

      我们平时在使用Mabatis框架进行Web应用开发的过程中,需要根据数据库表编写对应的Pojo类和Mapper映射文件,而这个过程重复单一且浪费时间。基于此,MyBatis官方为了让开发者更加方便快捷地使用MYBatis框架而不必编写繁琐的Pojo类以及Mapper文件,提供了一个十分简洁的逆向工程的工具。

      Mybatis官方提供了逆向工程,可以针对数据库的表自动生成对应的mybatis代码(mapper.javamapper.xmlpojo类)有了这个工具可以大大简化我们持久层代码的编写,和写代码过程中出错的概率。

    二、逆向工程的下载

      https://github.com/mybatis/generator/releases/tag/mybatis-generator-1.3.2

      下载完后,先将逆向工程复制到工作空间中

        

      然后再导入到eclipse中:

        

        

        

    三、Mybatis逆向工程的使用步骤

      第一步:在generatorConfig.xml中配置Mapper生成的详细信息

          

      注意修改以下几点:

      1. 修改要生成的数据库表
      2. pojo文件所在包路径
      3. Mapper所在的包路径
    <?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/e3mall" userId="root"
                password="123">
            </jdbcConnection>
            <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
                NUMERIC 类型解析为java.math.BigDecimal -->
            <javaTypeResolver>
                <property name="forceBigDecimals" value="false" />
            </javaTypeResolver>
    
            <!-- targetProject:生成PO类的位置 -->
            <javaModelGenerator targetPackage="cn.itcast.mybatis.pojo"
                targetProject=".src">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false" />
                <!-- 从数据库返回的值被清理前后的空格 -->
                <property name="trimStrings" value="true" />
            </javaModelGenerator>
            <!-- targetProject:mapper映射文件生成的位置 -->
            <sqlMapGenerator targetPackage="cn.itcast.mybatis.mapper" 
                targetProject=".src">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false" />
            </sqlMapGenerator>
            <!-- targetPackage:mapper接口生成的位置 -->
            <javaClientGenerator type="XMLMAPPER"
                targetPackage="cn.itcast.mybatis.mapper" 
                targetProject=".src">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false" />
            </javaClientGenerator>
            <!-- 指定数据库表 -->
            <table schema="" tableName="user"></table>
            <table schema="" tableName="order"></table>
        </context>
    </generatorConfiguration>

       第二步:生成逆向工程代码

      找到下图所示的java文件,执行工程main主函数

      

      

      刷新工程,发现代码生成:

      

      注意:Mapper映射文件已经存在时,如果重新生成mapper.xml文件,内容不被覆盖而是进行内容追加,结果导致mybatis解析失败。故需要重新生成代码时,先删除原来已经生成的mapper xml文件再进行生成。Mybatis自动生成的pojo类及对应的mapper.java文件不是内容而是直接覆盖没有此问题。

    四、测试逆向工程代码

      第一步:将生成的代码复制到mybatis-spring工程中

          

      第二步:在applicationContext.xml修改spring配置文件

        <!-- Mapper代理的方式开发方式,扫描包方式配置代理 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 配置mapper接口 -->
            <property name="basePackage" value="cn.itcast.mybatis.mapper"/>
        </bean>

      第三步:编写测试方法:

    public class UserMapperTest {
    
        private ApplicationContext context;
        
        @Before
        public void setUp() throws Exception {
            context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        }
    
        @Test
        public void testInsert() {
            // 获取Mapper
            UserMapper userMapper = this.context.getBean(UserMapper.class);
            User user = new User();
            user.setUsername("曹操");
            user.setAddress("魏国");
            user.setSex("男");
            
            userMapper.insert(user);
        }
    
        @Test
        public void testSelectByExample() {
            // 获取Mapper
            UserMapper userMapper = this.context.getBean(UserMapper.class);
            
            // 创建User对象扩展类,用户设置查询条件
            UserExample example = new UserExample();
            Criteria criteria = example.createCriteria();
            criteria.andUsernameLike("%张%");
            
            // 查询数据
            List<User> list = userMapper.selectByExample(example);
            for (User user : list) {
                System.out.println(user);
            }
            
        }
    
        @Test
        public void testSelectByPrimaryKey() {
            // 获取Mapper
            UserMapper userMapper = this.context.getBean(UserMapper.class);
            User user = userMapper.selectByPrimaryKey(1);
            System.out.println(user);
        }
    
    }

    参考文章:https://blog.csdn.net/lisongjia123/article/details/51244029

  • 相关阅读:
    [转] 在安卓设备上使用 Chrome 远程调试功能
    如何在移动设备上调试网页
    [转] 函数式编程初探
    如何简单区分Web前后端与MVC
    [转] 钉钉的H5性能优化方案
    js 数组赋值问题 :值传递还是引用?
    (转载)How browsers work--Behind the scenes of modern web browsers (前端必读)
    [转] React 最佳实践——那些 React 没告诉你但很重要的事
    RAII惯用法详解
    [2] 智能指针
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10203322.html
Copyright © 2011-2022 走看看