官方文档:http://mybatis.org/generator/
正向工程:先设计实体类及实体之间的关系,再创建数据库并设计表之间的关系。
逆向工程:先设计数据库表,再通过数据库表关系,之后生成实体类及映射文件和接口。
~
~
~
mybatis官网提供了mybatis-generator项目,可以针对单表生成pojo,mapper接口及mapper映射文件,他提供了一套单表的crud的操作。
~
~
~
~
~
搭建逆向工程
~
实际开发过程中逆向工程不直接搭建在正式项目中,要单独创建一个项目,作为我们的逆向工程项目。
~
·
~
①添加依赖包
~
Mybatis-Generator依赖包
~
Maven仓库下载依赖包地址:https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core
~
~
~
添加依赖包到项目中,并添加到构建路径中。
~
~
~
②创建一个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>
<!-- 定义逆向工程内容
id:默认id
targetRuntime:目标运行的mybatis
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 配置数据库连接信息 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/stand?serverTimezone=UTC&nullCatalogMeansCurrent=true"
userId="root"
password="123456">
</jdbcConnection>
<!--配置Java类型解析器 -->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--配置pojo的生成位置
targetPackage:生成的pojo所在的包,不需要写类名
targetProject:生成的默认位置
-->
<javaModelGenerator targetPackage="com.pojo" targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 用于配置映射文件的生成位置
targetPackage:生成的xml所在的包,不需要写类名
targetProject:生成的默认位置
-->
<sqlMapGenerator targetPackage="com.mapper" targetProject=".\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 用于配置接口文件的生成位置
targetPackage:生成的interface所在的包,不需要写类名
targetProject:生成的默认位置
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.mapper" targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 配置当前连接的数据库需要逆向工程的表
schema:指定数据库名称
tableName:指定表名称
-->
<table schema="stand" tableName="t_user" >
</table>
</context>
</generatorConfiguration>
~
~
~
如果出现串库等生成内容异常情况出现,解决方法:
~
在连接数据库url中加入参数:
connectionURL="jdbc:mysql://127.0.0.1:3306/stand?serverTimezone=UTC&nullCatalogMeansCurrent=true"
~
~
~
~
~
③Java类中执行的代码
~
public class Generator {
public static void main(String[] args) throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//file中的url需要绝对路径
File configFile = new File("这里写上面xml文件的绝对路径");
//如:"D://Users/Mac/eclipse-20200423/mybatis- 1098z-5-2/src/config.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);
}
}
注意:导包要导mybatis下的包。
~
~
~
执行上面的Java代码后就会自动生成下方图片所指的一些文件。
~
CRUD(增删查改)
~
~
~
逆向工程的使用
~
insert插入
方法名 | 描述 |
---|---|
insert(Obj pojo) | insert后的字段列表为所有列,一般在开发时需要修改(自增主键存在问题) |
insertSelective(Obj pojo) | 进行insert操作时只会插入不为空的字段 |
~
update更新
方法名 | 描述 |
---|---|
updateByExample(Obj pojo,Example example) | 根据example定义的查询条件更新所有字段 |
updateByExampleSelective(Obj pojo,Example exmpale) | 根据example定义的查询条件更新不为空的字段 |
updateByPrimaryKey(Obj pojo) | 根据主键更新所有字段 |
updateByPrimaryKeySelective(Obj pojo) | 根据主键只更新不为空的字段 |
~
delete删除
方法名 | 描述 |
---|---|
deleteByExample | 根据查询条件删除 |
deleteByPrimaryKey | 根据主键删除 |
返回int类型为数据库影响行数。
~
select查询
方法名 | 描述 |
---|---|
selectByPrimaryKey | 根据主键查询数据(返回pojo类型) |
selectByExample | 根据自定义条件查询(返回集合类型) |
countByExample | 根据查询条件返回总行数(返回long类型) |
~
自定义查询条件
~
创建自定义查询条件
如:SUserExample example = new SUserExample();
~
保存查询条件
Criteria criteria = example.createCriteria();
~
区间查询
criteria.adnIdBetween(value1,value2);
//查询id在value1到value2区间的值
~
等值查询
criteria.andIdEqualTo(20);
//查询id等于20
~
查询大于给定的值
criteria.andIdGreaterThan(20);
//查询id大于20
~
查询小于给定的值
criteria.andIdLessThan(100);
//查询id小于100
~
生成in子句
criteria.andIdIn(value);
//这里value放集合类型
~
查询字段非空的数据
criteria.andIdIsNotNull();
~
查询不等于给定的值
注意:在映射文件中不能写<>,写!=
criteria.andIdNotEqualTo(1);
//查询id不等于1的数据
~
查询不在in子句中的数据
criteria.andIdNotIn(values);
//翻译过来就是not in
~
模糊查询 like
criteria.andUsernameLike("%a%");