1. 程式人生 > >學習BeetlSQL總結(2)——查詢API,更新API

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

reat sel RoCE bee 批量 pub 輸出 刪除 ras

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

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

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

如果已經有了Datasource,創建ConnectionSource可以采用如下代碼:

ConnectionSource source = ConnectionSourceHelper.getSingle(datasource);

如果是主從Datasource:

ConnectionSource source = ConnectionSourceHelper.getMasterSlave(master,slaves)

2.查詢API
(1)簡單查詢(自動生成sql)
·public T unique(Class clazz,Object pk)根據主鍵查詢,如果未找到,拋出異常
·public T single(Class clazz,Object pk)根據主鍵查詢,如果沒找到,返回null

·public List all(Class clazz)查詢所有結果集
·public List all(Class clazz,int start,int size)翻頁
·public int allCount(Class<?> clazz)總數
(2)單表查詢
SQLManager提供了Query類可以實現單表查詢操作

 //7.單表查詢
         System.out.println("開始執行單表查詢");
         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類用於單表查詢
執行結果:
技術分享圖片

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

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

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

OFFSET_START_ZERO = true

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

用戶登錄驗證:

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

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

執行結果:
技術分享圖片

(4)通過sqlid查詢,sql語句在md文件中
·public List select(String sqlId,Class clazz,Map<String,Object> paras)根據sqlId來查詢,參數是個map
·public List select(String sqlId,Class clazz,Object paras)根據sqlId來查詢,參數是個pojo
·public List select(String sqlId,Class clazz)根據sqlId來查詢,無參數
·public T selectDSingle(String sqlId,Object paras,Class target)根據sqlid查詢,輸入的是pojo,將對應的唯一值映射成target對象,如果未找到則返回空,需要註意的是有時候需要的結果集本身為空,這時候建議使用unique
·public T selectDSingle(String sqlId,Map<String,Object> paras,Class target)根據sqlid查詢,輸入的是map,將對應的唯一值映射成target對象,如果未找到則返回空,需要註意的是有時候需要的結果集本身為空,這時候建議使用unique
·public T selectUnipue(String sqlId,Object paras,Class target)根據sqlid查詢,輸入的是map或者pojo,將對應的唯一值映射成target對象,如果未找到則拋出異常
·public T selectUnipue(String sqlId,Map<String,Object> paras,Class target)根據sqlid查詢,輸入的是map或者pojo,將對應的唯一值映射成target對象,如果未找到則拋出異常
· public Interger intValue(String id,Object paras)查詢結果映射為Interger,如果找不到,返回null,輸入object
·public Interger intValue(String id,Map paras)查詢結果映射為Interger,如果找不到,返回null,輸入map,其他還有longValue,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開始,自動翻譯為目標數據庫的起始行,如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);
        }

查詢結果:
技術分享圖片
3.翻頁查詢API

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

BeetlSQL提供了一個pageQuery對象,用於web應用的翻頁查詢,BeetSQL假定有sqlId和sqlId$count,兩個sqlid,並用這個來翻頁和查詢結果的總數:如
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());

結果:

技術分享圖片

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

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

執行結果:

技術分享圖片

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

//12.直接執行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);
        }

執行結果:
技術分享圖片

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

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