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 解析实体类多表通用查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器虚拟化底层系统安装,Hyper-V
- 下一篇: mysql memcached java