MyBatis Generator实战

MyBatis Generator介绍

MyBatis Generator (MBG) 是一个Mybatis的代码生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各个版本的代码,和iBATIS 2.2.0版本以后的代码。 他可以内省数据库的表(或多个表)然后生成可以用来访问(多个)表的基础对象。 这样和数据库表进行交互时不需要创建对象和配置文件。 MBG的解决了对数据库操作有最大影响的一些简单的CRUD(插入,查询,更新,删除)操作。 您仍然需要对联合查询和存储过程手写SQL和对象。

为什么要使用 MyBatis Generator

手动编写SQL Mappper的难题

  • 时间成本高,手动编写SQL Mappper非常繁琐,几个表基本就要写半天
  • 容易出错,且编译器检测不到,甚至运行很长一段时间才发现insert语句少写了一个字段

dalgen的不足(首先申明,我只用过dalgen一次,对dalgen了解并不深入)

  1. 工程中使用dalgen需要一个单独的子模块
  2. 生成的model对象位置不能自定义(都位于dao层),导致model层甚至common层需要依赖dao层
  3. 生成的代码中不能取到数据库中的注释(个人认为model层的注释尤为重要,比如属性type,如果没有注释谁也不知道1代表什么2代表什么)
  4. 在dalgen模板中需要写大量的SQL语句
  5. 重新执行dalgen命令会完全覆盖前一次生成的代码,使得dao层的代码等同于不可编辑
  6. 不能定义ResultMap
  7. 网上资料很少

MyBatis Generator的优势

  1. MyBatis官方发布,网上资料丰富
  2. 可配置性强;可拓展性强,支持插件
  3. 配置简单,只需要一个配置文件
  4. 功能强大,对于单表操作不需要额外写任何代码(包含分页、排序)
  5. insert、update语句会生成两套,全部更新和只更新非空字段
  6. select抽离大文本(BLOB)字段,可选择是否需要查询大文本字段,提供查询效率

MyBatis Generator实战

  1. 在dao层pom.xml中添加MBG Maven支持
<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generatorgroupId>
            <artifactId>mybatis-generator-maven-pluginartifactId>
            <version>1.3.5version>
            <dependencies>
                
                <dependency>
                    <groupId>mysqlgroupId>
                    <artifactId>mysql-connector-javaartifactId>
                    <version>5.1.34version>
                dependency>

            dependencies>
        plugin>
    plugins>
build>
  1. 在dao层resources下增加配置文件generatorConfig.xml。如果需要改配置文件名字或者位置,需要pom.xml中配置



<generatorConfiguration>

    <context id="DB2Tables" targetRuntime="MyBatis3"  defaultModelType="flat">

        
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin">plugin>

        <commentGenerator>
            
            <property name="addRemarkComments" value="true"/>
            
            <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
        commentGenerator>
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://database_ip:3306/database_name?useUnicode=true&characterEncoding=utf-8"
                        userId="username"
                        password="pwd">
        jdbcConnection>

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

        
        <javaModelGenerator targetPackage="test.mybatis.generator.model" targetProject="../generator-model/src/main/java">
            <property name="enableSubPackages" value="true" />
        javaModelGenerator>

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

        
        <javaClientGenerator type="XMLMAPPER" targetPackage="test.mybatis.generator.dao"  targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        javaClientGenerator>

        
        <table tableName="jeehe_project" domainObjectName="ProjectDO">
            <property name="rootClass" value="com.tuan.core.common.lang.TuanBaseDO"/>
        table>

        <table tableName="jeehe_app" domainObjectName="AppDO" >
            <property name="rootClass" value="com.tuan.core.common.lang.TuanBaseDO"/>
        table>

    context>
generatorConfiguration>
  1. 修改dao-env-bean.xml,修改和增加以下两个bean,DAO对象不再需要注入

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:mybatis/mapping/*.xml" />
bean>


<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="test.mybatis.generator.dao" />
bean>
  1. Java调用示例
package test.mybatis.generator.service.impl;

import com.tuan.core.common.template.AbstractService;
import com.tuan.core.common.template.AbstractTemplateAction;
import com.tuan.core.common.template.CallResult;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import test.mybatis.generator.dao.AppDOMapper;
import test.mybatis.generator.model.AppDO;
import test.mybatis.generator.model.AppDOExample;
import test.mybatis.generator.service.AppService;

import java.util.List;


/**
 * @author yanghaibo
 */
@Service
public class AppServiceImpl extends AbstractService implements AppService {

    @Autowired
    AppDOMapper appDOMapper;

    @Override
    public int getAppCount(AppDO app) {
        AppDOExample example = new AppDOExample();
        example.createCriteria();
        return (int) appDOMapper.countByExample(example);
    }

    @Override
    public AppDO getAppById(final int id) {
        CallResult callResult = serviceTemplate.exeOnMaster(new AbstractTemplateAction() {

            @Override
            public CallResult doAction() {
                try {
                    AppDO appDO = appDOMapper.selectByPrimaryKey(id);
                    return CallResult.success(appDO);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return CallResult.failure();
            }
        });
        return callResult.getResultObject();
    }

    @Override
    public AppDO getAppByApplyId(long applyId) {
        final AppDOExample example = new AppDOExample();
        example.createCriteria().andApplyIdEqualTo(applyId);
        CallResult callResult = serviceTemplate.exeOnMaster(new AbstractTemplateAction() {

            @Override
            public CallResult doAction() {
                try {
                    List appDOs = appDOMapper.selectByExample(example);
                    if (appDOs != null && !appDOs.isEmpty())
                        return CallResult.success(appDOs.get(0));
                    return CallResult.success();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return CallResult.failure();
            }
        });
        return callResult.getResultObject();
    }

    @Override
    public List selectByPage(int pageNo, int pageSize) {
        final AppDOExample example = new AppDOExample();
        final RowBounds rowBounds = new RowBounds((pageNo - 1) * pageSize, pageSize);
        CallResult> callResult = serviceTemplate.exeOnMaster(new AbstractTemplateAction>() {

            @Override
            public CallResult> doAction() {
                try {
                    List appDOs = appDOMapper.selectByExampleWithBLOBsWithRowbounds(example, rowBounds);
                    return CallResult.success(appDOs);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return CallResult.failure();
            }
        });
        return callResult.getResultObject();
    }
}

工程集成MBG后少写哪些代码

  1. 数据库DO对象、SQL Mapper、DAO层实现
  2. 数据库查询对象。我们经常会根据多个字段的条件组合去查询数据库,为了提高代码的可阅读性和美观性,会把这些字段写到一个QueryVO类中。使用MBG之后,MBG会生成一个Example对象,支持对DO对象中所有字段的动态条件:= < > <> like in not-in
  3. 不再需要写sqlMapConfig.xml配置文件
  4. 不再需要手动写DAO层bean

Maven 支持

  1. 进入dao层
  2. 执行 mvn mybatis-generator:generate
  3. 如果已经存在相同文件,MBG不会覆盖当前文件,而是生成新的备份文件如AppDO.java.1
  4. 强制覆盖相同文件执行 mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate

参考文档

  1. MyBatis Generator: http://www.mybatis.org/generator/configreference/xmlconfig.html
  2. MyBatis Spring: http://www.mybatis.org/spring/zh/mappers.html
  3. example语法说明:http://mbg.cndocs.tk/generatedobjects/exampleClassUsage.html

你可能感兴趣的:(系统集成)