MyBatis的逆向工程

一.MyBatis逆向工程概述

MyBatis是目前很流行的持久层框架,很多企业都在采用。但是其复杂繁琐的配置,重复性的实体类创建等等,消耗了程序员大量的精力,同时有些地方如果一个细小的疏忽,可能导致最终功能运行失败。例如:在几十个字段的表中,某一列的列名配置疏忽。基于此,mybatis 推出了一套 jar 包,可以依据我们设计好的数据库表,自动生成 pojo、mapper 以及mapper.xml。有了逆向工程,便大大缩减了我们的开发时间。

官网:http://www.mybatis.org/generator/index.html

二.使用逆向工程

1.第一步:创建maven工程并导入依赖
<!-- 导入依赖坐标 --><dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency></dependencies>
2.第二步:编写连接数据库的配置(jdbc.properties)
# mysql驱动jar包的磁盘绝对路劲jdbc.path=G:\\repository\\mysql\\mysql-connector-java\\5.1.6\\mysql-connector-java-5.1.6.jarjdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/shdbjdbc.username=shjdbc.password=sh123
3.第三步:编写配置文件(mybatis-generator-config.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> <!-- 1.导入属性配置 --> <properties resource="jdbc.properties"></properties> <!-- 2.指定特定数据库的jdbc驱动jar包的位置 --> <classPathEntry location="${jdbc.path}"/>
<!-- 3.全局配置 --> <context id="context" targetRuntime="MyBatis3"> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <commentGenerator> <property name="suppressAllComments" value="false"/> <property name="suppressDate" value="true"/> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver>
<!-- 配置生成文件的保存位置:★★★★★★★★★★★★★★★ -->
<!--指定包名生成实体类 以及生成的地址 (可以自定义地址,如果路径不存在会自动创建) --> <javaModelGenerator targetPackage="cn.dintalk.domain.system" targetProject="G:\dintalk\project\generator\src\main\java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator>
<!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的mapper文件 --> <sqlMapGenerator targetPackage="cn.dintalk.dao.system" targetProject="G:\dintalk\project\generator\src\main\resources"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator>
<!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码 type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> <javaClientGenerator targetPackage="cn.dintalk.dao.system" targetProject="G:\dintalk\project\generator\src\main\java" type="XMLMAPPER"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> </javaClientGenerator>
<!-- 指定数据库表:可同时指定多张表 --> <table schema="dintalkdb" tableName="dintalktable" domainObjectName="User" mapperName="UserDao" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="true" enableUpdateByExample="false"/> </context></generatorConfiguration>
4.第四步:编写运行类生成文件(参见官网)
public class GeneratorSqlMapTest { // 官网提供的 public void generator() throws Exception{ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; //指定 逆向工程配置文件 InputStream in = GeneratorSqlMapTest.class.getClassLoader() .getResourceAsStream("mybatis-generator-config.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(in); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); in.close(); } //运行生成器方法,生成文件 public static void main(String[] args) throws Exception { try { GeneratorSqlMapTest generatorSqlmap = new GeneratorSqlMapTest(); generatorSqlmap.generator(); } catch (Exception e) { e.printStackTrace(); } }}
5.第五步:将生产的文件拷贝到项目中即可

Tips: 需要注意的有两点

  • 逆向工程的实体类没有实现序列化接口(Serializable)

  • 生成的实体类查询特例类也没有实现序列化接口(有内部类,特例类和内部类都要实现才行:GeneratedCriteria 和 Criterion 内部类)。

三.主要API简介

逆向工程在生成pojo的同时会生成一个配套的pojoExample类。该类是根据不同的数据库表字段生成的查询特例类。使用示例如下(以Factory实体为例):

//1.测试查询一个:根据主键id@Testpublic void testFindAll(){ Factory factory = factoryDao.selectByPrimaryKey("1"); System.out.println(factory.getFactoryName());}
/**2.使用特例进行查询 * select * from co_factory * where 这里的内容是靠criteria对象补全的 * group by having * order by 这里的内容是靠exmaple对象补全的 */ @Test public void testFindByCondition(){ //1.创建例子,进行特例查询 FactoryExample ex = new FactoryExample(); //2.进行查询(传入ex对象),查询所有 List<Factory> factories = factoryDao.selectByExample(ex); System.out.println(factories.size()); }//3.使用特例配置条件查询 @Testpublic void testFindByCondition1(){ //1.创建例子,进行特例查询 FactoryExample ex = new FactoryExample(); //2.创建例子中的条件对象 FactoryExample.Criteria criteria = ex.createCriteria(); //3.设置查询条件:这里的方法是和对应数据库中的字段名称有关的 criteria.andCtypeEqualTo("货物"); //4.加入排序: clause:从句的意思 ex.setOrderByClause("create_time desc"); //5.进行查询(传入ex对象) List<Factory> factories = factoryDao.selectByExample(ex); System.out.println(factories.size());}

Tips: 若是在实体类中有一对多和多对一的关系存在,则需要相应的修改实体类,并在dao接口中编写相应的方法。在xml文件中使用collection和association标签配置关联查询即可。

(0)

相关推荐