<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
有時候我們如果要對傳入的SQL驗證語法方面怎麼辦呢,首先我們是不是要有一條完整的SQL,而且讓mybatis去執行,這是小白最近遇到的,對於使用者輸入進來的語法與引數,進行拼接並且去執行,判斷SQL語句有沒有語法錯誤。
建立一個SQL工具進行SQL處理再返回完整的SQL語句
1.建立工具類
public class SqlProviderUtils { public String sqlProvider(Map<String, Object> para) { // 要替換一些欄位的SQL(例子 select * from ${table} where ${filter}) String str = para.get("sql").toString(); // 引數用於替換SQL中的一些東西(例子: table ,filter 預設值 1=1) List<Params> paramsList = (List<Params>) para.get("ParamsList"); List<Integer> head = new ArrayList(); List<Integer> tail = new ArrayList(); int headNum = 0; int tailNum = 0; List allStr = new ArrayList(); // 每個${ 與 } 的位置 int headPos = str.indexOf("${"); int tailPos = str.indexOf("}"); while (headPos > -1){ if (headPos == headNum + 3) { head.set(head.size()-1, headPos); tail.set(tail.size() - 1, tailNum); } else { head.add(headPos); tail.add(tailPos); } headNum = headPos; tailNum = tailPos; headPos = str.indexOf("${", headPos + 1); tailPos = str.indexOf("}", tailPos + 1); } for (int i = 0; i < head.size(); i++) { allStr.add(str.substring(head.get(i)+2, tail.get(i))); } // 這裡是針對上面儲存的一些要替換的欄位進行替換,具體怎麼操作得詳細理解程式碼 for (int i=0; i<paramsList.size(); i++) { str = str.replace("${"+allStr.get(par-1)+"}.${"+paramsList.get(i).getName()+"}","a表"); } return str; } }
2.在mapper中建立方法呼叫
// SqlProviderUtils上述類,sqlProvider上述的類方法 @SelectProvider(type = SqlProviderUtils.class, method = "sqlProvider") List<HaoDTO> sqlTemTest(@Param("sql") String sqlTemplate,@Param("ParamsList") List ParamsList);
3.controller與server沒啥東西就一些三層呼叫這裡不寫
1.server層
@Override @Transactional public Boolean testTemplate(Param param) { String str = Param.getSql(); List<Params> paramsList = Param.getParamsList(); List<Integer> head = new ArrayList(); List<Integer> tail = new ArrayList(); Boolean templateType = true; int headNum = 0; int tailNum = 0; List allStr = new ArrayList(); int headPos = str.indexOf("${"); int tailPos = str.indexOf("}"); while (headPos > -1){ if (headPos == headNum + 3) { head.set(head.size()-1, headPos); tail.set(tail.size() - 1, tailNum); } else { head.add(headPos); tail.add(tailPos); } headNum = headPos; tailNum = tailPos; headPos = str.indexOf("${", headPos + 1); tailPos = str.indexOf("}", tailPos + 1); } for (int i = 0; i < head.size(); i++) { try { allStr.add(str.substring(head.get(i)+2, tail.get(i))); } catch (StringIndexOutOfBoundsException e) { templateType = false; } } for (int i=0; i<paramsList.size(); i++) { str = str.replace("${"+allStr.get(par-1)+"}.${"+paramsList.get(i).getName()+"}", "b_quality_template"); } try { if(templateType){ baseMapper.sqlTest(str); } } catch (Exception e){ templateType = false; } return templateType; }
2.mapper層
@Select("${sqlStr}") List<Map<String, Object>> sqlTest(@Param(value = "sqlStr") String sqlStr);
3.其他東西也只是一些呼叫
以上只是說明下mybatis中怎麼直接處理sql語句,重點在mapper其他是欄位處理,這是小白弄畢設時考慮到的需求有點簡單莫見怪。
呼叫mybatis某個物件的方法,執行mapper檔案中的sql語句
1.定義mybatis主組態檔的位置, 從類路徑開始的相對路徑——讀取主組態檔裡面的資訊(1.連線資料庫:建立、連線物件的必要資料。2.mapper:找到要執行的sql語句)
2.讀取主組態檔。使用mybatis框架中的Resources類
3.建立SqlSessionFactory物件, 使用SqlSessionFactoryBuidler類
4.獲取SqlSession物件
5.指定要執行的sql語句的id
6.通過SqlSession的方法,執行sql語句
7.關閉SqlSession物件
@Test public void testSelectStudentById2() throws IOException { //呼叫mybatis某個物件的方法,執行mapper檔案中的sql語句 //mybatis核心類: SqlSessionFactory //1.定義mybatis主組態檔的位置, 從類路徑開始的相對路徑 String config = "mybatis.xml"; //2.讀取主組態檔。使用mybatis框架中的Resources類 InputStream inputStream = Resources.getResourceAsStream(config); //3.建立SqlSessionFactory物件, 使用SqlSessionFactoryBuidler類 // 每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的範例為核心的。 // SqlSessionFactory 的範例可以通過 SqlSessionFactoryBuilder 獲得。 // 而 SqlSessionFactoryBuilder 則可以從 XML 組態檔或一個預先設定的 Configuration 範例來 // 構建出 SqlSessionFactory 範例。 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //既然有了 SqlSessionFactory,顧名思義,可以從中獲得 SqlSession 的範例。 // SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法。 // 你可以通過 SqlSession 範例來直接執行已對映的 SQL 語句。 //4.獲取SqlSession物件。 SqlSession session = factory.openSession(); //5.指定要執行的sql語句的 id // sql的id = namespace+"."+ select|update|insert|delete標籤的id屬性值 String sqlId = "com.bjpowernode.dao.StudentDao" + "." + "selectStudentById"; // 6.通過SqlSession的方法,執行sql語句 Student student = session.selectOne(sqlId,1002); System.out.println("使用mybatis查詢一個學生:" + student); // 7.關閉SqlSession物件 session.close(); }
這些僅為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45