栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java的MyBatis框架中实现多表连接查询和查询结果分页

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java的MyBatis框架中实现多表连接查询和查询结果分页

实现多表联合查询

还是在david.mybatis.model包下面新建一个Website类,用来持久化数据之用,重写下相应toString()方法,方便测试程序之用。

package david.mybatis.model;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Website {
  private int id;
  private String name;
  private int visitorId;
  private int status;
  private Date createTime;
  private Visitor visitor;

  public Website() {
    // TODO Auto-generated constructor stub
    createTime = new Date();
    visitor = new Visitor();
  }

  public Website(String name, int visitorId) {
    this.name = name;
    this.visitorId = visitorId;
    visitor = new Visitor();
    status = 1;
    createTime = new Date();
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public Visitor getVisitor() {
    return visitor;
  }

  public void setVisitor(Visitor visitor) {
    this.visitor = visitor;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getStatus() {
    return status;
  }

  public void setStatus(int status) {
    this.status = status;
  }

  public Date getCreateTime() {
    return createTime;
  }

  public void setCreateTime(Date createTime) {
    this.createTime = createTime;
  }

  public int getVisitorId() {
    int id = 0;
    if (visitor == null)
      id = visitorId;
    else
      id = visitor.getId();
    return id;
  }

  public void setVisitorId(int visitorId) {
    this.visitorId = visitorId;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder(String.format("Website=> {Id:%d, Name:%s, CreateTime:%s}rn", id, name,
 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime)));
    if (visitor != null)
      sb.append(String.format("Visitor=> %s", visitor.toString()));
    return sb.toString();
  }
}

在david.mybatis.demo下面分别新建相应的操作接口:

package david.mybatis.demo;

import java.util.List;
import david.mybatis.model.Website;

public interface IWebsiteOperation {
  
  public int add(Website website);
  
  public int delete(int id);
  
  public int update(Website website);
  
  public Website query(int id);
  
  public List getList();
  
}

在mapper文件夹下新建WebsiteMapper.xml映射文件,分别参照上一张所说的把增删改查的单表操作配置分别放进去,这样你可以建造一点测试数据。如下




  
    select id,
    name, VisitorId, status, createTime from Website
    where status>0
  
  
    insert into Website (Name, VisitorId, Status, CreateTime)
    values (#{name}, #{visitorId}, #{status}, #{createTime})
  
  
    delete from website where
    status>0 and id = #{id}
  
  
    update website set
    name=#{name} where status>0 and id=#{id}
  
  
  
    


这里今天主要说的就是那个查,现在我们想要查询网站的同时分别把相应的访问者信息一起拿出来,怎么做呢,大家可以参照配置中的query,写下联表查询的SQL,

这里主要要注意的是,Website实体与Visit的实体里面Id与Name这2个属性都是一样的,所以为了避免映射出现出错现象,把相应的查询结果列起上不一样的别名,这样绑定的时候就可以避免。

假如我像下面一样配置会得到什么呢?

节点id与参数类型参照前几章的方式配置好,如下此处新增的id就为getListByPagenate,配置好以后如下




  
  
    insert into Visitor (Name, Email, Status, CreateTime)
    values (#{name}, #{email}, #{status}, #{createTime})
  
  
    delete from Visitor where
    status>0 and id = #{id}
  
  
    update Visitor set Name =
    #{name}, Email=#{email}, Status=#{status} where id=#{id} and Status>0;
  
  
    select *
    from visitor where id=#{id} and
    Status>0 order by Id
  
  
  
    select * from Visitor where
    status>0
  
  
  
    
    
    
    
    
  
  
    select * from (
     
    ) t 
    
      limit #{pageStart}, #{pageSize}
    
  
  
    order by ${orderFieldStr} ${orderDirectionStr}
  


  在上面你会发现有类似,下图中的配置,这里面的字段属性都是针对PagenateArgs参数类中的属性名,保持一致。


  limit #{pageStart}, #{pageSize}

   在DemoRun类中创建测试方法:


public static void queryVisitorListWithPagenate(int pageIndex, int pageSize, String orderField, String orderDire) {
  PagenateArgs args = new PagenateArgs(pageIndex, pageSize, orderField, orderDire);
  SqlSession session = MybatisUtils.getSqlSession();
  IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
  List visitors = vOperation.getListByPagenate(args);
  for (Visitor visitor : visitors) {
    System.out.println(visitor);
  }
  MybatisUtils.closeSession(session);
  MybatisUtils.showMessages(CRUD_Enum.List, visitors.size());
}

DemoRun.queryVisitorListWithPagenate(0, 100, "id", SortDirectionEnum.DESC.toString());

运行后下测试结果,先按Id倒序排列,查的Visitor表一共有14条记录,

假设我们取在第2页取5条,执行下面也就是6-10条数据,这样传参数就行了

DemoRun.queryVisitorListWithPagenate(1, 5, "id", SortDirectionEnum.DESC.toString());

结果如下:

这样就自己实现了的一个分页逻辑啦~^0^,这里需要注意的就是我这边orderFieldStr字段是没有做过任何判断的,理论上要处理下防止错误了列名传进去,不过现在网上应该有现成封装好的东西,大家也可以去google下,这里只是给个思路演示下怎么用mybatis分页。

  完成这个后,因为是Mysql的关系所以在查询结果里他没有自带rownum序列ID,所以查看测试数据是第几条的时候可能不明显,不zao急,我们可以自己动手丰衣足食改造下上面的方法,这里我重新在model包里新建一个一模一样的VisitorWithRn实体里面多带一个rownum参数持久化返回的RownumID,如下:

package david.mybatis.model;

import java.text.SimpleDateFormat;
import java.util.Date;

public class VisitorWithRn {
  private int id;
  private String name;
  private String email;
  private int status;
  private Date createTime;
  private int rownum;

  public VisitorWithRn() {
    // TODO Auto-generated constructor stub
    createTime = new Date();
  }

  public VisitorWithRn(String name, String email) {
    this.name = name;
    this.email = email;
    this.setStatus(1);
    this.createTime = new Date();
  }

  public int getId() {
    return id;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public String getEmail() {
    return email;
  }

  public Date getCreateTime() {
    return createTime;
  }

  public int getStatus() {
    return status;
  }

  public void setStatus(int status) {
    this.status = status;
  }

  public int getRownum() {
    return rownum;
  }

  public void setRownum(int rownum) {
    this.rownum = rownum;
  }

  @Override
  public String toString() {
    // TODO Auto-generated method stub
    return String.format("{Rownum:%d, Id: %d, Name: %s, CreateTime: %s}", rownum, id, name,
 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime));
  }
}

在IVisitorOperation里面在新建一个名为 public List getListByPagenateWithRn(PagenateArgs args)的方法,同样我们需要在VisitorMapper中配置下相应 select Id, Name, Email, Status, CreateTime from visitor where id=#{id} and Status>0 order by Id select * from Visitor where status>0 select * from ( ) t limit #{pageStart}, #{pageSize} order by ${orderFieldStr} ${orderDirectionStr}