喜欢有帮助记得点赞哦,加关注不迷路
一、什么是逆向工程
我们在使用mybatis时需要根据数据表创建pojo类,pojo类的映射文件以及sql语句和Dao层,而这些部分没有什么技术含量,myBatis官方提供了逆向功能,可以根据数据表自动生成pojo,映射文件以及dao层。我们通常将Dao层称为mapper.java,将映射文件称为mapper.xml,将会实体类称为pojo。
二、下载逆向工程
我们使用mybatis需要导入mybatis的jar包,如果使用逆向工程还需要逆向工程的jar包 mybatis-generator-core-1.3.7.jar
逆向工程jar包下载地址大家也可以maven官网仓库maven官网搜索mybatis-generator-core进行下载,推荐大家到maven上下载,能够省点积分 #滑稽。
三、使用
3.1 新建工程
这里我们新建一个普通的java工程完成我们的逆向工程,为什么新建一个工程来写,不直接在项目中生成呢?因为mybatis的逆向工程是根据配置文件来生成的,如果生成的路径中有相同的文件会被覆盖,存在风险,所以我们创建一个新的工程专门用来生成文件,将生成的文件复制到我们的项目中即可。创建项目的图就不放到这里了。
3.2 导入jar包
我这里使用的是mysql数据库,所以导入以下几个jar包和日志文件
项目结构如下
3.3 逆向工程配置文件
在项目根目录下创建逆向工程配置文件,文件名为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 id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/day11_06"
userId="root"
password="root">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.stt.pojo"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.stt.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.stt.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表,有多张表就写多个table标签一一配置即可 -->
<table schema="" tableName="tb_goods"></table>
</context>
</generatorConfiguration>
从上面的配置文件中可以看出,配置文件主要做的几件事是:
- 连接数据库,这是必须的,要不然怎么根据数据库的表生成代码呢?
- 指定要生成代码的位置,要生成的代码包括pojo类,mapper.xml和mapper.java
- 指定数据库中想要生成哪些表
3.4 执行逆向工程生成代码
配置文件搞好了,接下来执行程序就可以生成代码,在src下创建类,代码如下,本来想偷个懒不写包名,不符合我的风格。
package com.stt.generator;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
public class GeneratorSqlmap {
public void generator() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 指定 逆向工程配置文件
File configFile = new File("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 {
GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我们运行之前项目结构如下
项目运行后,就会生成我们的pojo,mapper.java和mapper.xml,刷新我们的工程就会看到
这里可以看出有个细节,每个pojo多了一个东西,就是xxxExample.java,这个类是给用户自定义sql使用的,后面我会提到。到这里就生成好了,下面我们就把生成的代码拷贝到自己的工程使用了,下边我们测试一下吧。
四、测试
我们创建一个spring和mybatis的整合项目,我们不写页面所以还是创建一个普通的java项目即可,没必要创建动态web项目,而且我们要使用mpper.java中的方法操作数据库,因为它是一个接口,所以不能使用new创建对象,我们需要使用它的代理对象,我们可以使用spring容器帮我们创建它的代理对象,何乐而不为。
我们将逆向工程生成的代码复制到项目中
接下来我们完成配置一下spring与myabtis的配置文件与之前我们说的ssm整合一样。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 读取外部数据库文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:db.properties" />
</bean>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${pass}" />
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations"
value="classpath:com/stt/mapper/*.xml"></property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.stt.mapper"></property>
</bean>
</beans>
测试类
public class MyTest {
private ApplicationContext context;
@Before
public void init() {
//初始化spring容器
context = new ClassPathXmlApplicationContext("spring-mybatis.xml");
}
//添加商品
@Test
public void insertGoods() {
//获取goodsMapper对象
TbGoodsMapper goodsMapper = context.getBean(TbGoodsMapper.class);
TbGoods tbGoods = new TbGoods();
tbGoods.setGoodsName("三体1:地球往事");
tbGoods.setGoodsType("科幻小说");
tbGoods.setGoodsCount(1000);
tbGoods.setGoodsPrice(23.00);
tbGoods.setGoodsStatus(1);//数据的状态,1:可用,0:为不可用
goodsMapper.insert(tbGoods);
}
//查询
@Test
public void selectByExample() {
TbGoodsMapper goodsMapper = context.getBean(TbGoodsMapper.class);
TbGoodsExample goodsExample = new TbGoodsExample();
//Criteria类是UserExample类里面的内部类,Criteria类是干什么用的呢?它专门用于封装自定义查询条件的
//Criteria criteria = goodsExample.createCriteria();
//criteria.andGoodsNameLike("%小%");
//执行查询
List<TbGoods> list = goodsMapper.selectByExample(goodsExample);
for (TbGoods tbGoods : list) {
System.out.println(tbGoods);
}
}
//根据id查询
@Test
public void selectByPrimaryId() {
TbGoodsMapper goodsMapper = context.getBean(TbGoodsMapper.class);
TbGoods goods = goodsMapper.selectByPrimaryKey(5);
System.out.println(goods);
}
//修改和删除读者自己完成
}
以上就是我们逆向工程的配置和使用,新建一个工程用来生成我们的文件再将生成的文件复制到我们的项目中使用,框架的整合还和以前的一样,只不过原先需要我们自己写pojo类,mapper.xml,mapper.java现在可以自动生成。使用起来很方便,而且比较规范,而且还多了自定义查询条件的java类。
逆向工程下载地址:https://gitee.com/stt0626/mybatis-generator.git
测试项目下载地址:https://gitee.com/stt0626/test-generator.git
盛年不复来,一日难再晨。