开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):Mybatis 逆向工程使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/703/detail/12411
Mybatis 逆向工程使用
内容介绍:
一、Mybatis 逆向工程使用
二、小结
一、Mybatis 逆向工程使用
1、代码生成
使用 Mybatis 逆向工程针对数据表生成 CURD 持久层代码
使用能够生成当前数据库中九张表的基本增删改查的代码,再去操作数据库时持久层用的是 Mybatis 的框架,对于基本的增删改查在公司当中不会从头开始去写,会去用逆向工程生成代码,到时候对于基本的增删改查就可以直接去使用。
逆向工程使用需要打开我的资料,在里面有一个工程为 Mybatis reverse,把工程加载到当前的 idea 中去,里边的结构非常简单,有一个基本的类,这个类当中有一个方法,然后里边有一个配置文件以及一个日志的配置文件,日志的配置文件不是必须的,是为了查看日志的信息。
import ...
public class GeneratorSqlmap {
public void generator() throws Exception{
List<string> warnings=new ArrayList<~>();
boolean overwrite =true:
File corfigFile = new File( pathname:"E:\\RocketMO\资料\\Mybatis-Reverse\srcmain resou
ConfigurationParser cp=new
ConfigurationParser(warnings);
Configuration config=cpparseConfiguration(configFile);
DefaultshellCallback callback=new
DefaultShellCallback(overwrite):
MyBatisGenerator
myBatisGenerator=newMyBatisGenerator(config,
callback, warnings);
myBatisGeneratorgenerate(callback:null);
public static void main(string[] args) throws Exception {
try {
GeneratorSqlmap generatorSqlmap=new
Generatorsqlmap(); generatorSqlmapgenerator();
} catch(Exception e) {
e.printstackTrace();
}
}
}
这里面提供了一个方法,直接去运行方法就能够去针对当前的数据库当中所有的表去生成基本的增删改查的代码。
怎么去生存?怎么知道当前数据库在哪里?有哪些表?都得需要在配置文件中进行说明,配置文件首先第一个是数据源,数据源联系的是 mysql ,然后用户名和密码进行配置,使用逆向工程,在生成持久层的代码主要生成几个方面,总体来讲生成三个方面。
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!--是否去除自动生成的注释true:是:false:否->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverclass="com.mysq1.jdbc.Driver"
connectionURL="jdbc:mysq
l
://1acalhost:3306/trade"
userId="root'
password="root">
</jdbcConnection>
<!--<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" userId="yycg"
password="yycg">
</jdbcConnection>-->
<!--默认false,把JDBC DECIMAL 和NUMERIC 类型解析为Integer,为true时把JDBC DECIMAL 和
NUMERIC 类型解析为
<
java.math.BiqDecimal--><javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
//第一个方面是基本的 PO 类,进行一个配置在去进行配置的时候需要指定的一个当前生成 pojo 的类所处的包,指定一个包名,然后下边去指定的类所生成的位置,进行配置,这是第一个部分关于 PO 类的生成。
<!-- targetProject:生成PO类的位置-->
<javaModelGenerator
targetPackage="com.itheima.shop.pojo"
targetProject="E:\RocketMQ\资料
Mybatis-Reverse\src\main java">
<!--enableSubPackages:是否让schema作为包的后缀-->
<property name="enableSubPackages"value="false" />
<!-从数据库返回的值被清理前后的空格-->
<property name="trimstrings" value="true" />
<javaModelGenerator>
<!--targetProject:mapper映射文件生成的位置-->
<sq1MapGenerator
targetPackage="com.itheima.shop.mapper"
targetProiect="E:\RocketMo\资料\Mvlatis-Reverse\src\ma
in\resources">
<!--enableSubPackaaes:是否让让schema作为包的后缓-->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!--targetPackage:mapper接口生成的位置-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.itheima.shop.mapper"
targetProject="E:\RocketMo\资料
\Mybatis-Reverse\src\mainl
java">
<!--enableSubPackages:是否让让schema作为包的后缓-->
<property name="enableSubPackages" value="false" />
</javaclientGenerator>
//在持久层进行Mybatis开发的时候,需要去用到 map 映射文件,map 映射文件可以帮助自动的生成出来,需要去指定包名以及对应文件所生成的位置,同样可以帮助去生成 mapper 接口, mapper 接口的包名以及 mapper 接口所处的位置,mapper 接口与 map 的映射文件通常包名是一样的,都叫做
com.itheima.shop.mapper
<!-- 指定数据库表 -->
<table schema="" tableName="trade coupon"></table>
<table schema="" tableName="trade_goods"></table>
<tableschema=""
tableName="trade_goods_number_log"></table>
<table schema=!" tableName="trade_order"></table>
<table schema="" tableName="trade pay"></table>
<table schema="" tableName="trade user"></table>
<tableschema="" tableName="trade_user_money_log"></tab
le>
<tableschema="" tableName="trade_mq_consumer_log"></ta
ble>
<table schema="" tableName="trade_mq_producer_temp">
</table>
<!--有些表的字段需要指定java类型
<table schema=""tableName="">
<columnOverride column="" javaType="" />
</table> --></context>
</generatorConfiguration>
需要去指定一下针对数据库当中的所有的表达进行逆向工程,把九张表分配到这来之后,关于配置文件的编写基本上完成,对于大家来讲将来可能只需要改数据源,用户名,密码,数据库的 U2 ,需要去指定 PO 类,mapper 映射文件以及 mapper 接口的生成位置,其他地方其实基本上不用去变。
2、代码导入
(1)将实体类导入到 shop-pojo 工程
(2)在服务层工程中导入对应的 Mapper 类和对应配置文件
逆向工程已经把所添加需要的依赖加过来了,主要有 logo4g、my batis 的依赖、以及 mybatis 逆向工程生成器的依赖以及数据库,数据库加了两个驱动,一个是 mysql,一个是 onacle ,需要看当前数据库到底用的是什么。
xmlns:xsi="http://www.w3.org/2001/XMLschema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/x
sd
/
maven-4
.0
<modelVersion>4.0.0</modelVersion>
<groupId>com.pinyougou</groupId>
<artifactId>mybatis-reverse</artifactid>
<version>0.0.1-SNAPSHOT</version
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactid>
<version>1.2.17</version></dependency>
<dependency>
<groupId>org.mybatis</groupid>
<artifactId>mybatis</artifactid>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactid>
<version>1.3.2</version>
</dependency>
</dependency>
<groupId>
mysq
l
</group
I
d>
<artifactId>mysql-connector-java</artifactid>
<version>5.1.30</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactid>
<version>11.2.0.1.0</version>
</dependenc
y
>
</dependencies>
<project>
把两个的驱动都可以拿过来,弄完之后可以直接的去执行,注意在 generator 方法当中要去找配置文件,以磁盘的绝对路径去找配置文件,然后直接的去执行。
public class GeneratorSqlmap{
public void generator() throws Exception{
List<string> warnings=new ArrayList<~>();
boolean overwrite = true;
File configFile=new File(pathname:"E:\\RocketMq\\资料\\Mybatis-Reverse\\src\\main\\resour
ces\\generatorConfig.mxl
”
)
ConfigurationParser cp=new
ConfigurationParser(warnings); Configuration
config=cpparseConfiguration(configFile);
DefaultshellCallbackcallback=new
DefaultshellCallback(over write);
MyBatisGeneratormyBatisGenerator=new
MyBatisGenerator(c onfig
callback,warnings);
myBatisGeneratorgenerate(callbacknull);
}
public static void main(string[] args) throws Exception {
try {
GeneratorSqlmapgeneratorSqlmap=new
GeneratorSqlmap(); generatorSqlmapgenerator();} catch
(Exception e){
e.printstackTrace();
}
}
}
执行结果:
2019-07-20 19:09:15,718[main] DEBUG [org.mybatis. generator.internal.db.DatabaseIntros
pector]-Found
column
“
msg_tag
”
,data type 12,
2019-07-20 19:09:15,718[main] DEBUG [org.mybatis. generator.internal.db.DatabaseIntros
pector]-Found column
“
msg_key
”
,data type 12,
2019-07-20 19:09:15,718[main] DEBUG [org.mybatis. generator.internal.db.DatabaseIntros
pector]-Found column
“
msg_body
”
,data type 12,
2019-07-20 19:09:15,718[main] DEBUG [org.mybatis. generator.internal.db.DatabaseIntros
pector]-Found column
“
msg_status
”
,data type 4,
2019-07-20 19:09:15,718[main] DEBUG [org.mybatis. generator.internal.db.DatabaseIntros
pector]-Found column
“
create_time
”
,data type 5,
Process finished with exit code 0
出来之后打开来看,pojo 类全都有。
需要把 pojo 类直接复制到项目中,shop pojo 存放的是 pojo类,在这个地方把刚才的那些类直接的复制过来,复制过来之后后期在开发的时候比较简单。
package com.itheima.shop.pojo;
import java.util.Date;
public class TradeGoodsNumberLog extends TradeGoods
NumberLogKey{
private Integer goodsNumber;
private Date logTime;
public Integer getGoodsNumber(){ return goodsNumber;}
public void setGoodsNumber(Integer goodsNumber)
{this.go
odsNumber=goodsNumber;
public Date getLogTime(){ return logTime; }
public void setLogTime(Date logTime){ this.logTime =logTime; }
}
对于上面 mapper 的接口就找对应的服务,然后把它放到里面去,比如现在里面的 coupon-service 是优惠券的接口,要把它要放在 couple service 里,建一个文件夹放到这里面去,
com.Itheima.shop
最好保持包名一致,shop map 在这个目录下面,在这个地方最好把包名规范一下,com.Itheima.shop.mapper 然后去复制过来。
映射文件需要去放到 mapper 下面把 resources 下面 map 映射文件挪过去。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC"-//mybatis.org//DTD Mapper
3.0//EN" "http://mybatis.orgp/yOacis-<mapper
namespace=
"com.itheima.shop.mapper.TradeCouponMapper" >
<resultMap
id="BaseResultMap"type="com.itheima.shop.pojo.TradeCoupon" ><id column="coupon id" proper
ty="couponId"
jdbcType="BIGINT" />
<result column="coupon_price" property="couponPrice"
jdbcType="DECIMAL" /><result column="user id" property="userid"
jdbctype="BIGINT" />
<result column="order_id" property="orderId"
jdbctype="BIGINT" /><result column="is_used"
property="isUsed" jdbcType="INTEGER" />
<result column="used_time" property="usedTime"
jdbcType="TIMESTAMP" /></resultMap>
<sq1 id="Example_Where_Clause" >
<where >
<foreach collection="oredCriteria” item="criteria" separator="or">
<if test="criteria.valid" >
<trim prefix="(" suffix=")"prefixOverrides="and" >
<foreach collection="criteria.criteria" item="criterion">
<choose >
<whentest="criterion.noValue">and ${criterion.condition}
</when>
<when test="criterion.singleValue" >
and ${criterion.condition} #{criterion.value}</when>
<when test="criterion.betweenValue" >
and ${criterion.condition} #{criterion.value} and
#{criterion.secondValue
里面所生产的 mapper 文件和写的都是差不多的,里面有namespace点过来,是自己所写的 mapper 结构。
可以按照同样的方式把对应的 goods-service 、order-service、shop-user-service 对应的 master接口,还有 mapper 映射文件复制到对应的工程当中,可以把这些准备工作提前都做好。
二、小结
1、代码生成
使用 Mybatis 逆向工程针对数据表生成 CURD 持久层代码
2、代码导入
将实体类导入到 shop-pojo 工程
在服务层工程中导入对应的Mapper类和对应配置文件
主要的目的是为了简化对于持久层基本的增删改查,不用自己去写直接用生成的代码去编写就可以。如果代码没有满足需要,可以进行二次开发,然后它去生成出来之后将对应的代码,倒到对应的过程当中,其中实体类都在 pogo 当中,然后服务层的工程当中导入对应的 Mapper 的接口类以及自己的映射文件都拿过去。