2012-11-14 13 views
7

मेरे पास एक ऐसा एप्लिकेशन है जो ऑब्जेक्ट दृढ़ता के लिए mybatis का उपयोग करता है। लेकिन संभावना है कि मुझे मनमाने ढंग से एसक्यूएल (उपयोगकर्ता से) चलाने की ज़रूरत है। क्या मैं इसे माइबेटिस के साथ कर सकता हूं?mybatis के साथ मनमानी एसक्यूएल कैसे चलाएं?

अद्यतन:

मैं उपयोगकर्ता परिभाषित एसक्यूएल को चलाने के लिए dbutils (JDBC) उपयोग करने के लिए चुनते हैं, लेकिन मैं डेटा स्रोत का एक उदाहरण की जरूरत QueryRunner बनाने के लिए। क्या कोई तरीका है कि मैं mybatis से डेटास्रोत प्राप्त कर सकता हूं?

import java.util.List; 
import org.apache.ibatis.annotations.SelectProvider; 

public interface SqlMapper { 
    static class PureSqlProvider { 
     public String sql(String sql) { 
      return sql; 
     } 

     public String count(String from) { 
      return "SELECT count(*) FROM " + from; 
     } 
    } 

    @SelectProvider(type = PureSqlProvider.class, method = "sql") 
    public List<?> select(String sql); 

    @SelectProvider(type = PureSqlProvider.class, method = "count") 
    public Integer count(String from); 

    @SelectProvider(type = PureSqlProvider.class, method = "sql") 
    public Integer execute(String query); 
} 

उत्तर

7

मैं इस utilitary वर्ग का उपयोग करें। लेकिन मुझे उम्मीद है कि यह समाधान आपकी मदद करेगा।

माइबेटिस पहले से ही यह फ़ंक्शन है, लेकिन आपको एडाप्टर का उपयोग निम्नानुसार करना चाहिए।

  1. एडाप्टर क्लास बनाएं;

    public class SQLAdapter { 
    String sql; 
    
    public SQLAdapter(String sql) { 
        this.sql = sql; 
    } 
    
    public String getSql() { 
        return sql; 
    } 
    
    public void setSql(String sql) { 
        this.sql = sql; 
    } } 
    
  2. वर्ग SQLAdapter की typeAlias ​​बनाने

<typeAlias alias="sqladapter" type="com.zj.xxx.xxx.SQLAdapter" />

  1. प्रत्येक वस्तु एक्सएमएल में

    डाल चयन टैग आप की जरूरत है, जहां सीधे एसक्यूएल निष्पादित करें।

    <select id="findRecords" parameterType="SQLAdapter" resultMap="xxxxxResultMap"> 
        ${sql} 
    </select> 
    
  2. कॉल की तरह

String _sql = "select * from table where... order by... limit..."; 
xxxxx.findRecords(new SQLAdapter(_sql)); 
इस विधि का चयन करें
  1. बातें सब किया गया है। अब आप xml फ़ाइल में लेखक जटिल एसक्यूएल भाषा नहीं कर सकते हैं। शुभ लाभ।
+0

जब मैं इसे कोशिश करता हूं तो मुझे एक असमर्थित ऑपरेशन अपवाद मिलता है .. –

+0

@OrGal मैं अपने ऐप्स में थोड़ी देर के लिए इस कक्षा का उपयोग कर रहा हूं। इस अपवाद को पाने के लिए आप क्या (कोड) चल रहे हैं? –

+0

@italo, आपके उत्तर के लिए धन्यवाद, लेकिन क्या यह एसक्यूएल फाइल के लिए काम नहीं करता है जिसमें एक से अधिक वाक्य हैं? – Suge

1

प्रदान किए गए उत्तरों के आधार पर, वे दोनों अच्छे हैं। लेकिन उनमें से दोनों को इस्तेमाल होने के लिए Adapter कक्षा की आवश्यकता थी।

Mybatis संस्करण 3 का उपयोग करना, मैं रखने के लिए और एसक्यूएल पारित करने के लिए एक HashMap<String, String> का उपयोग कर सफल रहा।

नीचे दिए गए कोड देखें।

String sql = "SELECT * FROM record limit 1"; 
HashMap<String, String> map = new HashMap<String, String>(); 
map.put("sql", sql); 
mapper.execute(map); 

HashMap एक तरीका है कि आप कक्षा गुण, या कोड में क्षेत्रों को परिभाषित करने की जरूरत नहीं है प्रदान करता है, आप का उपयोग कर सकते हैं:

Mapper वर्ग

final String sql = "${sql}"; 

@Select(sql) 
void execute(HashMap<String, String> m); 

जब वापस लाने में इसे मानचित्र को फिर से परिभाषित करने के लिए एक मानचित्र।

धन्यवाद।

+0

जब मैं मेवेन बिल्ड करता हूं तो मुझे अपने मैपर वर्ग में निम्न त्रुटि मिल रही है। कोई सुझाव? असंगत प्रकार: java.util.Map java.lang.String – Razvi

+0

में परिवर्तित नहीं किया जा सकता है क्या आप जानते हैं कि डायनामिक क्वेरी में पैरामीटर कैसे पास करें? – Razvi

0

SQL के पुन: प्रयोज्य खंड का उपयोग गतिशील रूप से क्वेरी का चयन भाग बनाने के लिए किया जा सकता है। आप में सामान्य पैरामीटर के रूप में पारित क्वेरी मैपर:

@Param("sql")String sql

आपकी क्वेरी में बस पैरामीटर का उपयोग कर $ {एसक्यूएल} के बजाय # {एसक्यूएल} एक्सेस करते हैं। पैरामीटर एसक्यूएल में मान एक पूरी तरह से वैध एसक्यूएल क्वेरी या एसक्यूएल क्वेरी का एक टुकड़ा हो सकता है।

संबंधित मुद्दे