溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

學習BeetlSQL總結(2)——查詢API,更新API

發(fā)布時間:2020-08-07 15:44:54 來源:網(wǎng)絡 閱讀:26117 作者:墨營 欄目:軟件技術

學習BeetlSQL總結(2)
經(jīng)過上節(jié)的學習,我們已經(jīng)了解了BeetlSQL的基礎,接下來我們深入的學習BeetlSQL
一.BeetlSQL說明
1.獲得SQLManager是系統(tǒng)的核心,它提供了所有的dao方法,獲得SQLManager,可以直接構造SQLManager,并通過單例獲取

ConnectionSource source = ConnectionSourceHelper.getSimple(mysqlDriver, url, userName, password);
        DBStyle mysql = new MySqlStyle();

        // SQL語句放于classpath的sql目錄下
        SQLLoader loader = new ClasspathLoader("/sql");
        // 數(shù)據(jù)庫命名和java命名一樣,所以采用DefaultNameConversion,還有一個UnderlinedNameConversion下劃線風格的
        UnderlinedNameConversion nc = new UnderlinedNameConversion();
        // 最后,創(chuàng)建一個SQLManager,DebugInterceptor,不是必須的,但可以通過它查看SQL的執(zhí)行情況
        SQLManager sqlManager = new SQLManager(mysql, loader, source, nc, new Interceptor[] { new DebugInterceptor() });

如果已經(jīng)有了Datasource,創(chuàng)建ConnectionSource可以采用如下代碼:

ConnectionSource source = ConnectionSourceHelper.getSingle(datasource);

如果是主從Datasource:

ConnectionSource source = ConnectionSourceHelper.getMasterSlave(master,slaves)

2.查詢API
(1)簡單查詢(自動生成sql)
·public T unique(Class clazz,Object pk)根據(jù)主鍵查詢,如果未找到,拋出異常
·public T single(Class clazz,Object pk)根據(jù)主鍵查詢,如果沒找到,返回null
·public List all(Class clazz)查詢所有結果集
·public List all(Class clazz,int start,int size)翻頁
·public int allCount(Class<?> clazz)總數(shù)
(2)單表查詢
SQLManager提供了Query類可以實現(xiàn)單表查詢操作

 //7.單表查詢
         System.out.println("開始執(zhí)行單表查詢");
         List<User> list =
         sqlManager.query(User.class).andEq("name","曼斯坦因").orderBy("create_date").select();
         System.out.println("打印查詢結果:");
         for(User user1:list) {
         System.out.println(user1);
         }

其中sql.query(User.class)返回了Query類用于單表查詢
執(zhí)行結果:
學習BeetlSQL總結(2)——查詢API,更新API

如果是java8,則可以使用lamdba表示列名

List<User> list1  = sql.lambdaQuery(User.class).andEq(User::getName, "hi").orderBy(User::getCreateDate).select();

(3)template查詢
·public T template(T t)根據(jù)模板查詢返回所有符合這個模板的數(shù)據(jù)庫,同上,mapper可以提供額外的映射,如處理一對一,一對多
·public T templateOne(T t)根據(jù)模板查詢,返回一條結果,如果沒有找到,返回null
·public List template(T t,int start,int size)同上,可以翻頁
·public long templateCount(T t)獲取符合條件的個數(shù)
·public List template(Class target,Object paras,long start,long size)模板查詢,參數(shù)是paras,可以是Map或者普通對象
·public long templateCount(Class target,Object paras)獲取符合條件的個數(shù)
翻頁的start,系統(tǒng)默認從一開始,為了兼容各個系統(tǒng)的數(shù)據(jù)庫,會自動翻譯為數(shù)據(jù)庫習俗,比如start為1,會認為mysql,postgres從0開始(從start-1開始),oracle,sqlserver,db2從1開始(start-0)開始
然而,如果你只用特定的數(shù)據(jù)庫,可以按照特定的數(shù)據(jù)庫習俗來,比如你只用mysql,satrt為0代表起始記錄,需要配置

OFFSET_START_ZERO = true

這樣翻頁參數(shù)傳入0即可
注意:template查詢方法根據(jù)模板查詢不包含時間段查詢,也不包含排序,然而,可以通過pojo class上使用@Table Template()或者日期字段的getter方法上使用@DataTemplate(來定制),如下:

用戶登錄驗證:

 //8.使用template方法查詢
         User template=new User();
         template.setUserName("zhukefu");
         template.setPassword("123456");
         template.setStatus(1);執(zhí)行結果:

         User user2=sqlManager.templateOne(template);
         System.out.println("打印template查詢結果:"+user2);

執(zhí)行結果:
學習BeetlSQL總結(2)——查詢API,更新API

(4)通過sqlid查詢,sql語句在md文件中
·public List select(String sqlId,Class clazz,Map<String,Object> paras)根據(jù)sqlId來查詢,參數(shù)是個map
·public List select(String sqlId,Class clazz,Object paras)根據(jù)sqlId來查詢,參數(shù)是個pojo
·public List select(String sqlId,Class clazz)根據(jù)sqlId來查詢,無參數(shù)
·public T selectDSingle(String sqlId,Object paras,Class target)根據(jù)sqlid查詢,輸入的是pojo,將對應的唯一值映射成target對象,如果未找到則返回空,需要注意的是有時候需要的結果集本身為空,這時候建議使用unique
·public T selectDSingle(String sqlId,Map<String,Object> paras,Class target)根據(jù)sqlid查詢,輸入的是map,將對應的唯一值映射成target對象,如果未找到則返回空,需要注意的是有時候需要的結果集本身為空,這時候建議使用unique
·public T selectUnipue(String sqlId,Object paras,Class target)根據(jù)sqlid查詢,輸入的是map或者pojo,將對應的唯一值映射成target對象,如果未找到則拋出異常
·public T selectUnipue(String sqlId,Map<String,Object> paras,Class target)根據(jù)sqlid查詢,輸入的是map或者pojo,將對應的唯一值映射成target對象,如果未找到則拋出異常
· public Interger intValue(String id,Object paras)查詢結果映射為Interger,如果找不到,返回null,輸入object
·public Interger intValue(String id,Map paras)查詢結果映射為Interger,如果找不到,返回null,輸入map,其他還有l(wèi)ongValue,bigDecimalValue
注意:對于Map來說,有一個特殊的key叫著_root,代表了查詢根對象,sql語句中未能找到的變量都會試圖從_root中查找
(5)指定范圍查詢
·public List select(String sqlId,Class clazz,Map<String,Object> paras,int start,int size)查詢指定范圍
·public List select(String sqlId,Class clazz,Object paras,int start,int size)查詢指定范圍
注意:
Beetlsql默認從1開始,自動翻譯為目標數(shù)據(jù)庫的起始行,如mysql的0,oracle的1,如果你想從0開始,需要配置beetlsql
例:(sql使用的是3.翻頁查詢中的sql語句)

// 9.使用sqlid查詢
        List<User> list1 = sqlManager.select("user.queryUser", User.class);
        for (User user3 : list1) {
            System.out.println(user3);
        }

查詢結果:
學習BeetlSQL總結(2)——查詢API,更新API
3.翻頁查詢API

public <T> void pageQuery(String sqlId,Class<T> clazz,PageQuery query)

BeetlSQL提供了一個pageQuery對象,用于web應用的翻頁查詢,BeetSQL假定有sqlId和sqlId$count,兩個sqlid,并用這個來翻頁和查詢結果的總數(shù):如
Sql代碼:


queryUser
====
select * from user order by id desc

queryCountUser
====
select count(1) from user

查詢代碼:

// 10.翻頁查詢
        PageQuery<User> query1 = new PageQuery<User>();
        sqlManager.pageQuery("user.queryCountUser", User.class, query1);
        System.out.println(query1.getTotalPage());
        System.out.println(query1.getTotalRow());
        System.out.println(query1.getPageNumber());

結果:

學習BeetlSQL總結(2)——查詢API,更新API

4.更新API
(1)自動生成sql
·public void insert(Object paras)插入paras到paras關聯(lián)的表
· public void insert(Object paras,boolean autoAssignKey)插入paras對象到paras對象關聯(lián)的表,并且指定是否自動將數(shù)據(jù)庫主鍵賦值到paras里,適用于對于自增或者序列類數(shù)據(jù)庫產(chǎn)生的主鍵
·public void insertTemplate(Object paras)插入paras到paras關聯(lián)的表,忽略null值或者為空值的屬性
·public void insertTemplate(Object paras,boolean autoAssignKey)插入paras到paras關聯(lián)的表,并且指定是否自動將數(shù)據(jù)庫主鍵賦值到paras里,忽略null值或者為空值的屬性,適用于對主鍵自增的數(shù)據(jù)庫產(chǎn)生的主鍵
·public void insert(Class<?> clazz,Object paras) 插入paras到clazz關聯(lián)的表
·public void insert(Class<?> clazz,Object paras,KeyHolder holder)插入paras到clazz關聯(lián)的表
,如果需要主鍵,則調用KeyHolder方法來獲取主鍵,調用此方法主鍵必須自增
·public int insert((Class<?> clazz,Object paras,boolean autoAssignKey)插入paras到clazz關聯(lián)的表,并且指定是否自動將數(shù)據(jù)庫主鍵賦值到paras里,調用此方法主鍵必須自增
·public int updateById(Object obj)根據(jù)主鍵更新,所有值參與更新
·public int updateTemplate(Object obj)根據(jù)主鍵更新,屬性為null不會更新
·public int updateBatchTemplateById(Class clazz,List<?> list)批量根據(jù)主鍵更新,屬性為null的不會更新
·public int updateTemplateById(Class<?> clazz,Map paras)根據(jù)主鍵更新,組件通過clazz的annottion表示,如果沒有,則認為屬性Id是主鍵,屬性為null的不會更新
·public int[] updateByIdBatch(List<?> list)批量更新
·public void insertBatch(Class clazz,List<?> list)批量插入數(shù)據(jù)
(2)根據(jù)sqlId更新(刪除)
·public int insert(String sqlId,Object paras,KeyHolder holder)根據(jù)sqlId插入,并返回主鍵,主鍵id由對象所指定,調用此方法,對應的數(shù)據(jù)庫表必須自增主鍵
·public int insert(String sqlId,Object paras,KeyHolder holder,String keyName)同上,主鍵由keyName指定
·public int insert(Strint sqlId,Map paras,KeyHolder holder,String keyName)同上,參數(shù)通過map提供
·public int update(String sqlId,Object obj)根據(jù)sqlid更新
·public int update(String sql Id,Map<String,Object> paras)根據(jù)sqlId更新,輸出參數(shù)是map
·public int[] updateBatch(Stirng sqlId,List<?> list)批量更新
·public int updateBatch(String sqlId,Map<String,Object>[] maps)批量更新,參數(shù)是個數(shù)組,元素類型是map
5.直接執(zhí)行SQl模板
(1)直接執(zhí)行sql模板語句
·public List execute(String sql,Classs clazz,Object paras)
·public List execute(String sql,Class clazz,Map paras)
·public int executeUpdate(String sql,Object paras)返回成功執(zhí)行條數(shù)
·public int executeUpdate(String sql,Map paras)返回成功執(zhí)行條數(shù)
(2)直接執(zhí)行JDBC的sql語句
·查詢public List execute(SQLReady p,Classs clazz)SQLReady包含了需要執(zhí)行的sql語句和參數(shù),clazz是查詢結果,如:

//11. 直接執(zhí)行sql語句
        List<User> list4 = sqlManager.execute(
                new SQLReady("select * from user where username=? and password=?","zhukefu", "123456"),
                User.class);
        System.out.println("打印list:"+list4);

執(zhí)行結果:

學習BeetlSQL總結(2)——查詢API,更新API

·public PageQuery execute(SQLReady p,Class clazz,PageQuery pageQuery)
例:

//12.直接執(zhí)行sql語句分頁查詢
        PageQuery query3=new PageQuery(1,8);
        String jdbcSql="select * from user order by id";
        sqlManager.execute(new SQLReady(jdbcSql), User.class, query3);
        List<User> list3=query3.getList();
        for(User user3:list) {
            System.out.println(user3);
        }

執(zhí)行結果:
學習BeetlSQL總結(2)——查詢API,更新API

注意:參數(shù)通過SQLReady傳遞,而不是pageQuery
·更新public int executeUpdate(SQLReady p)SQLReady包含了需要執(zhí)行的sql語句和參數(shù),返回新的結果
·直接使用Connection public T executeOnConnection(OnConnection call)使用者需要實現(xiàn)onConnection方法的call方法,如調用存儲過程
【本次總結完畢】

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI