mybatis的延迟加载与代码生成工具
1.什么是延迟加载
延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
配置方法:在需要延迟查询的标签中添加fetchType,值设为true。
需要的库依赖:CGLIB
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
什么是CGLIB?
CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。
CGLIB原理
CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。
CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
CGLIB缺点:对于final方法,无法进行代理。
CGLIB的应用
广泛的被许多AOP的框架使用,例如Spring AOP和dynaop。Hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联。
---------节选自博客http://blog.csdn.net/zghwaicsdn/article/details/50957474
2.MBG(MyBatis Generator)
MyBatis Generator (MBG) 是一个Mybatis的代码生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各个版本的代码,和iBATIS 2.2.0版本以后的代码。 他可以内省数据库的表(或多个表)然后生成可以用来访问(多个)表的基础对象。 这样和数据库表进行交互时不需要创建对象和配置文件。 MBG的解决了对数据库操作有最大影响的一些简单的CRUD(插入,查询,更新,删除)操作。
步骤:
1.添加插件(pom.xml)
<!-- 添加mbg插件 -->
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<!--mbg.xml在后面会创建-->
<configuration> <configurationFile>src/main/java/mbg.xml</configurationFile>
</configuration>
</plugin>
</plugins>
</build>
2. 创建配置文件
创建mbg.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>
<!-- <classPathEntry> 元素 用于添加驱动包 -->
<classPathEntry location="E:\Mr.liao\mysql-connector-java-5.1.28-bin.jar" />
<!-- 设置生成代码的规则
targetRuntime开发环境使用的mybatis版本
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- <jdbcConnection> 元素用于配置数据库链接四大参数-->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root"
password="zyp">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 声明实体类 targetPackage包名 targetProject位置 -->
<javaModelGenerator targetPackage="cn.zyp.entity" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- sql语句相关的xml或者注解的生成包路径 -->
<sqlMapGenerator targetPackage="cn.zyp.resource" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成接口的位置 type选择注解(ANNOTATEDMAPPER)还是xml配置(XMLMAPPER)-->
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.zyp.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 声明需要生成代码的表 多个表多个table声明-->
<table tableName="FOOD">
</table>
</context>
</generatorConfiguration>
3.配置运行命令
运行命令:mybatis-generator:generate
右键项目——》run as——》——》run configurations