1. 程式人生 > >SSM框架 Mybatis聯合查詢 多表查詢 分頁

SSM框架 Mybatis聯合查詢 多表查詢 分頁

這篇文章主要介紹了Java的MyBatis框架中實現多表連線查詢和查詢結果分頁,藉助MyBatis框架中帶有的動態SQL查詢功能可以比普通SQL查詢做到更多,需要的朋友可以參考下

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}\r\n", 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<Website> getList();

}

在mapper資料夾下新建WebsiteMapper.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="david.mybatis.demo.IWebsiteOperation">
  <sql id="getListSql">
    select id,
    name, VisitorId, status, createTime from Website
    where status>0
  </sql>
  <insert id="add" parameterType="Website" useGeneratedKeys="true"
    keyProperty="Id">
    insert into Website (Name, VisitorId, Status, CreateTime)
    values (#{name}, #{visitorId}, #{status}, #{createTime})
  </insert>
  <delete id="delete" parameterType="int">
    delete from website where
    status>0 and id = #{id}
  </delete>
  <update id="update" parameterType="Website">
    update website set
    name=#{name} where status>0 and id=#{id}
  </update>
  <select id="query" parameterType="int" resultMap="websiteRs">
    select
    Website.id siteId, Website.name siteName, Visitor.Id visitorId,
    Visitor.name visitorName,
    Website.status siteStatus, Website.createtime
    siteCreateTime from Website
    inner join Visitor on Website.visitorid =
    Visitor.id where Website.status>0 and
    Website.id=#{id}
  </select>
  <resultMap type="Website" id="websiteRs">
    <id column="siteId" property="id" />
    <result column="siteName" property="name" />
    <result column="siteStatus" property="status" />
    <result column="siteCreateTime" property="createTime" />
    <association property="visitor" javaType="Visitor" resultMap="visitorRs" />
  </resultMap>
  <resultMap type="Visitor" id="visitorRs">
    <id column="visitorId" property="id" />
    <result column="visitorName" property="name" />
  </resultMap>
  <select id="getList" resultMap="websiteByVisitorIdRs">
  <include refid="getListSql" />
  </select>  
</mapper>

這裡今天主要說的就是那個查,現在我們想要查詢網站的同時分別把相應的訪問者資訊一起拿出來,怎麼做呢,大家可以參照配置中的query,寫下聯表查詢的SQL,
這裡主要要注意的是,Website實體與Visit的實體裡面Id與Name這2個屬性都是一樣的,所以為了避免映射出現出錯現象,把相應的查詢結果列起上不一樣的別名,這樣繫結的時候就可以避免。
假如我像下面一樣配置會得到什麼呢?

<select id="query" parameterType="int" resultMap="websiteRs">
  select
  Website.id, Website.name siteName, Visitor.Id,
  Visitor.name visitorName,
  Website.status siteStatus, Website.createtime
  siteCreateTime from Website
  inner join Visitor on Website.visitorid =
  Visitor.id where Website.status>0 and
  Website.id=#{id}
</select>
<resultMap type="Website" id="websiteRs">
  <id column="id" property="id" />
  <result column="siteName" property="name" />
  <result column="siteStatus" property="status" />
  <result column="siteCreateTime" property="createTime" />
  <association property="visitor" javaType="Visitor"
    resultMap="visitorRs" />
</resultMap>
<resultMap type="Visitor" id="visitorRs">
  <id column="id" property="id" />
  <result column="visitorName" property="name" />
</resultMap>

有木有發覺,Visitor的Id也變成2了,這個其實它預設映射了Website的ID,因為SQL語句查詢出來的結果2個ID都是變成2了,有人會問為什麼不是4呢,因為他預設匹配第一個如果你把Website.Id與Visit.Id的位置,相互換下就會發現結果又神奇的變了

所以需要起個別名避免這種情況,這樣你就會發現真相其實只有一個就是下面的:

大家可以看到其實多表處理resultMap的方式和單表是一致的,也無非是吧列明與Javabean屬性名成對應上去,可以看到在Website的節點裡面前臺另外一個resultMap,他就是代表Visit實體所需要對映的實體,可以使用以下方式進行關聯

<association property="visitor" javaType="Visitor" resultMap="visitorRs" />

其中的visitor就是Website實體中的visit欄位名,必須保證名稱一致,否則就會丟擲There is no getter for property named ‘XXX’ in ‘class david.mybatis.model.Website’的異常,這在上幾章已經講述了,當然如果你覺得不用巢狀resultMap也行,巢狀也是出於其他地方可以還要用到這個配置那就提煉出來的過程,也是抽象出來的一種思想。具體使用中的ID與Result可以從官網查詢相應區別說明:http://mybatis.github.io/mybatis-3/sqlmap-xml.html#Result_Maps
這樣,一個簡單的多表聯合查詢就出來啦~,如果還有更加複雜的查詢業務費是在這個基礎上些許的變通修改。
分頁效果邏輯
下面要講的是關於一個業務問題中我們常碰到的分頁問題。在開發web專案的時候我們經常會使用到列表顯示,一般我們都會用一些常用的列表控制元件例如,datatables(個人感覺十分不錯),easy ui下面的那些封裝好的表格控制元件。
  思路:在這些控制元件裡要達到分頁的效果,一般都會傳2個引數,第一個是表示當前頁的索引(一般從0開始),第二個表示當前頁展示多少條業務記錄,然後將相應的引數傳遞給List getList(PagenateArgs args)方法,最終實現資料庫中的分頁時候我們可以使用limit關鍵詞(針對mysql)進行分頁,如果是oracle或者sql server他們都有自帶的rownum函式可以使用。
  針對上述思路,首先我們需要還是一如既往的在demo.mybatis.model下面新建一個名為PagenateArgs的分頁引數實體類與一個名為SortDirectionEnum的列舉類,裡面包含當前頁面索引pageIndex, 當前頁展示業務記錄數pageSize, pageStart屬性表示從第幾條開始,(pageStart=pageIndex*pageSize)因為limit關鍵詞用法是表示【limit 起始條數(不包含),取幾條】,orderFieldStr排序欄位,orderDirectionStr 排序方向,所以具體建立如下:
package david.mybatis.model;

/*
 * 分頁引數實體類
 */
public class PagenateArgs {
  private int pageIndex;
  private int pageSize;
  private int pageStart;
  private String orderFieldStr;
  private String orderDirectionStr;

  public PagenateArgs() {
    // TODO Auto-generated constructor stub
  }

  public PagenateArgs(int pageIndex, int pageSize, String orderFieldStr, String orderDirectionStr) {
    this.pageIndex = pageIndex;
    this.pageSize = pageSize;
    this.orderFieldStr = orderFieldStr;
    this.orderDirectionStr = orderDirectionStr;
    pageStart = pageIndex * pageSize;
  }

  public int getPageIndex() {
    return pageIndex;
  }

  public int getPageStart() {
    return pageStart;
  }

  public int getPageSize() {
    return pageSize;
  }

  public String orderFieldStr() {
    return orderFieldStr;
  }

  public String getOrderDirectionStr() {
    return orderDirectionStr;
  }
}

package david.mybatis.model;

/*
 * 排序列舉
 */
public enum SortDirectionEnum {
  /*
   * 升序
   */
  ASC,

  /*
   * 降序
   */
  DESC
}

  完成上面的步驟以後我們在IVisitorOperation介面類中繼續新增一個方法public List getListByPagenate(PagenateArgs args),前幾章中我們其實已經有getList方法了,這次的分頁其實也就是在這個的基礎上稍加改動即可,IVisitorOperation介面類改動後如下所示:

package david.mybatis.demo;

import java.util.List;
import david.mybatis.model.PagenateArgs;
import david.mybatis.model.Visitor;
import david.mybatis.model.VisitorWithRn;

public interface IVisitorOperation {
  /*
   * 基礎查詢
   */
  public Visitor basicQuery(int id);

  /*
   * 新增訪問者
   */
  public int add(Visitor visitor);

  /*
   * 刪除訪問者
   */
  public int delete(int id);

  /*
   * 更新訪問者
   */
  public int update(Visitor visitor);

  /*
   * 查詢訪問者
   */
  public Visitor query(int id);

  /*
   * 查詢List
   */
  public List<Visitor> getList();

  /*
   * 分頁查詢List
   */
  public List<Visitor> getListByPagenate(PagenateArgs args);  
}

  接下來我們就要開始動手改動我們的VisitorMapper.xml配置檔案了,新增一個節點id與引數型別參照前幾章的方式配置好,如下此處新增的id就為getListByPagenate,配置好以後如下

<?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="david.mybatis.demo.IVisitorOperation">
  <!-- useGeneratedKeys="true"代表是否使用自增長序列, keyProperty="Id"指定自增長列是哪一列, parameterType="Visitor"指定IVisitorOperation介面類中定義中所傳的相應型別 -->
  <insert id="add" parameterType="Visitor" useGeneratedKeys="true"
    keyProperty="Id">
    insert into Visitor (Name, Email, Status, CreateTime)
    values (#{name}, #{email}, #{status}, #{createTime})
  </insert>
  <delete id="delete" parameterType="int">
    delete from Visitor where
    status>0 and id = #{id}
  </delete>
  <update id="update" parameterType="Visitor">
    update Visitor set Name =
    #{name}, Email=#{email}, Status=#{status} where id=#{id} and Status>0;
  </update>
  <select id="query" parameterType="int" resultType="Visitor">
    select Id,
    Name, Email, Status, CreateTime from visitor where id=#{id} and
    Status>0 order by Id
  </select>
  <select id="basicQuery" parameterType="int" resultType="Visitor">
    select *
    from visitor where id=#{id} and
    Status>0 order by Id
  </select>
  <select id="getList" resultMap="visitorRs">
    <include refid="getListSql" />
  </select>
  <sql id="getListSql">
    select * from Visitor where
    status>0
  </sql>
  <!-- 以下為新增部分用來分頁,orderBySql這個提取出來是為了後面有示例複用 -->
  <resultMap type="Visitor" id="visitorRs">
    <id column="Id" property="id" />
    <result column="Name" property="name" />
    <result column="Email" property="email" />
    <result column="Status" property="status" />
    <result column="CreateTime" property="createTime" />
  </resultMap>
  <select id="getListByPagenate" parameterType="PagenateArgs"
    resultType="Visitor">
    select * from (
    <include refid="getListSql" /> <include refid="orderBySql"/>
    ) t <!-- #{}表示引數化輸出,${}表示直接輸出不進行任何轉義操作,自己進行轉移 -->
    <if test="pageStart>-1 and pageSize>-1">
      limit #{pageStart}, #{pageSize}
    </if>
  </select>
  <sql id="orderBySql">
    order by ${orderFieldStr} ${orderDirectionStr}
  </sql>
</mapper>

  在上面你會發現有類似,下圖中的配置,這裡面的欄位屬性都是針對PagenateArgs引數類中的屬性名,保持一致。

<if test="pageStart>-1 and pageSize>-1">
  limit #{pageStart}, #{pageSize}
</if>

  在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<Visitor> 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());

結果如下:
201646153410351.png (598×334)
這樣就自己實現了的一個分頁邏輯啦~^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中配置下相應節點與指令碼,此處唯一的不同就是需要改下sql指令碼,如下:

<?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="david.mybatis.demo.IVisitorOperation">
  <!-- useGeneratedKeys="true"代表是否使用自增長序列, keyProperty="Id"指定自增長列是哪一列, parameterType="Visitor"指定IVisitorOperation介面類中定義中所傳的相應型別 -->
  <insert id="add" parameterType="Visitor" useGeneratedKeys="true"
    keyProperty="Id">
    insert into Visitor (Name, Email, Status, CreateTime)
    values (#{name}, #{email}, #{status}, #{createTime})
  </insert>
  <delete id="delete" parameterType="int">
    delete from Visitor where
    status>0 and id = #{id}
  </delete>
  <update id="update" parameterType="Visitor">
    update Visitor set Name =
    #{name}, Email=#{email}, Status=#{status} where id=#{id} and Status>0;
  </update>
  <select id="query" parameterType="int" resultType="Visitor">
    select Id,
    Name, Email, Status, CreateTime from visitor where id=#{id} and
    Status>0 order by Id
  </select>
  <select id="basicQuery" parameterType="int" resultType="Visitor">
    select *
    from visitor where id=#{id} and
    Status>0 order by Id
  </select>
  <select id="getList" resultMap="visitorRs">
    <include refid="getListSql" />
  </select>
  <sql id="getListSql">
    select * from Visitor where
    status>0
  </sql>
  <resultMap type="Visitor" id="visitorRs">
    <id column="Id" property="id" />
    <result column="Name" property="name" />
    <result column="Email" property="email" />
    <result column="Status" property="status" />
    <result column="CreateTime" property="createTime" />
  </resultMap>
  <select id="getListByPagenate" parameterType="PagenateArgs"
    resultType="Visitor">
    select * from (
    <include refid="getListSql" /> <include refid="orderBySql"/>
    ) t <!-- #{}表示引數化輸出,${}表示直接輸出不進行任何轉義操作,自己進行轉移 -->
    <if test="pageStart>-1 and pageSize>-1">
      limit #{pageStart}, #{pageSize}
    </if>
  </select>
  <!--提煉出來為了2個示例共用下 -->
  <sql id="orderBySql">
    order by ${orderFieldStr} ${orderDirectionStr}
  </sql>
  <!-- 帶rownum的SQL指令碼書寫方式 -->
  <resultMap type="VisitorWithRn" id="visitorWithRnRs">
    <id column="Id" property="id" />
    <result column="Name" property="name" />
    <result column="Email" property="email" />
    <result column="Status" property="status" />
    <result column="CreateTime" property="createTime" />
    <result column="Rownum" property="rownum" />
  </resultMap>
  <select id="getListByPagenateWithRn" resultMap="visitorWithRnRs">
    <!-- #{}表示引數化輸出,${}表示直接輸出不進行任何轉義操作,自己進行轉移 -->
    select t.Rownum, t.Id, t.Name, t.Email, t.Status, t.CreateTime from (<include refid="getListSqlContainsRn" /> <include refid="orderBySql"/>) t
    <if test="pageStart>-1 and pageSize>-1">
      limit #{pageStart}, #{pageSize}
    </if>
  </select>
  <sql id="getListSqlContainsRn">
    select @rownum:[email protected]+1 Rownum,
    result.id, result.name, result.email, result.status, result.createTime
    FROM (
    select @rownum:=0, Visitor.* from Visitor where
    status>0) result
  </sql>
</mapper>

接下來剩下的就是如剛才在DemoRun下面新增測試方法,完成後你可以看到剛剛的6-10條資料會變成如下

相關推薦

(六)springboot + mybatis plus實現聯查3.X版本

註明 : 上兩篇文章我們講解了springboot+mybatis-plus對於單表的CRUD和條件構造器的使用方法,但是對於我們的實戰專案中多表聯查也是經常會出現的。今天我們就來說下怎麼在springboot+MP模式下實現多表聯查並分頁。 MP推薦使用的是

springboot + mybatis plus實現聯查

auto score ice get pro err type 實現 app 1 配置分頁插件 public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInt

SSM框架 Mybatis聯合查詢 查詢

這篇文章主要介紹了Java的MyBatis框架中實現多表連線查詢和查詢結果分頁,藉助MyBatis框架中帶有的動態SQL查詢功能可以比普通SQL查詢做到更多,需要的朋友可以參考下 Java的MyBatis框架中實現多表連線查詢和查詢結果分頁 實現多表聯合查詢

Hibernate-04 框架第四天 查詢的演示

package test; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hibernate.C

MyBatis中實現查詢

一、 1、Mybatis是實現多表查詢方式   1.1  業務裝配:對兩個表編寫單表查詢語句,在業務(Service)把查詢的兩表結果合併   1.2  使用Auto Mapping 特性,在實現兩表聯合查詢時通過別名完成對映   1.3  使用MyBatis<re

Spring Data JPA 二:實現關聯查詢

最近在對JPA的使用過程中發現對於單表的操作很是方便,但是當設計到多表聯查的時候就需要有一些特殊的操作了。 專案中有一個場景是後臺需要做一個分頁的列表查詢,所需要的資料分散在兩張表中,如果是用mybatis的話直接定義resultMap,然後手寫SQL就可以了。而在JPA中就需要用到JPQL

Day055--MySQL--外來鍵的變種,的關係,單查詢,查詢, 內連線,左右連線,全外連線

表和表的關係 ---- 外來鍵的變種 * 一對多或多對一 多對多 一對一 如何找出兩張表之間的關係 分析步驟: #1、先站在左表的角度去找 是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的一個欄位foreign key 右表一個欄位(通常是id) #2、再站在右表的角度去找 是否右表

MySQL單查詢查詢

(1)查詢欄位,可以指定select *或者某些欄位名 (2)查詢記錄,通過where限定一個條件。如取出dept_no=20的e_name和e_job資訊 obj.selectSql('select e_name,e_job from employee where dept_no=20') (3)and o

Python Flask,資料庫,SQLAlchemy,關聯查詢(查詢),一對關聯

  demo.py(定義模型類,一對多關聯): # coding:utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy # 匯入 app = Flask(__name__) # 通過類物

的複雜查詢----查詢、兩的條件連線、內連線(自連線)、左外連線、右外連線、子查詢查詢

基於兩個或兩個以上的表或檢視的查詢。例如:emp和dept是兩張表。(這兩張表的deptno是共同欄位)    ①通過什麼條件把兩張表關聯(如果不使用條件關聯將產生行數乘積的合集---笛卡爾集)例子:emp表字段包含:每行有自己的名字和id以及自己的上級的id,同時自己的上級

Hibernate Criteria查詢連線-1

最近嘗試用Hibernate的Criteria查詢實現多表連線下的分頁,發現一些Hibernate的奇怪問題:多表連線後的分頁求總條數始終報錯,檢查生成的sql也不正確。研究許久找到問題所在,特貼如下: Mysql指令碼如下: 學生 測試資料,請勿見笑:) /* Navic

查詢------查詢。。。

連結查詢:從多個表中獲取資料時使用。。。。  此時你得使用連結條件。。  通過存在於相對應列中的公共值,一個表中的資料可以被另一個表的資料鏈接,        通常都是主鍵和外來鍵進行連結。 一般連結條件寫在where子句裡。。    select empno,emp.dep

mysql數據庫之單查詢查詢

限制 應用 獲取 ffice 一個 expand 大於 為什麽 min 單表查詢 前期表準備 create table emp( id int not null unique auto_increment, name varchar(20) not null, s

SSM 框架下 使用 EasyUI 整合 PageHelper 實現

準備條件 1  .引入pageHelper 依賴包 <!-- 分頁外掛 -->             <dependency>      

連線問題

專案中有個業務需要多張表的一個連線,還需要根據{size}和{offset}進行分頁,這個時候,問題來了,表連線如果是一對一關係,正常在sql最後分頁,什麼事都沒有,可是,一旦有多對多關係和一對多關係

簡單Java 聯查顯示(初)

            Java 多表聯查分頁顯示 操作步驟: 建立資料庫 使用Servlet 建立Java專案 編寫程式碼 1、資料庫 選用 Oracle 程式碼附上: drop table Score; drop table S

SSM框架整合-實現CRUD,登入和操作

二.專案結構:spring+springmvc+mybatis+maven+mysql+freemark+jetty 三.專案介紹:主要實現登入 crud以及分頁效果 1.登入介面 2.主頁 3.新增頁面 4.編輯頁面 四.搭建 1)準備配置

SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映和查詢

SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映(多表查詢) 問題情境:比如有張表,使用者和使用者詳情,這兩張表裡面沒長表都有一個id欄位,這兩個表的id欄位都是對應的。 實體類裡面分別對應兩個實體類,user和userdetail,還有一個很重要的實

SSM框架MyBatis(二)--查詢查詢結果對映

使用MyBatis這一強大的框架可以解決很多賦值的問題,其中對於子配置檔案中的小細節有很多需要注意的地方,使用這個框架後主要就是對於配置檔案的編寫和配置。 今天我寫了一個多表查詢,表的基本結構如下: 使用者表t_user:使用者編號uid,賬號account,暱稱nickn

Java框架-mybatis連線池、動態sql和查詢

1. mybatis連線池 通過SqlMapConfig.xml設定dataSource type實現連線池的配置 1.1 dataSource標籤type屬性值含義 type=”POOLED”: MyBatis 會建立 PooledDataSource 例項