Mybatis如何直接執(zhí)行SQL語(yǔ)句
Mybatis直接執(zhí)行SQL語(yǔ)句
有時(shí)候我們?nèi)绻獙?duì)傳入的SQL驗(yàn)證語(yǔ)法方面怎么辦呢,首先我們是不是要有一條完整的SQL,而且讓mybatis去執(zhí)行,這是小白最近遇到的,對(duì)于用戶輸入進(jìn)來(lái)的語(yǔ)法與參數(shù),進(jìn)行拼接并且去執(zhí)行,判斷SQL語(yǔ)句有沒(méi)有語(yǔ)法錯(cuò)誤。
第一種方法
建立一個(gè)SQL工具進(jìn)行SQL處理再返回完整的SQL語(yǔ)句
1.建立工具類
public class SqlProviderUtils {
? ? public String sqlProvider(Map<String, Object> para) {
? ? ? ? // 要替換一些字段的SQL(例子 select * from ${table} where ${filter})
? ? ? ? String str = para.get("sql").toString();
? ? ? ? // 參數(shù)用于替換SQL中的一些東西(例子: table ,filter 默認(rèn)值 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();
? ? ? ? // 每個(gè)${ 與 } 的位置
? ? ? ? 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)));
? ? ? ? }
? ? ? ? // 這里是針對(duì)上面保存的一些要替換的字段進(jìn)行替換,具體怎么操作得詳細(xì)理解代碼
? ? ? ? for (int i=0; i<paramsList.size(); i++) {
? ? ? ? ?str = str.replace("${"+allStr.get(par-1)+"}.${"+paramsList.get(i).getName()+"}","a表"); ?
? ? ? ? }
? ? ? ? return str;
? ? }
}2.在mapper中建立方法調(diào)用
// SqlProviderUtils上述類,sqlProvider上述的類方法
@SelectProvider(type = SqlProviderUtils.class, method = "sqlProvider")
?List<HaoDTO> sqlTemTest(@Param("sql") String sqlTemplate,@Param("ParamsList") List ParamsList);3.controller與server沒(méi)啥東西就一些三層調(diào)用這里不寫
第二種方法
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.其他東西也只是一些調(diào)用
以上只是說(shuō)明下mybatis中怎么直接處理sql語(yǔ)句,重點(diǎn)在mapper其他是字段處理,這是小白弄畢設(shè)時(shí)考慮到的需求有點(diǎn)簡(jiǎn)單莫見(jiàn)怪。
測(cè)試Mybatis執(zhí)行SQL語(yǔ)句步驟
調(diào)用mybatis某個(gè)對(duì)象的方法,執(zhí)行mapper文件中的sql語(yǔ)句
mybatis核心類:SqlSessionFactory
1.定義mybatis主配置文件的位置, 從類路徑開(kāi)始的相對(duì)路徑——讀取主配置文件里面的信息(1.連接數(shù)據(jù)庫(kù):創(chuàng)建、連接對(duì)象的必要數(shù)據(jù)。2.mapper:找到要執(zhí)行的sql語(yǔ)句)
2.讀取主配置文件。使用mybatis框架中的Resources類
3.創(chuàng)建SqlSessionFactory對(duì)象, 使用SqlSessionFactoryBuidler類
- 1)每個(gè)基于 MyBatis 的應(yīng)用都是以一個(gè) SqlSessionFactory的實(shí)例為核心的。SqlSessionFactory的實(shí)例 可以通過(guò) SqlSessionFactoryBuilder 獲得。而SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個(gè)預(yù)先配置的 Configuration實(shí)例 來(lái)構(gòu)建出 SqlSessionFactory實(shí)例 。
- 2)既然有了 SqlSessionFactory,顧名思義,可以從中獲得SqlSession的實(shí)例。SqlSession 提供了在數(shù)據(jù)庫(kù)執(zhí)行 SQL 命令所需的所有方法。可以通過(guò) SqlSession 實(shí)例來(lái)直接執(zhí)行已映射的 SQL 語(yǔ)句。
4.獲取SqlSession對(duì)象
5.指定要執(zhí)行的sql語(yǔ)句的id
- sql的id = namespace+"."+ select|update|insert|delete標(biāo)簽的id屬性值
6.通過(guò)SqlSession的方法,執(zhí)行sql語(yǔ)句
7.關(guān)閉SqlSession對(duì)象
舉例
@Test
public void testSelectStudentById2() throws IOException {
//調(diào)用mybatis某個(gè)對(duì)象的方法,執(zhí)行mapper文件中的sql語(yǔ)句
//mybatis核心類: SqlSessionFactory
//1.定義mybatis主配置文件的位置, 從類路徑開(kāi)始的相對(duì)路徑
String config = "mybatis.xml";
//2.讀取主配置文件。使用mybatis框架中的Resources類
InputStream inputStream = Resources.getResourceAsStream(config);
//3.創(chuàng)建SqlSessionFactory對(duì)象, 使用SqlSessionFactoryBuidler類
// 每個(gè)基于 MyBatis 的應(yīng)用都是以一個(gè) SqlSessionFactory 的實(shí)例為核心的。
// SqlSessionFactory 的實(shí)例可以通過(guò) SqlSessionFactoryBuilder 獲得。
// 而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個(gè)預(yù)先配置的 Configuration 實(shí)例來(lái)
// 構(gòu)建出 SqlSessionFactory 實(shí)例。
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//既然有了 SqlSessionFactory,顧名思義,可以從中獲得 SqlSession 的實(shí)例。
// SqlSession 提供了在數(shù)據(jù)庫(kù)執(zhí)行 SQL 命令所需的所有方法。
// 你可以通過(guò) SqlSession 實(shí)例來(lái)直接執(zhí)行已映射的 SQL 語(yǔ)句。
//4.獲取SqlSession對(duì)象。
SqlSession session = factory.openSession();
//5.指定要執(zhí)行的sql語(yǔ)句的 id
// sql的id = namespace+"."+ select|update|insert|delete標(biāo)簽的id屬性值
String sqlId = "com.bjpowernode.dao.StudentDao" + "." + "selectStudentById";
// 6.通過(guò)SqlSession的方法,執(zhí)行sql語(yǔ)句
Student student = session.selectOne(sqlId,1002);
System.out.println("使用mybatis查詢一個(gè)學(xué)生:" + student);
// 7.關(guān)閉SqlSession對(duì)象
session.close();
}
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 詳解MyBatis直接執(zhí)行SQL查詢及數(shù)據(jù)批量插入
- MyBatis 執(zhí)行動(dòng)態(tài) SQL語(yǔ)句詳解
- MyBatis一次執(zhí)行多條SQL語(yǔ)句的操作
- MyBatis執(zhí)行動(dòng)態(tài)SQL的方法
- MyBatis直接執(zhí)行SQL的工具SqlMapper
- mybatis設(shè)置sql執(zhí)行時(shí)間超時(shí)時(shí)間的方法
- SpringBoot如何打印mybatis的執(zhí)行sql問(wèn)題
- 在mybatis執(zhí)行SQL語(yǔ)句之前進(jìn)行攔擊處理實(shí)例
- MyBatis SQL執(zhí)行流程的使用詳解
相關(guān)文章
Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼分享
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
C# 中Excel導(dǎo)入時(shí)判斷是否被占用三種方法
這篇文章主要介紹了C# 中Excel導(dǎo)入時(shí) 判斷是否被占用三種方法的相關(guān)資料,需要的朋友可以參考下2017-04-04
java導(dǎo)出Excel通用方法的實(shí)例詳解
這篇文章主要介紹了java導(dǎo)出Excel通用方法的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07
在Java中,生成隨機(jī)數(shù)有兩種方法。1是使用Random類。2是使用Math類中的random方法??聪旅娴睦邮褂冒?/div> 2013-11-11
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之食品溯源系統(tǒng)的實(shí)現(xiàn)
這是一個(gè)使用了java+Springboot+Maven+mybatis+Vue+mysql+wd開(kāi)發(fā)的食品溯源系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有食品溯源該有的所有功能,感興趣的朋友快來(lái)看看吧2022-01-01
Java插入修改刪除數(shù)據(jù)庫(kù)數(shù)據(jù)的基本方法
這篇文章主要介紹了Java插入修改刪除數(shù)據(jù)庫(kù)數(shù)據(jù)的基本方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
JeecgBoot頁(yè)面Online報(bào)表配置過(guò)程(動(dòng)態(tài))
文章介紹了如何根據(jù)登錄者角色信息動(dòng)態(tài)配置報(bào)表,并詳細(xì)說(shuō)明了Online報(bào)表的配置步驟,包括數(shù)據(jù)源選擇、字段顯示、查詢條件設(shè)置等,同時(shí),文章還涉及了頁(yè)面代碼部分,包括依賴引入、用戶信息獲取、參數(shù)配置和form表單配置等2026-01-01
Java并發(fā)編程之詳解CyclicBarrier線程同步
在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下2021-06-06最新評(píng)論

