MyBatis Generator实战
来源:互联网 发布:gtaol美女捏脸数据 编辑:程序博客网 时间:2024/06/18 11:55
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了解并不深入)
- 工程中使用dalgen需要一个单独的子模块
- 生成的model对象位置不能自定义(都位于dao层),导致model层甚至common层需要依赖dao层
- 生成的代码中不能取到数据库中的注释(个人认为model层的注释尤为重要,比如属性type,如果没有注释谁也不知道1代表什么2代表什么)
- 在dalgen模板中需要写大量的SQL语句
- 重新执行dalgen命令会完全覆盖前一次生成的代码,使得dao层的代码等同于不可编辑
- 不能定义ResultMap
- 网上资料很少
MyBatis Generator的优势
- MyBatis官方发布,网上资料丰富
- 可配置性强;可拓展性强,支持插件
- 配置简单,只需要一个配置文件
- 功能强大,对于单表操作不需要额外写任何代码(包含分页、排序)
- insert、update语句会生成两套,全部更新和只更新非空字段
- select抽离大文本(BLOB)字段,可选择是否需要查询大文本字段,提供查询效率
MyBatis Generator实战
- 在dao层pom.xml中添加MBG Maven支持
<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.5</version> <dependencies> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> </dependencies> </plugin> </plugins></build>
- 在dao层resources下增加配置文件generatorConfig.xml。如果需要改配置文件名字或者位置,需要pom.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="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> <!--model DO对象--> <javaModelGenerator targetPackage="test.mybatis.generator.model" targetProject="../generator-model/src/main/java"> <property name="enableSubPackages" value="true" /> </javaModelGenerator> <!--SQL Mapper--> <sqlMapGenerator targetPackage="mybatis/mapping" targetProject="src/main/resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!--dao java代码--> <javaClientGenerator type="XMLMAPPER" targetPackage="test.mybatis.generator.dao" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!--表名和Java对象名,支持父类--> <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>
- 修改dao-env-bean.xml,修改和增加以下两个bean,DAO对象不再需要注入
<!-- mybatis config --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:mybatis/mapping/*.xml" /></bean><!--自动注入Mapper--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="test.mybatis.generator.dao" /></bean>
- 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 */@Servicepublic 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<AppDO> callResult = serviceTemplate.exeOnMaster(new AbstractTemplateAction<AppDO>() { @Override public CallResult<AppDO> 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<AppDO> callResult = serviceTemplate.exeOnMaster(new AbstractTemplateAction<AppDO>() { @Override public CallResult<AppDO> doAction() { try { List<AppDO> 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<AppDO> selectByPage(int pageNo, int pageSize) { final AppDOExample example = new AppDOExample(); final RowBounds rowBounds = new RowBounds((pageNo - 1) * pageSize, pageSize); CallResult<List<AppDO>> callResult = serviceTemplate.exeOnMaster(new AbstractTemplateAction<List<AppDO>>() { @Override public CallResult<List<AppDO>> doAction() { try { List<AppDO> appDOs = appDOMapper.selectByExampleWithBLOBsWithRowbounds(example, rowBounds); return CallResult.success(appDOs); } catch (Exception e) { e.printStackTrace(); } return CallResult.failure(); } }); return callResult.getResultObject(); }}
工程集成MBG后少写哪些代码
- 数据库DO对象、SQL Mapper、DAO层实现
- 数据库查询对象。我们经常会根据多个字段的条件组合去查询数据库,为了提高代码的可阅读性和美观性,会把这些字段写到一个QueryVO类中。使用MBG之后,MBG会生成一个Example对象,支持对DO对象中所有字段的动态条件:= < > <> like in not-in
- 不再需要写sqlMapConfig.xml配置文件
- 不再需要手动写DAO层bean
Maven 支持
- 进入dao层
- 执行 mvn mybatis-generator:generate
- 如果已经存在相同文件,MBG不会覆盖当前文件,而是生成新的备份文件如AppDO.java.1
- 强制覆盖相同文件执行 mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
参考文档
- MyBatis Generator: http://www.mybatis.org/generator/configreference/xmlconfig.html
- MyBatis Spring: http://www.mybatis.org/spring/zh/mappers.html
- example语法说明:http://mbg.cndocs.tk/generatedobjects/exampleClassUsage.html
0 0
- MyBatis Generator实战
- MyBatis Generator实战
- 【实战】4-9 Mybatis三剑客之Mybatis-generator
- Mybatis generator
- Mybatis generator
- mybatis generator
- mybatis-generator
- MYBATIS Generator
- MyBatis Generator
- Mybatis-Generator
- mybatis generator
- Mybatis-Generator
- mybatis generator
- mybatis-generator
- mybatis-generator
- MyBatis Generator
- mybatis-generator
- mybatis-generator
- 使用VLC回放视频,libvlc_video_take_snapshot无法截图的解决方案
- 不曾见过的Python函数——zip()
- JAVA – 虚函数、抽象函数、抽象类、接口
- 团队沟通利器之UML—— 序列图
- 团队沟通利器之UML——类图
- MyBatis Generator实战
- 玩玩小爬虫——入门
- 深入浅出设计模式之装饰者模式、工厂模式
- ItextPdf 数字签名,HTML转PDF功能
- 玩玩小爬虫——试搭小架构
- jsp九大内置对象
- 陆奇是谁?
- 玩玩小爬虫——抓取动态页面
- 【Java】递归