6.1 设计数据库表
我用的mysql 8,登录进去创造数据库以及表:
weixin-dev下:users,my_friends,friends_request,chat_msg
6.2逆向转化工具
1.pom中加入依赖
<!-- mybatis 逆向生成工具 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
2.配置 generatorConfig.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 元素用于指定生成一组对象的上下文环境,ta包括:指定数据库连接,指定要生成对象的类型,指定需要内省的表。-->
<!--(1) targetRuntime:指定生成代码的运行时环境。
MyBatis3Simple:使用这个值,MBG将生成与 “Mybatis v3.0 及以上版本 和 JSE 5.0 及以上版本”相兼容的对象(例如,Java模型和映射器接口将使用泛型类型,
接口中将使用默认方法等)。不同的是,使用这个targetRuntime生成的映射器是非常基本的CRUD操作,没有“by example”方法,仅支持很少的动态SQL。
使用这些生成的java对象支持 JSE 5.0特性,包括泛型和注解。
(2) defaultModelType:设置产生的模型类型,定义了MBG如何去产生模型类。
conditional:默认值。如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。
flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。一般使用这个模型就够了。
hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段,则会为表生成一个包含所有BLOB字段的单独的实体类,
然后为所有其他的字段生成一个单独的实体类。MBG会在所有生成的实体类之间维护一个继承关系。显然这个模型比较复杂。
(3)beginningDelimiter,endingDelimiter 分隔符的起,终字符-->
<context id="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!--https://mapperhelper.github.io/docs/3.usembg/,自动生成代码的通用mapper插件-->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="com.bmooc.utils.MyMapper"/>
</plugin>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3307/weixin-dev"
userId="root"
password="1995">
</jdbcConnection>
<!-- javaModelGenerator(最多一个) :该元素用来控制生成的实体类,根据中配置的defaultModelType,
一个表可能会对应生成多个不同的实体类一个表对应多个类实际上并不方便,所以前面也推荐使用flat,
这种情况下一个表对应一个实体类。
1)targetPackage:生成实体类存放的包名,一般就是放在该包下。
2)targetProject:指定目标项目路径(如 targetProject="src/main/-->
<!--对于生成的pojo所在包-->
<javaModelGenerator targetPackage="com.bmooc.pojo"
targetProject="C:\Users\陈星宇\IdeaProjects\bmooc-netty\bmooc-weixin-mybatis\src\main\java"/>
<!--对于生成的mapper所在目录-->
<sqlMapGenerator targetPackage="mapper" targetProject="C:\Users\陈星宇\IdeaProjects\bmooc-netty\bmooc-weixin-mybatis\src\main\resources"/>
<!--对于mapper所对应的java映射
javaClientGenerator:生成Mapper接口。
1)type:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,
需要继承org.mybatis.generator.codegen.AbstractJavaClientGenerator类,必选有一个默认的构造方法。
该属性提供了以下预定的代码生成器,根据targetRuntime分成三类:
MyBatis3: ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
MIXEDMAPPER:XML和注解的混合形式,(上面这种情况中的)SqlProvider注解方法会被XML替代。
XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
MyBatis3Simple:ANNOTATEDMAPPER;XMLMAPPER;
Ibatis2Java2或**Ibatis2Java5**: IBATIS:生成的对象符合iBATIS的DAO框架(不建议使用)。
GENERIC-CI:生成的对象将只依赖于SqlMapClient,通过构造方法注入。
GENERIC-SI:生成的对象将只依赖于SqlMapClient,通过setter方法注入。
SPRING:生成的对象符合Spring的DAO接口
-->
<javaClientGenerator targetPackage="com.bmooc.mapper" targetProject="C:\Users\陈星宇\IdeaProjects\bmooc-netty\bmooc-weixin-mybatis\src\main\java" type="XMLMAPPER"/>
<!-- table :配置要通过内省的表。只有配置的才会生成实体类和其他文件。
tableName:指定要生成的表名,可以使用SQL通配符匹配多个表。-->
<table tableName="users"></table>
<table tableName="my_friends"></table>
<table tableName="friends_request"></table>
<table tableName="chat_msg"></table>
</context>
</generatorConfiguration>
注意: targetProject写绝对路径(/)以避免代码执行成功但不生成代码的困境
3.执行程序
public class GeneratorDisplay {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//指定 逆向工程配置文件
File configFile = new File("E:\\generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
public static void main(String[] args) throws Exception {
try {
GeneratorDisplay generatorSqlmap = new GeneratorDisplay();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意: 这里xml是写在E盘下面,写的绝对路径(不知道为什么相对路径不成立)