Mybatis学习05:Mybatis逆向工程
Mybatis逆向工具mybatis-generator
Mybatis逆向工具mybatis-generator可以帮助我们根据数据库自动生成对应的java以及xml代码. 可以说是很提高效率了.其官方文档地址:MyBatis Generator Core – Introduction to MyBatis Generator(不得不吐槽一下,官方文档竟然有错别字).
Mybatis逆向工具的使用
使用mybatis-generator生成代码
我们在MAVEN项目中使用mybatis-generator,根据数据库逆向出对应的Java和SQL代码.
-
在
pom.xml
下导入mybatis-generator
的依赖和MAVEN插件<project ...> ... <!-- 添加mybatis-generator依赖 ---> <dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> </dependencies> ... <build> ... <plugins> ... <!-- 添加mybatis-generator插件 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.7</version> </plugin> ... </plugins> ... </build> ... </project>
-
在
src/main/resources
目录下创建代码生成器的配置文件generatorConfig.xml
,详细文档见MyBatis Generator Core – MyBatis Generator XML Configuration File Reference.<?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> <!-- 数据库驱动jar包的位置 --> <classPathEntry location="C:/Users/chenhai/.m2/repository/mysql/mysql-connector-java/8.0.13/mysql-connector-java-8.0.13.jar" /> <!-- context:生成一组对象的环境 --> <context id="DB2Tables" targetRuntime="MyBatis3"> <!-- 配置数据库链接 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/mydatabase" userId="root" password="mysql" /> </jdbcConnection> <!-- java类型处理器 --> <javaTypeResolver> <!-- 该属性默认为true,表示将所有JDBC DECIMAL和JDBC java.math.BigInteger类对象,否则根据其scale和length决定其映射成的Java类型 --> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 配置自动生成的pojo类,targetPackage属性表示生成的类所放在的包,targetProject属性表示生成代码所在的项目 --> <javaModelGenerator targetPackage="cn.maoritian.domain" targetProject="src/main/java"> <property name="constructorBased" value="false"/> <property name="enableSubPackages" value="false" /> <property name="immutable" value="false"/> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- 配置自动生成的mapper.xml --> <sqlMapGenerator targetPackage="cn.maoritian.mapper" targetProject="src/main/java/resources"> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- 配置自动生成的Mapper接口 --> <javaClientGenerator targetPackage="cn.maoritian.mapper" targetProject="src/main/java/resources"> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定要逆向分析的表 --> <!-- <table>标签下的节点基本上是对javaModelGenerator的覆盖 --> <table tableName="student" domainObjectName="Student" delimitAllColumns="true"> <!-- 指定是否使用驼峰命名 --> <property name="useActualColumnNames" value="true"/> <generatedKey column="id" sqlStatement="MySql" identity="true" /> <!-- <ignoreColumn column="hobby" /> --> <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table> </context> </generatorConfiguration>
-
在控制台输入
mvn mybatis-generator:generate -e
,会自动构建出代码,-e参数是为了输出详细信息.
注意: mybatis-generator不会检查指定的目录及类是否存在,需要我们手动检查
使用Example
类进行动态查询
我们看到,自动生成的Java实体类中除了pojo类之外,还生成了xxxExample
类,这个类可以与xxxMapper
接口中的方法相配合,完成复杂的动态查询,可以看到Mapper接口中查询操作的条件是以Example
对象表示的.
每个Example
类中都定义了一个Criteria
内部类,Criteria
对象可以调用andxxx()
方法在逻辑上进行AND
拼接;每个Example
对象中都维护一个Criteria
列表,列表中的Criteria
对象在逻辑上是OR
的关系.
-
我们可以通过
Example
对象的or
方法创建一个Criteria
对象并将其加入该Example
对象的条件列表中.TestTableExample example = new TestTableExample(); example.or() .andField1EqualTo(5) .andField2IsNull(); example.or() .andField3NotEqualTo(9) .andField4IsNotNull(); List<Integer> field5Values = new ArrayList<Integer>(); field5Values.add(8); field5Values.add(11); field5Values.add(14); field5Values.add(22); example.or() .andField5In(field5Values); example.or() .andField6Between(3, 7);
上面的
example
对象相当于下列条件where (field1 = 5 and field2 is null) or (field3 <> 9 and field4 is not null) or (field5 in (8, 11, 14, 22)) or (field6 between 3 and 7)
-
我们可以对
Example
对象调用setDistinct(true)
设置查询结果不重复,相当于在sql语句中加上了DISTINCT
限定符.
更多Mybatis支持的
andxxx()
方法及其对应的条件可以参考官方文档
- 我们也可以在生成的
Example
类中实现自定义的查询条件.其本质就是sql语句的拼接.