myBatis解析(三)------懒加载与逆向工程

一、懒加载
如果此时有以下需求,查询订单信息,有时候需要关联查询出用户信息

我们有两种方法完成:
1.直接关联两张表来查询信息
2.分两步查询,先查询出订单信息,如果需要用户信息,在根据关联条件查询订单信息。

第一种方法是两表关联直接查询出所有的用户与订单信息,需要什么信息直接筛选,这样做比较耗时,且不需要订单信息时也查询了订单信息,数据库压力较大。
第二种方法进行的是都是单表操作,执行效率会高,并且如果不需要用户信息就不用执行第二步。程序无多余操作。

此时第二种方法就是mybatis的懒加载
懒加载其实就是在程序需要的时候再去进行加载也就是说需要查询的时候再去查询,而且从单表查询开始需要时在进行关联表查询。单表查询效率比较高。

2.实例
2.1创建实体类
User.java

package com.ys.lazyload;
import java.util.List;
public class User {
//用户ID
private int id;
//用户姓名
private String username;
//用户性别
private String sex;
//一个用户能创建多个订单,用户和订单构成一对多的关系
public List orders;
public List getOrders() {
return orders;
}
public void setOrders(List orders) {
this.orders = orders;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ "]";
}
}

Orders.java

package com.ys.lazyload;
public class Orders {
//订单ID
private int id;
//用户ID
private int userId;
//订单数量
private String number;
//和用户表构成一对一的关系,即一个订单只能由一个用户创建
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Orders [id=" + id + ", userId=" + userId + ", number=" + number
+ ", user=" + user + "]";
}
}

2.2创建 OrderMapper 接口和 OrderMapper.xml 文件

由于我们采用 Mapper 代理加载 xxxMapper.xml 文件,这里我们重复一下 Mapper 代理所需的条件,接口和xml文件必须满足以下几个条件:
  1、接口必须要和 xml 文件同名且在同一个包下,也就是说 xml 文件中的namespace是接口的全类名  
  2、接口中的方法名和xml 文件中定义的 id 一致
  3、接口输入参数类型要和xml 中定义的 parameterType 一致
  4、接口返回数据类型要和xml 中定义的 resultType 一致

OrderMapper 接口

package com.ys.lazyload;
import java.util.List;
import com.ys.lazyload.Orders;
import com.ys.lazyload.User;
public interface OrdersMapper {
/**
* select * from order //得到user_id
* select * from user WHERE id=1 //1 是上一个查询得到的user_id的值
*/
//得到订单信息(包含user_id)
public List getOrderByOrderId();
//根据用户ID查询用户信息
public User getUserByUserId(int userID);
}

OrderMapper.xml

2.3向mybatis-configuration.xml 配置文件中注册 OrderMapper.xml 文件

2.4开启懒加载配置

2.5测试
@Test
public void testLazy(){
String statement = "com.ys.lazyload.OrdersMapper.getOrderByOrderId";
//创建OrdersMapper对象,mybatis自动生成mapepr代理对象
OrdersMapper orderMapper = session.getMapper(OrdersMapper.class);
List orders = orderMapper.getOrderByOrderId();//第一步
for(Orders order : orders){
System.out.println(order.getUser());//第二步
}
session.close();
}

此时程序执行第一步时会执行select * from orders这段sql。程序执行到第二部才会执行select * from user where id = ?

二、逆向工程
mybatis的操作都是围绕着po类,Mapper.xml文件与Mapper接口文件来进行的。也就是说如果数据库的表很多的话我们就需要手写每张表的po类
Mapper.xml文件与Mapper接口。比较耗时,此时就可以使用逆向工程来自动生成所需文件来省掉这些工作。

1.新建一个工程,并导入相应的jar包

2.创建配置文件 generatorConfig.xml 文件

a、连接数据库的配置,包括数据名称,数据库用户名密码等配置
b、指定要生成代码的包名,包括实体类po的包名,mapper的包名等
c、指定数据库中哪些表需要生成文件

3.运行主程序生成代码
package com.ys.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
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;
public class GeneratorTest {
public void testGenerator() throws Exception{
List warnings = new ArrayList();
boolean overwrite = true;
//指向逆向工程配置文件
File configFile = new File(GeneratorTest.class.getResource("/generatorConfig.xml").getFile());
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);
}
public static void main(String[] args) throws Exception {
try {
GeneratorTest generator = new GeneratorTest();
generator.testGenerator();
} catch (Exception e) {
e.printStackTrace();
}
}
}

然后刷新generatorConfig.xml 文件中指定的包,会发现生成了如下文件

posted @ 2019-05-24 10:49  小小短腿儿  阅读(137)  评论(0)    收藏  举报