mybatis常用db操作實踐總結

 

  • 利用mybatis-codegen插件生成實體類和mapper接口以及XML,推薦maven插件方式使用,可以在eclipse/intellij idea等ide上通用,記得安裝插件
  • 單表查詢使用Example來實現,但是沒有提供api進行group by的操作,可以將in裏的集合遍歷分別取出填入進行查詢,最後將結果拼接起來,這裏只是取單表中每組第一條而已,其他api可自行查找,使用很簡單,實例SQL及代碼實現
    ​
    SELECT  id,xxx FROM `t_user` WHERE   cid IN (1,2,3,4,5,6,7) AND a = 1  AND b=0 GROUP BY id
    
    

     

List<User>userList=new ArrayList<>();
for (Integer id:ids) {
          Example example=new Example(User.class);//User實體類使用插件生成
           Example.Criteria criteria=example.createCriteria();
           criteria.andEqualTo("id",id)
                   .andEqualTo("a",1)
                   .andEqualTo("b",0);
           List<User> subList=UserMapper.selectByExample(example);//UserMapper接口使用插件生成
           //返回結果非空有元素再添加,利用短路與判斷進行更嚴格判斷同時避免空指針
           if(subList!=null&&!subList.isEmpty()){
              userList.add(subList.get(0));

           }
  • 實現通用查詢工具類思路參考:本質就是包裝Example,關鍵性變量有封裝查詢條件的Map<String,Object>,不允許size爲0否則空指針異常、封裝要查找字段的List<String>或者使用String不定參數,封裝排序方式的List<String>或者使用String不定參數,也需要幾個常用的靜態變量如排序的ASC和DESC或者用來區別字段和條件的符號如"_",裏面最關鍵的方法就是如何組裝條件:獲取map的所有key,遍歷key,對key進行拆分,假設使用的區別字段和條件的符號是”_“,那麼最後一個"_"索引後面的字符就是條件,爲了提高可讀性,使用常見的含義來進行定義,比如eq是等於,lt是小於,那麼在Example裏面對應的就是criteria.andEqualTo(property, value),這個value就是剛剛key的value,對於條件是大於小於的情況直接使用Integer轉型,對於各種操作的選擇區分,考慮使用switch,swith會生成一個跳轉表(最底層是全部的值,從底層再往上的分層是爲了提高查詢速度的冗餘值,查找速度的提高可以用二分查找算法來理解,都是通用不斷縮短查找範圍來提高查找速度,在數據結構上又和MySQL的B+樹有異曲同工之妙)來對應實際分支地址,用空間換取時間,在分支較多的情況下,相較於if-else它可以直接定位到對應的操作條件,效率更高,最後,對於組件好條件、要查詢的字段、定義好排序方式就可以返回example了

     

  • 多表查詢,如左連接left join等,推薦還是在xml文件寫sql,先使用mybatis-codegen插件生成實體類和mapper接口以及XML,然後自己在xml文件中補充SQL語句,如果找不到xml中SQL標籤上id對應的方法,可以在yml文件中添加配置,注意yml文件格式相當嚴格,行間一個tab,冒號後的value和冒號距離一個空格,mybatis:mapper-locations: "xxx/mapper/*.xml",也或者如果找不到mapper可在接口裏添加註解@Mapper

  • 分頁查詢

  1. XML方式
  2. Example方式
 //偏移量爲0,即表示第一頁,每頁10條數據,或者是等於SQL語句中的limit 10,前十條數據
List<User> objs11= this.userMapper.selectByRowBounds(obj,new RowBounds(0,10));

 

List<User> objs12=userMapper.selectByExampleAndRowBounds(example,new RowBounds(0,10));
  • 補充:group by使用要謹慎,如果查詢是每個分組的所有數據,需要再使用group_concat函數,如果只查詢每組第一個,就不需要使用該函數了,默認使用逗號分隔,可修改分隔符號,下例每個id有多條記錄,每條記錄的xxx字段字段都不一致
    SELECT  id,GROUP_CONCAT(xxx) FROM `t_user` WHERE   cid IN (1,2,3,4,5,6,7) AND a = 1  AND b=0 GROUP BY id
  • 插入操作,insert、insertSelective:
  1. 如果是用前者 那麼就會插入id值 這樣以後插入的主鍵值自動增長就從那個最新插入的id開始;如果是後者就自動增長
  2. 使用insert時執行的sql語句爲:insert into student(id,name,age) values (1,‘zhangsan’,null);而使用insertSelective時執行的sql語句爲:insert into student(id,name) values (1,‘zhangsan’);

xxxMapper.insertSelective(xxx);
  • 補充:創建表時如果字段使用了關鍵字,那麼在SQL中需要在該字段上加單引號是錯誤的,應該是製表符上面這個鍵的按鍵的符號,或者不需要這個字段直接使用類似以下這種方式來調用
Example entityExample = Example.builder(Entity.class)
                .select("askId","pass")//查詢的字段
                .where(Sqls.custom().andEqualTo("anid", deleteAnid))//查詢的條件
                .build();
  • 數據庫出現編碼問題,檢查數據庫編碼,檢查表編碼,檢查字段編碼,修改字段編碼SQL語句:
    alter table 表名 change 字段名 字段名 類型 character set utf8;
  • 自動生成代碼工具使用時要注意一些數據類型是否被改變成了Boolean類型 ,是否需要修改爲原類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章