在数据持久层通常我们都要写大量的代码和xml映射sql语句来将结果集映射到pojo对应的实体类中
而有了反向生成工具之后可以直接自动生成pojo实体类,还有dao中的接口和mapper映射文件
大大减少了数据访问层的工作量
这里介绍一下反向生成工具的使用,还有一些细节的注意事项
目录结构如下:
很简单,就是这么点东西,下面是xml中的配置文件:generatorConfig.xml
配置文件中修改一些自己数据库名或用户名密码,表明等相关信息
这里注意一点,targetRuntime=“MyBatis3” 这个属性,会生成带条件的pojo实体类,
如作条件分页查询,可以生成相应的Example类,如果不需要条件查询,可以写成targetRuntime=“MyBatis3Simple” 这样就会生成普通的pojo类。
具体Example条件查询需要用到MajorExample example=new MajorExample();
Criteria criteria = example.createCriteria(); 这里就不作具体解释了。
<?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/stumanager" userId="root"
password="hx123">
</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.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="pojo"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="dao.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="dao"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table tableName="user">
<!-- 是否启用跟字段名一样的pojo属性名 -->
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="role">
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="post">
<property name="useActualColumnNames" value="true"/>
</table>
<table tableName="classtab">
<property name="useActualColumnNames" value="true"/>
</table>
</context>
</generatorConfiguration>
修改完配置信息之后,可以直接运行java文件了
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();
}
}
}
右键run一下,生成相应的接口,映射文件和实体类(需要刷新一下,refresh)
生成完之后将这些文件拷贝你的工程里面了。是不是很方便呢。
这里顺便介绍一下带条件的查询写法。
查询条件被封装到了工具类SearchCondition里
public PageInfo<Major> getMajorListByConditions(Integer pageIndex, SearchCondition searchCondition) {
//分页插件开始分页
PageHelper.startPage(pageIndex, 4);
MajorExample example=new MajorExample();
//创建Criteria对象
Criteria criteria = example.createCriteria();
//条件满足的情况下,添加条件到example里
if(searchCondition.getCid()!=null&&searchCondition.getCid()!=-1){
criteria.andCidEqualTo(searchCondition.getCid());
}
if(StringUtils.isNotBlank(searchCondition.getMname())){
criteria.andMnameLike("%"+searchCondition.getMname()+"%");
}
if(searchCondition.getCredit1()!=null){
criteria.andCreditGreaterThanOrEqualTo(searchCondition.getCredit1());
}
if(searchCondition.getCredit2()!=null){
criteria.andCreditLessThanOrEqualTo(searchCondition.getCredit2());
}
//通过条件获得List
List<Major> list = majorMapper.selectByExample(example);
//循环遍历作连表查询,封装连表信息,这里需要手动在pojo实体类里添加一个College对象,并加入get/set方法
for(Major major:list){
College college = collegeMapper.selectByPrimaryKey(major.getCid());
major.setCollege(college);
}
//返回分页插件工具PageInfo
PageInfo<Major> pageInfo=new PageInfo<Major>(list, 4);
return pageInfo;
}
介绍完毕,反向工具可以减少很大的工作量,用习惯之后普通的crud都不在话下了