欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis如何直接執(zhí)行SQL語句

 更新時(shí)間:2022年08月19日 16:07:28   作者:Haolale  
這篇文章主要介紹了Mybatis如何直接執(zhí)行SQL語句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Mybatis直接執(zhí)行SQL語句

有時(shí)候我們?nèi)绻獙?duì)傳入的SQL驗(yàn)證語法方面怎么辦呢,首先我們是不是要有一條完整的SQL,而且讓mybatis去執(zhí)行,這是小白最近遇到的,對(duì)于用戶輸入進(jìn)來的語法與參數(shù),進(jìn)行拼接并且去執(zhí)行,判斷SQL語句有沒有語法錯(cuò)誤。

第一種方法

建立一個(gè)SQL工具進(jìn)行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();
? ? ? ? // 參數(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沒啥東西就一些三層調(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)用

以上只是說明下mybatis中怎么直接處理sql語句,重點(diǎn)在mapper其他是字段處理,這是小白弄畢設(shè)時(shí)考慮到的需求有點(diǎn)簡單莫見怪。

測試Mybatis執(zhí)行SQL語句步驟

調(diào)用mybatis某個(gè)對(duì)象的方法,執(zhí)行mapper文件中的sql語句

mybatis核心類:SqlSessionFactory

1.定義mybatis主配置文件的位置, 從類路徑開始的相對(duì)路徑——讀取主配置文件里面的信息(1.連接數(shù)據(jù)庫:創(chuàng)建、連接對(duì)象的必要數(shù)據(jù)。2.mapper:找到要執(zhí)行的sql語句)

2.讀取主配置文件。使用mybatis框架中的Resources類

3.創(chuàng)建SqlSessionFactory對(duì)象, 使用SqlSessionFactoryBuidler類  

  • 1)每個(gè)基于 MyBatis 的應(yīng)用都是以一個(gè) SqlSessionFactory的實(shí)例為核心的。SqlSessionFactory的實(shí)例 可以通過 SqlSessionFactoryBuilder 獲得。而SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個(gè)預(yù)先配置的 Configuration實(shí)例 來構(gòu)建出 SqlSessionFactory實(shí)例 。
  • 2)既然有了 SqlSessionFactory,顧名思義,可以從中獲得SqlSession的實(shí)例。SqlSession 提供了在數(shù)據(jù)庫執(zhí)行 SQL 命令所需的所有方法??梢酝ㄟ^ SqlSession 實(shí)例來直接執(zhí)行已映射的 SQL 語句。

4.獲取SqlSession對(duì)象

5.指定要執(zhí)行的sql語句的id

  • sql的id = namespace+"."+ select|update|insert|delete標(biāo)簽的id屬性值

6.通過SqlSession的方法,執(zhí)行sql語句

7.關(guān)閉SqlSession對(duì)象

舉例 

@Test
public void testSelectStudentById2() throws IOException {
    //調(diào)用mybatis某個(gè)對(duì)象的方法,執(zhí)行mapper文件中的sql語句
    //mybatis核心類: SqlSessionFactory
    //1.定義mybatis主配置文件的位置, 從類路徑開始的相對(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í)例可以通過 SqlSessionFactoryBuilder 獲得。
    // 而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個(gè)預(yù)先配置的 Configuration 實(shí)例來
    // 構(gòu)建出 SqlSessionFactory 實(shí)例。
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
    //既然有了 SqlSessionFactory,顧名思義,可以從中獲得 SqlSession 的實(shí)例。
    // SqlSession 提供了在數(shù)據(jù)庫執(zhí)行 SQL 命令所需的所有方法。
    // 你可以通過 SqlSession 實(shí)例來直接執(zhí)行已映射的 SQL 語句。
    //4.獲取SqlSession對(duì)象。
    SqlSession session = factory.openSession();
    //5.指定要執(zhí)行的sql語句的 id
    //  sql的id = namespace+"."+ select|update|insert|delete標(biāo)簽的id屬性值
    String sqlId = "com.bjpowernode.dao.StudentDao" + "." + "selectStudentById";
    // 6.通過SqlSession的方法,執(zhí)行sql語句
    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è)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • 詳細(xì)易懂帶你了解Spring中的注解

    詳細(xì)易懂帶你了解Spring中的注解

    這篇文章主要介紹了詳細(xì)易懂帶你了解Spring中的注解,Spring的一個(gè)核心是IOC,是將Bean初始化加載到容器中,Bean是如何加載到容器的,可以使用Spring注解方式或者Spring XML配置方式,需要的朋友可以參考下
    2023-08-08
  • SpringSecurity解決POST方式下CSRF問題

    SpringSecurity解決POST方式下CSRF問題

    本文主要介紹了SpringSecurity解決POST方式下CSRF問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • java方法重寫和super關(guān)鍵字實(shí)例詳解

    java方法重寫和super關(guān)鍵字實(shí)例詳解

    這篇文章主要介紹了java方法重寫和super關(guān)鍵字實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 構(gòu)建springboot自動(dòng)生成mapper文件和dao接口項(xiàng)目的步驟和配置方法

    構(gòu)建springboot自動(dòng)生成mapper文件和dao接口項(xiàng)目的步驟和配置方法

    這篇文章主要介紹了構(gòu)建springboot自動(dòng)生成mapper文件和dao接口項(xiàng)目的步驟和配置方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 淺談java監(jiān)聽器的作用

    淺談java監(jiān)聽器的作用

    這篇文章主要介紹了淺談java監(jiān)聽器的作用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Spring系列之事物管理

    Spring系列之事物管理

    這篇文章主要介紹了Spring系列之事物管理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring方面知識(shí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • java?Map集合中取鍵和值的4種方式舉例

    java?Map集合中取鍵和值的4種方式舉例

    Java中的Map是一種鍵值對(duì)存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),其中每個(gè)鍵都唯一,與一個(gè)值相關(guān)聯(lián),這篇文章主要給大家介紹了關(guān)于java?Map集合中取鍵和值的4種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Spring框架JdbcTemplate數(shù)據(jù)庫事務(wù)管理完全注解方式

    Spring框架JdbcTemplate數(shù)據(jù)庫事務(wù)管理完全注解方式

    這篇文章主要介紹了Spring框架JdbcTemplate數(shù)據(jù)庫事務(wù)管理及完全注解方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 使用Jackson反序列化遇到的問題及解決

    使用Jackson反序列化遇到的問題及解決

    這篇文章主要介紹了使用Jackson反序列化遇到的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中JSON字符串進(jìn)行各種轉(zhuǎn)換的方法小結(jié)

    Java中JSON字符串進(jìn)行各種轉(zhuǎn)換的方法小結(jié)

    Gson和Hutool的JSONUtil都是常用的用于處理JSON數(shù)據(jù)的工具庫,它們提供了簡單易用的API來進(jìn)行JSON字符串的解析、轉(zhuǎn)換和操作,下面就跟隨小編一起學(xué)習(xí)一下如果使用他們實(shí)現(xiàn)JSON字符串的各種轉(zhuǎn)換吧
    2024-01-01

最新評(píng)論