您好,登錄后才能下訂單哦!
本篇內容介紹了“Mybatis怎么直接執行SQL語句”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
有時候我們如果要對傳入的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類
1)每個基于 MyBatis 的應用都是以一個 SqlSessionFactory的實例為核心的。SqlSessionFactory的實例 可以通過 SqlSessionFactoryBuilder 獲得。而SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先配置的 Configuration實例 來構建出 SqlSessionFactory實例 。
2)既然有了 SqlSessionFactory,顧名思義,可以從中獲得SqlSession的實例。SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。
4.獲取SqlSession對象
5.指定要執行的sql語句的id
sql的id = namespace+"."+ select|update|insert|delete標簽的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(); }
“Mybatis怎么直接執行SQL語句”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。