猿蜕变19——一文掌握代码自动生成
看过之前的蜕变系列文章,相信你对SpringMVC 、Spring、 Mybatis的整合有了一定的心得,学会了搭建属于自己的开发框架,也了解了如何使用整合后的框架进行开发。今天,我们为了解决你在开发中的体力劳动以及编写sql出错的概率,让你从入门到放弃,教你使用一个工具——mybatis generator。
我们之前使用mybatis时,需要人工编写dao层,bean,mapper配置文件,在一些简单的场景下,这些操作有一些套路化的问题,比如单表操作的基于字段的新增、修改、删除、查找等简单工作会显得比较繁琐,这类代码也比较固定。mybatis提供了帮助开发者解决这些繁琐的问题,提供了一个工具——mybatisgenerator用于生成相关的mapper文件、并且生成增删改查相关的sql语句的功能。
不过对于核心业务的工作流程,我们还是要很小心的把流程控制在sql层面,这个帮助就不是很大了,核心的业务用它上层一个bug,数据出问题,真心伤不起。生产的代码也算不上规范,也有一些冗余吧,后续工厂君会根据某些代码规范搞一套代码生成器来帮助大家。
在没有自己定义的代码生成器前,不过这玩意儿有一个比较好的作用就是,能够生成一些代码,和公共的可以利用的sql,而这些字段如果手动编写,容易出错,选择使用它来做半自动化开发,还是阔以的……
mybatis-generator的使用方式有很多种,由于我们使用maven进行应用开发,这里我们就以maven为例进行介绍。
第一步
首先要在maven项目中添加依赖,当然你得确保在你的maven中已经添加了mybatis相关的其他依赖jar包:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
</dependency>
第二步
添加generator的插件:
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<executions>
<execution>
<id>Generate MyBatisArtifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
<configuration>
<!--配置文件的路径-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
</plugin>
第三步
在resources目录中创建一个generatorConfig.xml逆向工程的配置文件:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--如果不需要生成example的话将targetRuntime设置为MyBatis3Simple即可-->
<context id="test" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 生成的注释是否包含生成的时间,一般设置为true,不生成时间 -->
<property name="suppressDate" value="true" />
<!-- 是否去除自动生成的注释 true:是 :false:否-->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/route"userId="root"
password="123456">
</jdbcConnection>
<javaTypeResolver>
<!-- 是否将数据库中的decimal类型转换为java的BigDecimal类型-->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置 -->
<javaModelGenerator targetPackage="com.pz.domain"
targetProject="srcmainjava">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成映射文件的包名和位置 -->
<sqlMapGenerator targetPackage="com.pz.dao"
targetProject="srcmainjava">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.pz.dao"
targetProject="srcmainjava">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成哪些表 注意后面的属性,如果不需要Example查询工具类 将这几个属性设置为false即可,
如果有多张表,复制粘贴即可-->
<table tableName="travel_route"domainObjectName="TravelRoute"
enableCountByExample="true"
enableUpdateByExample="true"
enableDeleteByExample="true"
enableSelectByExample="true"
selectByExampleQueryId="true">
</table>
</context>
</generatorConfiguration>
第四步
添加完毕之后,在idea的maven中执行下面命令mybatis-generator:generate,即可:如果成功了,在你指定的目录中可以看到dao、bean、mapper全部生成了。
注意噢:mybatis generator 只会根据单表来生成文件,并不会生成表之间的关系,假如Mapper文件已经存在时,如果进行重新生成mapper文件时,内容不被覆盖而是进行内容追加,结果导致mybatis解析失败。 解决方法:删除原来已经生成的mapper文件之后再进行生成。Mybatis自动生成的bean及dao文件不是内容而是直接覆盖没有此问题。
Example类的用法
我们使用mybatis generator生成的文件中有一个TravelRouteExample类,该类的作用就是帮我们实现多条件的查询,比如,根据id查询线路我们可以像下面这样编写代码:
public TravelRoute findUserById(int id) {
TravelRoute.Criteria criteria =example.createCriteria();
criteria.andIdEqualTo(id);
List< TravelRoute > routes = travelRouteDao.selectByExample(example);
if (routes!= null){
return routes.get(0);
}else{
return null;
}
}
- 【课堂笔记】先行者 3.0版本的vueJs课程的第三次课
- ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
- 【课堂笔记】先行者 3.0版本的vueJs课程的第二次课
- 用Python做证券指数的三种策略分析
- 明确告诉你,眼界不够,JS再好也成不了好前端
- 手把手教你整合最优雅的SSM框架
- WCF后续之旅(9):通过WCF的双向通信实现Session管理[上篇]
- 周末小贴士之“什么是语法糖”?有啥意义?
- Java反射机制深入详解
- 由for V.S. for each想到的
- 日调度5万亿次,腾讯云微服务架构体系TSF深度解读
- sed的粉丝
- 在Managed Code通过Google Gmail发送邮件以及如何通过Outlook配置Gmail
- 平方根的C语言实现(一) —— 浮点数的存储
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- (译)SDL编程入门(2)在屏幕上显示图像
- 【Vue进阶】手把手教你在 Vue 中使用 JSX
- (译)SDL编程入门(1)Hello SDL
- Django使用Channels实现websocket
- (译)SDL编程入门(6)扩展库SDL_image
- 牛客网剑指offer-2
- 牛客网剑指offer-1
- (译)SDL编程入门(5)Surface 优化和软拉伸
- (译)SDL编程入门(4)按键操作
- webpack实战——生产环境配置【中】
- MongoDB权威指南学习笔记(1)--基础知识与对文档的增删改查
- 利用 Shell 脚本实现邮件监控 Linux 系统的内存
- MongoDB权威指南学习笔记(4)--应用管理和服务器管理
- MongoDB权威指南学习笔记(3)--复制和分片
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?