什么是逆向工程
mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表(多表关联查询不能使用)自动生成mybatis执行所需要的代码(mapper.java、mapper.xml、pojo…),可以让程序员将更多的精力放在繁杂的业务逻辑上
优点
- 比如公司里一个大的项目有100多张表格,如果每次都手动创建pojo.Java,mapper.Java,mapper.xml,创建次数太多。利用自动生成工具将免去上面繁琐的操作
- 生成的pojo最好跟数据库表保持一致,比如数据库是user_Id,那么生成的pojo里会是userId(驼峰命名规则)
使用方法
-
导入Java工程generatorSqlmapCustom到eclipse中
import->generator->Existing Projects into Workspace
选择generatorSqlmapCustom工程
-
修改配置文件
在generatorConfig.xml中配置Mapper生成的详细信息,注意修改下面的信息
- 修改要生成的数据库表
- pojo文件所在包路径
- Mapper所在的包路径
<?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/mybatis"
userId="root"
password="root">
</jdbcConnection>
<!-- 下面是oracle的配置方法-->
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="root"
password="root">
</jdbcConnection> -->
<!-- 默认false,把数据库中的数据类型DECIMAL 和 NUMERIC 解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal
private Integer userId;private BigDecimals userId-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成POJO类的位置 -->
<javaModelGenerator targetPackage="com.itheima.mybatis.pojo" targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 清理数据库返回值前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.itheima.mybatis.mapper" targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.itheima.mybatis.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定哪些数据库表要去生成 -->
<table schema="" tableName="user"></table>
<table schema="" tableName="orders"></table>
<!-- 有些表的字段需要指定java类型
<table schema="" tableName="user">
<columnOverride column="id" javaType="Long" />
</table> -->
</context>
</generatorConfiguration>
- 执行GeneratorSqlmap.java的main函数
import java.io.File;
import java.io.IOException;
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.exception.XMLParserException;
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();
}
}
}
-
刷新项目
Example类是用来[构造复杂的筛选条件]的,通俗点讲就是[专门用来封装自定义查询条件]
-
如果需要再次生成,一定要记得先把原来生成的删除
写一个测试类
JunitTest.Java
public class JunitTest {
@Test
public void testMapper() throws Exception {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = ac.getBean(UserMapper.class);
UserExample example = new UserExample();
String username = "明";
// Criteria类是UserExample类里面的内部类,Criteria类是干什么用的呢?它专门用于封装自定义查询条件的
// Criteria criteria = example.createCriteria();
// criteria.andUsernameLike("%张%");
//查询条件是性别等于1,姓名中带有"明"字的
example.createCriteria().andSexEqualTo("1").andUsernameLike("%" + username + "%");
//排序 select *** by ${ OrderByClause } = select *** by id desc
example.setOrderByClause("id desc");
int countByExample = userMapper.countByExample(example);
System.out.println(countByExample);
}
}
Criteria类
这里的Criteria类是xxxExample类的内部类,每个xxxExample类都有一个Criteria类。这里的Criteria类有点类似于Hibernate里面的Criteria类,无语句面向对象查询