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>
# mysql驱动jar包的磁盘绝对路劲
jdbc.path=G:\repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/shdb
jdbc.username=sh
jdbc.password=sh123
<?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:dintalkprojectgeneratorsrcmainjava"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的mapper文件 --> <sqlMapGenerator targetPackage="cn.dintalk.dao.system" targetProject="G:dintalkprojectgeneratorsrcmain esources"> <!-- 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:dintalkprojectgeneratorsrcmainjava" 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>
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(); } } }
Tips: 需要注意的有两点
-
逆向工程的实体类没有实现序列化接口(Serializable)
-
生成的实体类查询特例类也没有实现序列化接口(有内部类,特例类和内部类都要实现才行:GeneratedCriteria 和 Criterion 内部类)。
三.主要API简介
逆向工程在生成pojo的同时会生成一个配套的pojoExample类。该类是根据不同的数据库表字段生成的查询特例类。使用示例如下(以Factory实体为例):
//1.测试查询一个:根据主键id @Test public 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.使用特例配置条件查询 @Test public 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()); }
关注微信公众号,随时随地学习