MyBatis中的延时加载
在操作数据库时,尽量查询单表,因为查询单表的效率最高。但很多时候难免要进行多表查询,这时使用延迟加载,就可以提高关联查询的效率。并且延迟加载只能使用resultMap。
配置延时加载
在全局配置XML文件的setting配置中开启懒加载模式
<settings>
<!--懒加载配置-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 | true / false | false |
aggressiveLazyLoading | 开启时,任一方法的调用都会加载该对象的所有延迟加载属性.否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods )。 | true / false | false (在 3.4.1 及之前的版本中默认为 true) |
- 这里有一个小技巧:如果要在一个XML文件中引用另外一个XML文件中的SQL语句,就需要使用另一个XML文件的命名空间.id号。
我们主要是使用resultMap
标签配置延时加载,因为resultMap
在进行高级映射时使用association
和colletion
实现一对一和一对多映射,而association
和collection
具备延时加载功能。因此我们只能使用resultMap
进行配置延时加载。它的主要查询步骤是:先进行单表查询,需要时再从关联表中查询数据,这样能大大提高数据库的性能,因为单表查询要比多表查询快。
测试延迟加载
在resultMap中使用association为例进行说明:
- 场景:博客MyBatis高级映射中一对一映射所使用的场景。
- 使用到association中的select标签加载Statement的ID。
- 查询语句如下:
<select id="getOrdersByNumber" parameterType="java.lang.String" resultMap="OrderUserResultMap">
select * from orders where number= #{number};
</select>
- XML配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper:根标签,namespace命令空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="com.tulun.dao.OrdersMapper">
<resultMap id="OrdersResultMap" type="com.tulun.Mybatis_Demo.Orders">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
<result column="note" property="note"/>
</resultMap>
<resultMap id="OrderUserResultMap" extends="OrdersResultMap" type="com.tulun.Mybatis_Demo.Orders">
<!--association的resultMap属性执行已存在的Map的全路径名-->
<association property="user" column="id={user_id}" select="com.tulun.dao.UserMapper.getUserById"/>
</resultMap>
<select id="getOrdersByNumber" parameterType="java.lang.String" resultMap="OrderUserResultMap">
select * from orders where number= #{number};
</select>
</mapper>
- 执行结果:进行单表查询
MyBatis中的逆向工程
MyBatis是目前很流行的持久层框架,其逆向工程更是大大缩减了我们的开发时间。所谓MyBatis逆向工程,就是MyBatis会根据我们设计好的数据表,自动生成pojo、mapper以及mapper.xml等相关的代码,从而极大的减少了开发人员的工作量。
-
MyBatis-Generator是MyBatis和IBatis的代码生成器,可以生成简单CRUD操作的XML配置文件,Mapper的接口文件(Mapper接口)、实体类(POJO类),可以有效的减少开发者的工作量,减少写手动写SQL的过程,减少出错的风险。
-
思想:需要先将数据库中表生成,包含字段,字段属性可以来映射生成pojo类以及基本的额Mapper的XML文件和Mapper接口文件。
-
Generator的官网:http://mybatis.org/generator/index.html
Generator的使用步骤
- 以博客MyBatis高级映射中
user
表生成代码为例。
1、引入依赖
<!--generator的依赖-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
2、配置逆向工程的XML配置文件
<!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:必填,上下文的ID,用于在生成错误时提示
targetRuntime:
Mybatis3:用于生成mybatis 3.0以上版本的内容,包含XXXBySample
Mybatis3Simple:类似于mybatis3,但是不生成XXXBySample
-->
<context id="simple" targetRuntime="MyBatis3Simple">
<!--
数据库连接的信息:驱动类,连接的地址,账号,密码
-->
<jdbcConnection
driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="123456"/>
<!--
生成pojo类信息
targetPackage:生成pojole类的包路径
targetProject:生成pojo类的位置
-->
<javaModelGenerator targetPackage="com.tulun.pojo" targetProject="src/main/java">
<!--
enableSubPackages:是否生成schema作为包的后缀
-->
<property name="enableSubPackages" value="false" />
<!--
trimStrings:从数据库返回的值清理前后的空格
-->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--
生成Mapper.xml文件的配置信息
-->
<sqlMapGenerator targetPackage="com.tulun.mapper" targetProject="src/main/resources"/>
<!--
生成Mapper的接口文件的配置
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.tulun.mapper" targetProject="src/main/java"/>
<!--指定数据库的表-->
<table tableName="user" />
</context>
</generatorConfiguration>
3、通过Java代码生成相关代码
import org.apache.ibatis.io.Resources;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class GeneratorDemo {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//读取配置文件的
File configFile = Resources.getResourceAsFile("Generator.xml");
// File configFile = new File("mybatis-generator.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
- 执行结果: