逆向工程
- 什么是MyBatista的逆向工程:MyBatis的逆向工程指利用MyBatis Generator,可以快速的根据表生成对应的映射文件,接口,以及bean类 简单的说就是 通过数据库中的表来自动的生成代码
- MyBatis Generator,简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要我们手工编写
- 官方文档地址:http://www.mybatis.org/generator/
- 官方工程地址https://github.com/mybatis/generator/releases
- 使用逆向工程的好处:非常的简单 就是 当数据库表比较多的时候,重复的创建pojo对象和简单的数据库表的(CRUD)操作的mapper,效率低,官方给出了使用mybatis Generator用来根据数据库表逆向生成pojo和mapper文件,极大的方便开发 最终级的理由就是懒
- 逆向工程的使用步骤:使用逆向工程生成文件非常的方便只需要进行一些简单的配置
-
在IDEA上创建maven工程
-
在maven中添加依赖
<!-- MBG --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.5</version> </dependency>
-
进行generationConfig.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> <context id="mybatisGenerator" targetRuntime="MyBatis"> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatisGenerator? serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true" userId="root" password="12345"> </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="mapper" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="mapper" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定数据库表 --> <table tableName="items"></table> <table tableName="orders"></table> <table tableName="orderdetail"></table> <table tableName="user"></table> <!-- 有些表的字段需要指定java类型 <table schema="" tableName=""> <columnOverride column="" javaType="" /> </table> --> </context> </generatorConfiguration>
-
使用Java类来执行逆向工程: 执行main方法 生成pojo和mapperr对象
public class Generator { public void generator() throws Exception{ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; /**指向逆向工程配置文件 其余的步骤都是固定的*/ File configFile = new File("src/generatorConfig.xml"); ConfigurationParser parser = new ConfigurationParser(warnings); Configuration config = parser.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 { Generator generatorSqlmap = new Generator(); generatorSqlmap.generator(); } catch (Exception e) { e.printStackTrace(); } } }
-
- MBG的配置详解:
generatorConfiguration
标签下的子级标签,分别是properties classPathEntry context
。在配置这几个标签的时候,必须注意它们的顺序properties classPathEntry contex
properties
标签。这个标签用来指定外部的属性元素,最多可以配置 一个,也可以不配置 properties 标签用于指定一个需要在配置中解析使用的外部属性文件 引入属性文件后,可以在配置中使用${ property }这种形式的引用,通过这种方式引用属性文件中的属性值(常常是用来配置JDBC的信息)- 属性: properties 标签包含
resource url
两个属性 只能使用一个属性 同时使用会报错- resource 指定 classpath 下的属性文件
- url 指定文件系统上的特定位置 (可以是在磁盘中的任意位置 使用的是file协议)
- 属性: properties 标签包含
classPathEntry
标签 这个标签可以配置多个 可以不配置 classPathEntry 标签最常见的用法是通过属性 location 指定驱动的路径或者是指定 rootClass 属性配直类所在的 jar包context
标签:该标签至少配置 一个 也可以配置多个(重点)- 属性 :
- id属性:context 标签只有一个必选属 id ,用来唯一确定该标签,该 id 属性可以在运行MBG时使用
- defaultModelType属性 :定义了 MBG 如何生成实体类。该属性有以下可选值:
- conditional 默认值,和下面的 hierarchical 类似,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,而是会将该字段合并到基本实体类中
- flat :该模型只为每张表生成 个实体类。这个实体类包含表中的所有字段种模型最简单,推荐使用。
- hierarchical :如果表有主键,那么该模型会产生 个单独的主键实体类,如果表还有 BLOB 字段,则会为表生成 个包含所有 BLOB 字段的单独的实体类,然后为所有其他的字段另外生成 个单独的实体类。 MBG 会在所有生成的实体类之间维护 个继承关系
- targetRuntime属性 :此属性用于指定生成的代码的运行时环境,支持以下可选值MyBatis3 默认值另一种就是MyBatis3Simple 这种情况不会生成与 Example 相关的方法
- introspectedColumnimpl属性 该参数可以指定扩展 org mybatis.generator.api. Introspected Column 类的实现类
- 属性 :
commentGenerator
标签:该标签用来配置如何生成注释信息,最多可以配置一个(一般都是屏蔽注释信息)- 默认的实现类中提供了个可选属性,需要通过 property 属性进行配置:
- suppressAllComments :阻止生成注释 ,默认为 false
- suppressDate 阻止生成的注释包含时间戳,默认为 false
- addRemarkComments :注释是否添加数据库表的备注信息 ,默认为 false
- 默认的实现类中提供了个可选属性,需要通过 property 属性进行配置:
jdbcConnection
标签:jdbcConnection 指定 MBG 要连接的数据库信息,该标签必须有,并且只能有一个:推荐将JDBC驱动放置到classpath下- 属性: 前两个是必须的属性 后两个是可选的属性
- driverClass 访问数据库的 JDBC 驱动程序的全限定类名
- connection URL 访问数据库的 JDBC 连接 URL
- user!d :访问数据库的用户 ID
- password 访问数据库的密码。
- 属性: 前两个是必须的属性 后两个是可选的属性
javaTypeResolver
标签:标签的配置用来指定 JDBC 类型和 Java 类型如何转换,最多可以配置一个- 其中能使用property 标签,可以配置的属性为
forceBigDecimals
,该属性可以控制是否强制将DECIMAL NUMERIC
类型的 JDBC 字段转换为 Java 类型的java.math BigDecimal
,默认值为 false ,一般不需要配置
- 其中能使用property 标签,可以配置的属性为
javaModelGenerator
标签:该标签用来控制生成的实体类、- 属性:
- targetPackage 生成实体类存放的包名。一般就是放在该包下,实际还会受到其他
配置的影响 - targetProject :指定目标项目路径,可以使用相对路径或绝对路径
- targetPackage 生成实体类存放的包名。一般就是放在该包下,实际还会受到其他
- 属性:
sqlMapGenerator
标签:该标签用于配置 SQL 映射生成器 Mapper.xml 文件的属性,该标签可选,最多配置y一个- 属性:必选
- targetPackage 生成 SQL 映射文件( XML 文件)存放的包名 。一般就是放在该包下
- targetProject 指定目标项目路径,可以使用相对路径或绝对路径
- 属性:必选
javaClientGenerator
标签:不配置此标签就不能生成Mapper接口- 属性:
- type 用于选择客户端代码( Mapper 接口)生成器
- targetPackage 生成实体类存放的包名。一般就是放在该包下,实际还会受到其他
配置的影响 - targetProject :指定目标项目路径,可以使用相对路径或绝对路径
- 属性:
table
标签:table 是最重要的一个标签,该标签用于配置需要通过内省数据库的表,只有在 table配置过的表才能经过上述其他配置生成最终的代码,该标签至少要配置 个,可以配置多个table 标签有 个必选属性 tableName ,该属性指定要生成的表名,可以使用 SQL 通配符匹配多个表- 生成全部的表,可以如下配置:<table tableName ="%"/>
分页插件
- 使用步骤: 是一个国内的牛人开源项目
- 使用 Maven在 pom.xml 中添加如下依赖:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>最新版本</version> </dependency>
- 配置拦截器插件特别注意,新版拦截器是
com.github.pagehelper.PageInterceptor。
com.github.pagehelper.PageHelper
现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法-
在 MyBatis 配置 xml 中配置拦截器插件
<plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --> <property name="param1" value="value1"/> </plugin> </plugins>
-
拦截器中的参数详解:
-
dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现
Dialect(com.github.pagehelper.Dialect)
接口,然后配置该属性为实现类的全限定名称。
下面几个参数都是针对默认 dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用 -
helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。 -
offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
-
rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。
-
pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
-
reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
-
params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
-
supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。
-
autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五。
-
closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定
-
-
调用:
-
RowBounds方式的调用:
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));
使用这种调用方式时,你可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容 分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页
-
PageHelper.startPage
静态方法调用除了PageHelper.startPage
方法外,还提供了类似用法的PageHelper.offsetPage
方法。在你需要进行分页的 MyBatis 查询方法前调用PageHelper.startPage
静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页 还能使用 PageInfo对象将结果进行包装//获取第1页,10条内容,默认查询总数count PageHelper.startPage(1, 10); //紧跟着的第一个select方法会被分页 还有其他的查询方法不会进行分页 List<Country> list = countryMapper.selectAll(); //用PageInfo对结果进行包装 PageInfo page = new PageInfo(list); //测试PageInfo全部属性 //PageInfo包含了非常全面的分页属性 assertEquals(1, page.getPageNum()); assertEquals(10, page.getPageSize()); assertEquals(1, page.getStartRow()); assertEquals(10, page.getEndRow()); assertEquals(183, page.getTotal()); assertEquals(19, page.getPages()); assertEquals(1, page.getFirstPage()); assertEquals(8, page.getLastPage()); assertEquals(true, page.isFirstPage()); assertEquals(false, page.isLastPage()); assertEquals(false, page.isHasPreviousPage()); assertEquals(true, page.isHasNextPage());
-
使用参数的方式:想要使用参数方式,需要配置 supportMethodsArguments 参数为 true,同时要配置 params 参数
<plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --> <property name="supportMethodsArguments" value="true"/> <property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/> </plugin> </plugins>
在方法中 添加
pageNumKey
和pageSizeKey
参数,这个方法就会被分页List<Country> selectByPageNumSize( @Param("user") User user, @Param("pageNumKey") int pageNum, @Param("pageSizeKey") int pageSize);
-
-
- 使用 Maven在 pom.xml 中添加如下依赖: