日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL查询多表定义实体类_自己设计一个 JAVA + MyBatis 解析实体类多表通用查询

發布時間:2023/12/10 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL查询多表定义实体类_自己设计一个 JAVA + MyBatis 解析实体类多表通用查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先來處理一下查詢的字段和用到的表吧

//雖然我們使用的時候是實體,但最終還是要解析成sql的,那么我們需要想好解析成sql 時候所用到的東東,提前準備好

class TableEntity {

String tableName; //表的真正名稱肯定是要的

String nickName; //表名的重命名也是要的, 去掉真名的表的下劃線的全英文字母

String idName; //表的主鍵名稱肯定是要的

String logicName; //上面定義了邏輯刪除功能,所以這個邏輯刪除也要

List entityColumns; //實體的字段

List tableColumns; //與實體字段一對一的數據表的字段

Object entity; //與之相關的實體

}

//現在用到數據表實體已經定義好了,是不是要寫個工具將傳入的實體參數解析成 TableEntity 了呢

class TableUtil {

TableEntity toTableEntity(Object entity); //將實體解析成TableEntity

//...

}

//已經有了數據表的描述,那么我們將selectColumns 解析成 sql 的 select 字段完全沒有問題了吧

//將 "user.UserId, user.userName, address.detail, orders" 解析

// ',' 分割去空格, '.' 前后的替換為 nickName,'.' 后面替換為數據表的字段,單獨的 orders 替換為 nickName.[every tableColumn]

class TableUtil {

TableEntity toTableEntity(Object entity); //將實體解析成TableEntity

//添加一個工具來實現吧

String toNativeSelectColumns(String SelectColumns);

}

那么我們再來看看如何實現表的連接吧

/**

傳過來是這樣的參數: new User(), new Address(), new Orders()

簡單的約束弄: 找到 User 表的主鍵(@TableId) 字段的Field名, 匹配 Address中的 Filed名,找到了那么說明用此字段關聯,同樣的方式, 循環向后尋找即可找到所有關聯。但是這樣的簡單的定義約束。user表的主鍵需要為user_id, address表的與user表關聯的字段 必需也要叫user_id,關聯的字段名必須取一樣的名稱,如果想不一樣,可以使用注解,這里先不作介紹。

*/

//那么工具類又新增方法, 這里只作Left Join

class TableUtil {

TableEntity toTableEntity(Object entity); //將實體解析成TableEntity

//添加一個工具來實現吧

String toNativeSelectColumns(String SelectColumns);

//添加left join 方法

List toLeftJoin(Object ...entities);

}

現在已經解決了查找的字段與自動關聯的問題,那么接下來是如何條件查詢了, 前面我們已經定義了 WhereCustomSegment 類了,完善一個思路吧

class WhereCustomSegment {

public WhereCustomSegment(TableEntity ...tableEntities); //構造,我們需要關于數據表的全部信息

WhereCustomSegment where(String tableName);

}

//那么如何實現一個like 方法呢? 如: like("userName", "whoareyou")

//了解 myBatis 這段應該了 user.user_name like #{userName}, 按此救命我們將現在有信息解析為此就相當容易了

stringBuffer

.append(" ")

.append(tableEntity.getNickName()) // 表的nick name

.append(".")

.append(tableEntity.getTableColumns().get(tableEntity.getEntityColumns().indexOf(fieldName))) //通過field名稱找到數據表中的字段

.append(" ")

.append("like ")//opreaction 操作

.append("#{parameter.")

.append(key) // 不重復的key 如 userName

.append("}");

parameter.put(key, value); //將對應的key 和 value 存儲起來,用于調xml時候作為參數傳遞過去

//簡易的思路就完成了

現在已經準備好解析完成的sqlSegment了,那么我們要把他放在myBatis的Xml里,我們定義個MulSelectMapper.java && MulSelectMapper.xml

//MulSelectMapper.java

public interface MulSelectMapper {

public List> multiSelect(MulSelect param);

//分頁統計總數

public Integer countMulSelect(MulSelect param);

}

//MulSelectMapper.xml

select distinct ${selectColumns} from ${masterTable}

left join ${item}

${sqlSegment}

group by ${groupBy}

order by ${orderBy}

limit #{start}, #{end}

現在就差一個通用的service 來調用了 MultipleService.java

public class MultipleService {

MultipleResult multipleSelect(MulSelect param);

}

//調用通用查詢將

總結

以上是生活随笔為你收集整理的MySQL查询多表定义实体类_自己设计一个 JAVA + MyBatis 解析实体类多表通用查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。