HDC調試需求開發(fā)(15萬預算),能者速來!>>>
@Jieven 你好,想跟你請教個問題:
java.lang.NullPointerException
at com.eova.widget.WidgetUtil.copyValueColumn(Unknown Source)
at com.eova.widget.grid.GridController.query(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.aop.Invocation.invoke(Invocation.java:71)
at com.eova.interceptor.LoginInterceptor.intercept(Unknown Source)
at com.jfinal.aop.Invocation.invoke(Invocation.java:65)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:47)
at com.jfinal.plugin.druid.DruidStatViewHandler.handle(DruidStatViewHandler.java:75)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
來源:開源中國
發(fā)布時間:2016-03-14 09:47:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
@Jieven 你好,想跟你請教個問題:如標題,在剛布好的項目中,添加修改都好著,但刪除時就是報錯!
java.lang.Integer cannot be cast to [Ljava.lang.Object;
來源:開源中國
發(fā)布時間:2016-03-11 17:38:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
請問pyserial 如何與wxpython控件相連接控制下位機?
來源:開源中國
發(fā)布時間:2018-02-21 14:11:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
在wxpython中,我使用了wx.lib.agw.hypertreelist來創(chuàng)建帶有checkbox的樹形結構,求大神指點如果綁定事件來選擇單個checkbox,以及點擊根目錄checkbox來全選,如下圖所示:
來源:開源中國
發(fā)布時間:2015-07-08 14:17:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 我建立一個窗口,在面板上需要一定空間導入一張圖片,并且在圖片上要畫檢測區(qū)別作為智能識別區(qū)域?,F(xiàn)在不知道怎么畫直線并且能夠撤回不正確的直線。畫的直線不能在照片里而是針對那個區(qū)域畫。用了wxpython的畫線工具發(fā)現(xiàn)老是會覆蓋圖片而且畫完不知道怎么刪除剛剛畫的線
來源:開源中國
發(fā)布時間:2016-08-17 15:44:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
under windows, we can use SetFont to change, but under the Linux, there is no any reply if use SetFont. how to change wxpython ComboBox font size in Linux?
Thank you very much.
來源:開源中國
發(fā)布時間:2016-12-04 22:30:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
是業(yè)余學習python的,想學基礎后再學wxpython,也弄點opengl的。
各位有適于python的習題嗎?
來源:開源中國
發(fā)布時間:2012-11-29 16:56:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
原代碼如下: import wx,os class FileDrop(wx.FileDropTarget): def __init__(self, window): wx.FileDropTarget.__init__(self) self.window = window def OnDropFiles(self, x, y, filenames): for name in filenames: try: f = open(name, 'r') text = f.read() self.window.WriteText(text) f.close() except IOError, error: dlg = wx.MessageDialog(None, 'Error opening file\n' + str(error)) dlg.ShowModal() except UnicodeDecodeError, error: dlg = wx.MessageDialog(None, 'Cannot open non ascii files\n' + str(error)) dlg.ShowModal() class DropFile(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title="", size = (450, 400)) self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE|wx.TE_RICH2) dt = FileDrop(self.text) self.text.SetDropTarget(dt) self.Centre() self.Show(True) app = wx.App() DropFile(None, -1) app.MainLoop() 我想根據(jù)拖放的文件,將文件名動態(tài)更新為窗口的標題,如:
我知道可以通過 SetTitle(os.path.basename(name)) 來設置窗口標題,但我不知道如何在類中調用或使用?求指點!謝謝!
來源:開源中國
發(fā)布時間:2013-08-27 22:56:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
上圖的輸出每一列總是沒法對齊,我用的是%10s來指定寬度,感覺是因為空格的寬度和數(shù)字的
寬度不同導致的,請問應該怎么修改才能達到目的
來源:開源中國
發(fā)布時間:2016-05-04 12:37:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
windows下安裝了wxPython,但是還是提示No module named wx
本人小菜鳥,看書學習中,望各位大師指點
來源:開源中國
發(fā)布時間:2012-08-15 13:41:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 使用wxpython編寫界面,含有2個.py文件,MainFrame.py和TabPage.py 在MainFrame.py中一部分pannel創(chuàng)建3個tab標簽頁,標簽頁內容存放在TabPage.py中,在主頁面上存在按鈕“Load_ini_btn”,用于讀取配置文件,從而修改不同tab頁面數(shù)據(jù),如勾選復選框、設置文本信息等。求大神幫忙!圖片如下:
當我點擊右方load_ini_btn后,checkbox被選中,但是鼠標滑過之后,checkbox選中被取消。
該圖所示點擊button后,第3個標簽頁修改數(shù)據(jù)不正確,應為勾選“Auto_Increase” checkbox,但是顯示在左上角。
來源:開源中國
發(fā)布時間:2015-07-07 16:55:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 在windows win+r中輸入pycrust,打開了pycrust界面,但是不能打開文件,也不能保存,也沒有運行腳本的菜單
來源:開源中國
發(fā)布時間:2014-12-06 13:34:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 大家好!就是我用WxPython寫的GUI界面,在程序執(zhí)行完后,老是不能窗口自動置頂(彈出時就在所有窗口的最上方),請問那個函數(shù)可以解決,最好,給段這樣的程序代碼,謝謝
來源:開源中國
發(fā)布時間:2014-08-11 16:42:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
我用wxpython做一個小工具的界面,有一個topwindow在topwindow的menu里面點擊按鈕的時候會產生一個子frame(二級frame),如圖所示:
其 中self代表topwindow(一級frame), mol_frame代表由topwindow產生的如圖所示的子frame(二級frame),mol_frame中包含兩個button:search 和view,我想點擊view按鈕的時候獲取文本框中的用戶輸入
由于這個框是用戶點擊topwindow中按鈕生成的,所以所有的部件都是在一個事件響應函數(shù)中生成的:
def onGetMol(self,evt):
文本框我這樣生成:mol_frame.drugIDorPath=wx.TextCtrl(mol_panel)
view按鈕這樣生成:mol_frame.viewbutton=wx.Button(mol_panel,label='view')
在onGetMol函數(shù)中事件綁定這樣寫的:
mol_frame.Bind(wx.EVT_BUTTON,self.onview,mol_frame.viewbutton)
onview事件處理我這樣寫的(并且是和GetMol函數(shù)處于同一個層級):
def onview(mol_frame,evt):
mol_file_path=mol_frame.drugIDorPath.GetLabelText()
print mol_file_path
運行點擊view以后會說
是無法獲取子frame(也就是二級frame)中的文本框么?
應該怎么處理呢?
跪求大神指導!萬分感激?。。?!
來源:開源中國
發(fā)布時間:2014-12-06 22:34:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> wxPython程序在執(zhí)行一個占用較大的資源(例如后臺執(zhí)行一個幾分鐘的while循環(huán)),同時想更新UI,這時候UI凍結,怎么辦?怎么一邊后臺執(zhí)行while循環(huán),同時更新UI里面一些textctrl內容?
來源:開源中國
發(fā)布時間:2014-10-15 16:21:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
前些日子我看見 StackOverflow的一個問題 ,說如何動態(tài)地延時創(chuàng)建以及銷毀容器。我那時就回答說他可以參考我以前寫過的有關于 如何動態(tài)創(chuàng)建與銷毀按鈕的技術博客 ,但也許對方實在太懶而根本沒有考慮那個建議。
所以這篇文章中,我演示給大家一個范例,看看如何動態(tài)延時創(chuàng)建一個容器并接著銷毀的過程。
以下就是需要的代碼:
import wx ######################################################################## class PanelOne(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) self.countdown = wx.StaticText(self, label="This panel will self-destruct in 10 seconds") ######################################################################## class PanelTwo(wx.Panel): """""" #---------------------------------------------------------------------- def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) txt = wx.StaticText(self, label="Panel Two") ######################################################################## class MainFrame(wx.Frame): """""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Panel Smacker") self.panelOne = PanelOne(self) self.time2die = 10 self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.update, self.timer) self.timer.Start(1000) self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.panelOne, 1, wx.EXPAND) self.SetSizer(self.sizer) #---------------------------------------------------------------------- def update(self, event): """""" if self.time2die < 0: self.panelOne.Destroy() self.panelTwo = PanelTwo(self) self.sizer.Add(self.panelTwo, 1, wx.EXPAND) self.Layout() self.timer.Stop() else: msg = "This panel will self-destruct in %s seconds" % self.time2die self.panelOne.countdown.SetLabel(msg) self.time2die -= 1 if __name__ == "__main__": app = wx.App(False) frame = MainFrame() frame.Show() app.MainLoop()
當你直接運行時,你會第一次看到下圖這樣:
然后大概10秒后,你才會看到如下圖這樣:
好了,如果你想知道更多關于 timers 的信息,我還寫了 另一篇文章 哦,歡迎大家一起學習
原文鏈接 , OSChina.NET 原創(chuàng)翻譯
來源:開源中國
發(fā)布時間:2012-07-02 13:19:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> wapython,如何把歡迎界面的圖片轉換為py程序1).我的代碼: class PaintApp(wx.App): def OnInit(self): bmp = wx.Image(“girl.bmp”).ConvertToBitmap() wx.SplashScreen(bmp,wx.SPLASH_CENTER_ON_SCREEN | wx.SPLASH_TIMEOUT,2000,None,-1) wx.Yield() return True 我使用工具img2py.py,命令C:\Python27\Lib\site-packages\wx-3.0-msw\wx\tools>python img2py.py girl.bmp gi rl.py,將圖片轉換為py程序,文件名:girl.py 2).新代碼如下: import wx import girl #將圖片程序導入 class PaintApp(wx.App): def OnInit(self): pic = girl.PyEmbeddedImage.GetBitmap() bmp = wx.Image(pic).ConvertToBitmap() wx.SplashScreen(bmp,wx.SPLASH_CENTER_ON_SCREEN | wx.SPLASH_TIMEOUT,2000,None,-1) wx.Yield() return True 問題:運行程序報錯: pic = girl.PyEmbeddedImage.GetBitmap() TypeError: unbound method GetBitmap() must be called with PyEmbeddedImage instance as first argument (got nothing instead) 這個圖片轉換應該怎么寫,代碼bmp = wx.Image(pic).ConvertToBitmap(),pic這個參數(shù)該如何去定義?
來源:開源中國
發(fā)布時間:2014-09-24 19:46:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
想要實現(xiàn)想QQ那樣的登錄,只要密碼輸入正確當點擊確定按鈕時,登錄界面消失主界面自動產生。
希望大神給我個大致思路,要是合理必頂答案!
來源:開源中國
發(fā)布時間:2014-09-03 22:16:00
這iBATIS的老大愛折騰,搬來搬去,看陳述的那些理由,我唯一的感覺就是:他厭倦了ASF的官僚作風。 對用戶影響很小,開源協(xié)議也沒變,還是最寬松的Apache 2.0,Google的網(wǎng)絡也比Apache快點。 不過MyBatis這個名字可不如iBATIS,讓人還以為是iBATIS的定制項目,比如MyEclipse和Eclipse。
來源:ITEYE
發(fā)布時間:2020-08-27 14:42:25
HDC調試需求開發(fā)(15萬預算),能者速來!>>> RT,我可以用py2exe生成一個exe的單文件,可我程序里所包含的JPG圖片不能打包進去,只能copy到與exe文件同一目錄下才能正常顯示,請問各位怎樣把我的JPG圖片一起打包進exe文件里?
來源:開源中國
發(fā)布時間:2014-08-04 15:46:00
相關推薦: ibator改造之返回數(shù)據(jù)庫注釋和數(shù)據(jù)庫分頁 ibatis的ibatorForEclipse的安裝與配置和ibator的錯誤日志查看 Ibator優(yōu)化版代碼生成過程 Ibator支持分頁的plugin mybatis (Ibatis ibator) generator - 1 mysql 分頁插件(page/paging/pagination plugin) 基于Struts2+Spring+iBatis的web應用最佳實踐系列之五(分頁篇) ibator改造之返回數(shù)據(jù)庫注釋和數(shù)據(jù)庫分頁
推薦群組: struts2
更多相關推薦
iBATIS
首先聲明:該文章 參照了 http://www.iteye.com/topic/674839 ?? matychen ? 的文章 , 修改了一下 ibator 的工作方式,實際分頁的原理還是一樣的 , 支持 oracle,mysql?? , 如果涉及侵犯matychen的利益,請告知,我立即刪除
?
/**
? *
? * @author coffeesweet
? *
? */
Ibator 支持分頁的 plugin 式的開發(fā)步驟
?
1: 所涉及到修改的類列表 :
org.apache.ibatis.ibator.generator.ibatis2.sqlmap.elements 目錄下所有的類里給 attribute 屬性的 id 修改成如下 : FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable(); answer.addAttribute(new Attribute("id", table.getSqlMapNamespace() + "."+XmlConstants.INSERT_STATEMENT_ID));
?
其他修改和添加的類
org.apache.ibatis.ibator.generator.ibatis2.sqlmap.elements---OraclePaginationHeadGenerator ??
org.apache.ibatis.ibator.generator.ibatis2.sqlmap.elements---OraclePaginationTailGenerator ??
org.apache.ibatis.ibator.generator.ibatis2.sqlmap.elements---MysqlPaginationLimitGenerator ??
org.apache.ibatis.ibator.generator.ibatis2.model---ExampleGenerator
org.apache.ibatis.ibator.api.dom.java---FullyQualifiedJavaType
?
? org.apache.ibatis.ibator.api.dom.xml.XmlElement 添加了四個方法,主要用于對 xxxx_SqlMap.xml 的元素刪除和修改
? 這個是添加的 plugin 類
org.apache.ibatis.ibator.plugins.PaginationPlugin
?
以上所有修改的類搜索 “ 增加開始 ” 或者 “ 增加結束 ” 就能找到修改的地方
?
2: 示例 ibatorConfig.xml 文件
?
一定要注意該 xml 的元素順序
?
子元素的 第一個 位置
ibatorContext 的子元素順序是
(property*, ibatorPlugin*, commentGenerator?, jdbcConnection, javaTypeResolver?,
? javaModelGenerator, sqlMapGenerator, daoGenerator?, table+)
所以需要注意 ibatorPlugin 的位置,還有,如果有多個 plugin 的話,加入第一個的 validate 失敗,那么余下的所有 plugin 都不執(zhí)行了
?
還要注意 ibatorPlugin 的兩個必要屬性
< property name = "enablePagination" value = "true" />
???? ?? < property name = "dbType" value = "oracle" />
?
示例 ibatorConfig.xml
xml version = "1.0" encoding = "UTF-8" ?>
< ibatorConfiguration >
?
??? < classPathEntry location = "oracle驅動的本地絕對路徑" />
??? < ibatorContext id = "context1" targetRuntime = "Ibatis2Java5" >
???
???
????
???? < ibatorPlugin type = "org.apache.ibatis.ibator.plugins.PaginationPlugin" >
???? ?? < property name = "enablePagination" value = "true" />
???? ?? < property name = "dbType" value = "oracle" />
???? ibatorPlugin >
????
????
?????? < jdbcConnection driverClass = "oracle.jdbc.driver.OracleDriver"
?????????? connectionURL = "jdbc:oracle:thin:@*.*.*.*:1521:**" userId = "**"
?????????? password = "**" />
?
?????? < javaTypeResolver >
?????????? < property name = "forceBigDecimals" value = "false" />
?????? javaTypeResolver >
?
?
?????? < javaModelGenerator targetPackage = "com.mydomain.model"
?????????? targetProject = "src" >
?????????? < property name = "enableSubPackages" value = "false" />
?????????? < property name = "trimStrings" value = "false" />
?????? javaModelGenerator >
?
?????? < sqlMapGenerator targetPackage = "com.mydomain.xml"
?????????? targetProject = "src" >
?????????? < property name = "enableSubPackages" value = "false" />
?????? sqlMapGenerator >
?
?????? < daoGenerator type = "SPRING" targetPackage = "com.mydomain.dao"
?????????? targetProject = "src" >
?????????? < property name = "enableSubPackages" value = "false" />
?????? daoGenerator >
?
?
?????? < table tableName = "CC_TEST1" domainObjectName = "Customer" >
??????????
?????? table >
??????
??????? ??????
??? ibatorContext >
ibatorConfiguration >
?
3: 以下是 ibator 的 java 啟動模式,用來測試 package org.apache.ibatis.ibator.test; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.ibatis.ibator.api.Ibator; import org.apache.ibatis.ibator.config.IbatorConfiguration; import org.apache.ibatis.ibator.config.xml.IbatorConfigurationParser; import org.apache.ibatis.ibator.internal.DefaultShellCallback; public class IbatorRunTest { public static void main(String...strings){ try{ List warnings = new ArrayList(); boolean overwrite = true; File configFile = new File(ClassLoader.getSystemResource("ibatorConfig.xml").getFile()); // File configFile = new File("ibatorConfig.xml"); IbatorConfigurationParser cp = new IbatorConfigurationParser(warnings); // for(String warning:warnings){ // System.out.println("1---:"+warning); // } IbatorConfiguration config = cp.parseIbatorConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); Ibator ibator = new Ibator(config, callback, warnings); ibator.generate(null); for(String warning:warnings){ System.out.println("2---:"+warning); } }catch(Exception ex){ ex.printStackTrace(); } } }
?
? ?
4:附件是ibator的修改后的源碼(包括spring的lib)和jar包,以及測試case
? 源碼里的有關數(shù)據(jù)連接信息的東西請自行修改
測試用到了spring ibator.jar可直接拿到工程中使用
? ?
?
?
? ?
?
?
?
?
?
來源:ITEYE
發(fā)布時間:2020-08-27 14:42:14
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
我想用wxpython寫一個界面,但一個地方不知道用什么控件,來把里面的東西框起來,因為那樣,更好看
以下為原代碼,如何把以下代碼修改,就可以達到圖2的效果
text1 =wx.StaticText(panel, -1, u'-------拼板信息--------------------------------------------',(40, 40))
font = wx.Font(13, wx.DECORATIVE, wx.ITALIC, wx.NORMAL)
text1.SetFont(font)
text2 =wx.StaticText(panel, -1, u'拼板尺寸X',(40, 70))
font = wx.Font(13, wx.DECORATIVE, wx.ITALIC, wx.NORMAL)
text2.SetFont(font)
self.Pnl_x = wx.TextCtrl(panel, -1, "0",pos=(130,70),size=(80, 25))
text3 =wx.StaticText(panel, -1, u'拼板尺寸Y',(280, 70))
font = wx.Font(13, wx.DECORATIVE, wx.ITALIC, wx.NORMAL)
text3.SetFont(font)
self.Pnl_y = wx.TextCtrl(panel, -1, "0",pos=(370,70),size=(80, 25))
來源:開源中國
發(fā)布時間:2014-07-03 09:17:00
相關推薦: 數(shù)據(jù)庫水平切分的實現(xiàn)原理解析 關于ibatis進行物理游標分頁 數(shù)據(jù)庫分切設計何必糾結于hibernate shard模式,應該簡單化了 [] 通過ibatis實現(xiàn)輕量級的水平切分(已更新,ibatis原生api也可以實現(xiàn)sharding) 通過ibatis實現(xiàn)輕量級的水平切分(已更新,ibatis原生api也可以實現(xiàn)sharding) Ibatis實現(xiàn)分表 數(shù)據(jù)庫分庫分表(sharding)系列(一) 拆分實施策略和示例演示 數(shù)據(jù)庫水平切分的原理探討、設計思路--數(shù)據(jù)庫分庫,分表,集群,負載均衡器...
推薦群組: lucene愛好者
更多相關推薦
iBATIS 最近想在自己的項目里實現(xiàn)DB sharding功能,正好前段時間研究過ibatis的源碼于是就在ibatis的基礎上進行了一些修改。另一方面也是為了練練手。這個sharding的實現(xiàn)主要是基于我項目中的需求實現(xiàn)的可能有很多考慮不周的地方,希望各位大牛拍磚。如果有人感興趣愿意一起來發(fā)展這個項目,本人也非常歡迎各位的加入。Shardbatis是在mybatis 2.3.5代碼的基礎上進行一些擴展實現(xiàn)數(shù)據(jù)水平切分功能。 數(shù)據(jù)的水平切分包括多數(shù)據(jù)庫的切分和多表的數(shù)據(jù)切分。目前shardbatis已經(jīng)實現(xiàn)了單數(shù)據(jù)庫的數(shù)據(jù)多表水平切分 mybatis2.3.5的核心類圖(包含了spring對ibatis的封裝SqlMapClientTemplate)如下(其他版本的ibatis的類圖有略微不同) 改造后的類圖 從這兩張圖上可以看出shardbatis里新增了接口SqlMapShardingExt,SqlMapShardingExt中具體的方法如下 public interface SqlMapShardingExt extends SqlMapExecutor{ /** * 帶有sharding功能的insert * @param id * @param parameterObject * @param groups * @return * @throws SQLException */ Object insertWithSharding(String id, Object parameterObject, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的insert * @param id * @param groups * @return * @throws SQLException */ Object insertWithSharding(String id, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的update * @param id * @param parameterObject * @param groups * @return * @throws SQLException */ int updateWithSharding(String id, Object parameterObject, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的update * @param id * @param groups * @return * @throws SQLException */ int updateWithSharding(String id, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的delete * @param id * @param parameterObject * @param groups * @return * @throws SQLException */ int deleteWithSharding(String id, Object parameterObject, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的delete * @param id * @param groups * @return * @throws SQLException */ int deleteWithSharding(String id, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的單記錄查詢 * @param id * @param parameterObject * @param groups * @return * @throws SQLException */ Object queryForObjectWithSharding(String id, Object parameterObject, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的單記錄查詢 * @param id * @param groups * @return * @throws SQLException */ Object queryForObjectWithSharding(String id, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的單記錄查詢 * @param id * @param parameterObject * @param resultObject * @param groups * @return * @throws SQLException */ Object queryForObjectWithSharding(String id, Object parameterObject, Object resultObject, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的查詢 * @param id * @param parameterObject * @param groups * @return * @throws SQLException */ List queryForListWithSharding(String id, Object parameterObject, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的查詢 * @param id * @param groups * @return * @throws SQLException */ List queryForListWithSharding(String id, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的查詢 * @param id * @param parameterObject * @param skip * @param max * @param groups * @return * @throws SQLException */ List queryForListWithSharding(String id, Object parameterObject, int skip, int max, ShardingFactorGroup... groups) throws SQLException; /** * 帶有sharding功能的查詢 * @param id * @param skip * @param max * @param groups * @return * @throws SQLException */ List queryForListWithSharding(String id, int skip, int max, ShardingFactorGroup... groups) throws SQLException; /** * * @param id * @param parameterObject * @param rowHandler * @param groups * @throws SQLException */ void queryWithRowHandlerWithSharding(String id, Object parameterObject, RowHandler rowHandler, ShardingFactorGroup... groups) throws SQLException; /** * * @param id * @param rowHandler * @param groups * @throws SQLException */ void queryWithRowHandlerWithSharding(String id, RowHandler rowHandler, ShardingFactorGroup... groups) throws SQLException; /** * * @param id * @param parameterObject * @param keyProp * @param groups * @return * @throws SQLException */ Map queryForMapWithSharding(String id, Object parameterObject, String keyProp, ShardingFactorGroup... groups) throws SQLException; /** * * @param id * @param parameterObject * @param keyProp * @param valueProp * @param groups * @return * @throws SQLException */ Map queryForMapWithSharding(String id, Object parameterObject, String keyProp, String valueProp, ShardingFactorGroup... groups) throws SQLException; 通過SqlMapClientImpl和SqlMapSessionImpl對SqlMapShardingExt的實現(xiàn)是的ibatis具有了DB sharding的功能,iBATIS會自動根據(jù)配置的或者是編碼的sharding策略將原始的sql語句轉變?yōu)閷繕吮砻膕ql。 下面看一下如何在iBATIS中配置和使用sharding功能 1.配置sharding策略。在sql-map-config.xml中添加如下配置 這里再通過實例簡單介紹一下使用DefaultShardingStrategy時對sql的convert結果 比如sqlmap中定義的原始sql為: SELECT EMPLOYEEIDNO FROM mytable WHERE SALARY >= 50000 那經(jīng)過convert后的結果將可能是 SELECT EMPLOYEEIDNO FROM mytable_1 WHERE SALARY >= 50000 又例如原始sql為 SELECT a.* FROM ANTIQUES a,ANTIQUEOWNERS b, mytable c where a.id=b.id and b.id=c.id convert的結果可能為 SELECT a.* FROM ANTIQUES_0 AS a, ANTIQUEOWNERS_1 AS b, mytable_1 AS c WHERE a.id = b.id AND b.id = c.id 開始使用sharding api public class SqlMapClientTest { SqlMapClient sqlMapper; @Before public void init() { Reader reader; try { reader = Resources.getResourceAsReader("sql-map-config.xml"); sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader); reader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void testSharding() throws Exception { Map param = new HashMap(); param.put("cnt", "ttt"); ShardingFactorGroup g = new ShardingFactorGroup();//ShardingFactorGroup為切分策略提供必要參數(shù) g.setTableName("App_Test");//設置為哪張表配置切分策略 g.setParam(new Integer(123));//設置為切分策略提供參數(shù) //這里還可以通過g.setShardingStrategy(...)來設置切分策略 //通過API配置的切分策略可以覆蓋xml里配置的App_Test表的切分策略 Integer count = (Integer) sqlMapper.queryForObjectWithSharding( "AppTest.select_paging_count_by_map", param, g); Assert.assertEquals(count.toString(), "0"); } @Test public void testUpdate() throws SQLException { ShardingFactorGroup g = new ShardingFactorGroup(); g.setTableName("App_Test"); g.setParam(new Integer(123)); String cnt = "testUpdate" + System.currentTimeMillis(); AppTest at1 = new AppTest(); at1.setCnt(cnt); Integer id = (Integer) sqlMapper.insertWithSharding( "AppTest.insert_h2", at1, g); AppTest parameterObject = new AppTest(); parameterObject.setCnt(cnt); AppTest ret = (AppTest) sqlMapper.queryForObjectWithSharding( "AppTest.select_by_condition", parameterObject, g); Assert.assertEquals(ret.getId().toString(), id.toString()); ret.setCnt("NEW_CONTENT"); Integer count = sqlMapper.updateWithSharding("AppTest.update", ret, g); Assert.assertEquals(count.toString(), "1"); count = (Integer) sqlMapper.queryForObjectWithSharding( "AppTest.select_paging_count", ret, g); Assert.assertEquals(count.toString(), "1"); } @Test public void testDelete() throws SQLException { ShardingFactorGroup g = new ShardingFactorGroup(); g.setTableName("App_Test"); g.setParam(new Integer(123)); String cnt = "testDelete" + System.currentTimeMillis(); AppTest at1 = new AppTest(); at1.setCnt(cnt); Integer id = (Integer) sqlMapper.insertWithSharding( "AppTest.insert_h2", at1, g); AppTest parameterObject = new AppTest(); parameterObject.setCnt(cnt); AppTest ret = (AppTest) sqlMapper.queryForObjectWithSharding( "AppTest.select_by_condition", parameterObject, g); Assert.assertEquals(ret.getId().toString(), id.toString()); Integer row = sqlMapper.deleteWithSharding("AppTest.delete", ret, g); Assert.assertEquals(row.toString(), "1"); } } 實現(xiàn)自己的sharding策略,只要實現(xiàn)一個簡單的接口即可 public interface ShardingStrategy { /** * 計算得到新的表名 * @param baseTableName 邏輯表名 * @param params 為sharding邏輯提供必要參數(shù) * @return */ public String getTargetTableName(String baseTableName,Object params); } Since 0.9.1使用ibatis原生api也可以支持sharding功能 select count(*) from app_test where cnt=#cnt# 下面開始編碼 AppTest param=new AppTest(); param.setTestId(2); param.setCnt("testShardingWithConfig"); Integer count=(Integer)sqlMapper.queryForObject("AppTest.select_count_native",param);//和使用原生的ibatis API沒有區(qū)別 最終執(zhí)行的SQL可能是如下樣式 select count(*) from app_test_0 where cnt=? 關于shardbatis在spring中的使用方法,以及一些使用注意事項和性能測試結果請大家移步到項目主頁 http://code.google.com/p/shardbatis/ 上查看
來源:ITEYE
發(fā)布時間:2020-08-27 14:42:06
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
這個例子是鼠標移入,button的label顯示“Over Me”,但是我運行沒有顯示求怎么回事
來源:開源中國
發(fā)布時間:2014-06-11 15:51:00
相關推薦: 大家覺得現(xiàn)在搞iPhone的軟件開發(fā)有前途(錢途)嗎? 手機safari的AJAX開發(fā)(包括iPhone) 盤點免費文件網(wǎng)絡同步、備份工具 ios 開源的電子書閱讀器項目 直接拿來用!最火的iOS開源項目 OpenDigg iOS開源項目月報201704 iOS開源系列——完整開源項目
推薦群組: iphone,ipod touch開發(fā)
更多相關推薦
iOS TwitterFon is a simple, clean, easy to use, and super fast Twitter client for your iPhone and iPod Touch.The URL :http://twitterfon.net/ You can download source codes from svn repository http://naan.net/svn/trunk/TwitterFon
來源:ITEYE
發(fā)布時間:2020-08-27 14:41:35
我沒用過UITabBar,但是看這個功能應該可以用在一個view上加custom的button實現(xiàn)的
來源:ITEYE
發(fā)布時間:2020-08-27 14:41:20
IBatis 要強于hiberante1.項目一般數(shù)據(jù)庫明確,不需要支持多數(shù)據(jù)庫,用hibernate 也不表示能完全兼容所有數(shù)據(jù)庫的所有select 語法(函數(shù)) 2.IBatis 的2員表達式 優(yōu)于使用 hibernate QBC 3.開發(fā)速度取決于開發(fā)人員的水平 而不于ibatis 和 hibernate(雖然可以生成.java .hbm.xml) 4.
來源:ITEYE
發(fā)布時間:2020-08-27 14:40:54
agapple 寫道
LZ還可以考慮另一種思路,需要客戶端指定Entry的主鍵Key,每次update操作,清空有包含該key的相關cache數(shù)據(jù)即可。 目前似乎是在服務端攔截select 類型的query 或取參數(shù)來得到key,不知道你說的客戶端如何指定entry的主鍵key.
來源:ITEYE
發(fā)布時間:2020-08-27 14:40:46
相關推薦: 使用Atomikos Transactions Essentials實現(xiàn)多數(shù)據(jù)源JTA分布式事務 Spring中事物管理一二 Spring配置一個事務中多個數(shù)據(jù)源 spring mybatis atomikos分布式事務 【分布式】springboot + mybatis + JTA + Atomikos 實現(xiàn)多數(shù)據(jù)源的分布式事務管理 spring+mybatis+atomikos 實現(xiàn)JTA事務 springboot實現(xiàn)mybatis分布式事務(atomikos) spring boot+Mybatis+mysql+atomikos+jta實現(xiàn)多數(shù)據(jù)源分布式事務
推薦群組: struts2
更多相關推薦
iBATIS
最近弄一個框架,使用spring3.0.5+mybatis3.0.5,需要訪問多庫,要應用分布式事務JTA,這是用atomikos 3.70版本,并把配置做一下記錄。
配置多個數(shù)據(jù)源
?
SELECT 1 SELECT 1
?
?
配置mybatis的SessionFactory
?
?
? 這里使用的是SessionFactory,不是 org.springframework.orm.ibatis.SqlMapClientFactoryBean,在mybatis3中用 SqlMapClientFactoryBean匯報 com.ibatis.common.xml.NodeletException ?異常。
?
configLocation 對應的mybatis配置,跟平時配置一樣。
?事務這塊用spring管理atomikos
true
?
Mapper的管理及注入
?
atomikos的配置jta.properties,該文件放在應用classpath下面
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory com.atomikos.icatch.console_file_name = tm.out com.atomikos.icatch.log_base_name = tmlog com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm com.atomikos.icatch.console_log_level=WARN ?
這幾基本配置完畢,需要jar包
atomikos-util.jar
transactions.jar
transactions-jta.jar
transactions-jdbc-deprecated.jar
mybatis.jar
mybatis-spring.jar
cglib.2.2.2.jar
spring的jar包
?
在Service中,調用事務的方法不能try。。。catch事務的方法,否者不能回滾
如下帶面就會出現(xiàn)不會滾問題
try{ userMapper.addUser(user); roleMapper.addRole(role); }catch(Exception){ } ?參考文章?http://www.iteye.com/topic/122700
?
來源:ITEYE
發(fā)布時間:2020-08-27 14:40:18
Missing:---------- 1) javax.jms:jms:jar:1.1 Try downloading the file manually from: http://java.sun.com/products/jms/docs.html Then, install it using the command: mvn install:install-file -DgroupId=javax.jms -DartifactId=jms -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/file Alternatively, if you host your own repository you can deploy the file there: mvn deploy:deploy-file -DgroupId=javax.jms -DartifactId=jms -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id] Path to dependency: 1) com.alibaba.cobar:cobar-client:jar:1.0.3 2) log4j:log4j:jar:1.2.15 3) javax.jms:jms:jar:1.1 ---------- 1 required artifact is missing. for artifact: com.alibaba.cobar:cobar-client:jar:1.0.3
來源:ITEYE
發(fā)布時間:2020-08-27 14:40:08
基本寫完了,還有一些小地方和不明朗的地方,比如validateParameter方法,ExecuteListener接口,稍后補充上吧。 望大家來拍拍轉吧
來源:ITEYE
發(fā)布時間:2020-08-27 14:40:00
Mybatis已經(jīng)全面支持了!類似struts2對OGNL的操作. 樓主可以嘗試下.可以寫類似 ...... foreach很有用,在解決集合到sql轉換的問題上很給力! 比如 in()
來源:ITEYE
發(fā)布時間:2020-08-27 14:39:52
相關推薦: Extjs3綜合應用(待續(xù)v4...初版) Mybatis3.0查詢,保存,更新,刪除數(shù)據(jù)。 summercool-ddl框架簡介 (二) MyBaits中Insert至動態(tài)表名及foreach使用 在ibatis中使用oracle insert all 函數(shù) MyBatis動態(tài)sql_foreach下foreach批量插入兩種方式 mybatis中foreach的用法(轉)
推薦群組: struts2
更多相關推薦
iBATIS
?
下面是一個簡單的使用動態(tài)表名和 foreach 使用的簡單配置
insert into nwh.tt_${suffix}(a,b) values (#{obj[order]},#{obj[name]}) ${suffix} ?"${}" 只做簡單的替換 #{ obj [order]}"#{}"會做處理
?
?
對應的數(shù)據(jù)結構如下面代碼表示:
List> list = new ArrayList>(); Map map= new HashMap(); map.put("order", "123"); map.put("name", "miyong"); Map map2= new HashMap(); map2.put("order", "1234"); map2.put("name", "miyong"); list.add(map); list.add(map2); Map param = new HashMap(); param.put("suffix", "20110710"); param.put("list", list); ?
?
對應的表結構:
CREATE TABLE NWH.TT_20110710 (A INTEGER, B VARCHAR(20) ) ?
?
對應生成的 SQL 類似:
insert into nwh.tt_20110710(a,b) values (?,?) , (?,?) ?
?
注意: Map?map ,而物理表中一個 Ingeger 字段,一個 VARCHAR 字段, MyBatis 會自己做類型映射
?
來源:ITEYE
發(fā)布時間:2020-08-27 14:39:44
相關推薦: jdbc通用查詢通過map替代實體 ibatis dao的封裝討論(歡迎拍裝) 介紹DynamicQueryTool,一個用于解決“拼裝動態(tài)查詢”的小工具。 ibatis查詢返回java.util.HashMap結果列表 ibatis中動態(tài)查詢返回字段返回用resultClass="java.util.HashMap" 的問題 ibatis resultclass "java.util.hashmap" 緩存 ibatis中配置parameterClass="java.util.HashMap"的用法 ibatis中動態(tài)查詢表返回用resultClass="java.util.HashMap" 的問題
推薦群組: JSF
更多相關推薦
iBATIS 這兩天寫代碼時,遇到一個問題,要求在DAO層要返回一個java.util.HashMap的結果集,但是平常我們多返回List或者VO,在網(wǎng)上搜索了下,結果找到了這樣一個方法,記錄如下:DAO的實現(xiàn)類中的代碼: return Map getItemNames () { return getSqlMapClientTemplate().queryForMap("getItemNameMap", null, "key", "value"); } SqlMap配置文件中的代碼: select SKU, Description from Items 在業(yè)務層調用getItemNames()時,返回的結果已經(jīng)是一個標準的java.util.HashMap了,可以使用其方法 get(String key)來直接獲取對應的value,非常方便。 參考地址: http://osdir.com/ml/java.ibatisdb.user/2005-01/msg00336.html
來源:ITEYE
發(fā)布時間:2020-08-27 14:39:37
相關推薦: Ibator優(yōu)化版代碼生成過程 Ibator支持分頁的plugin ibator改造之返回數(shù)據(jù)庫注釋和數(shù)據(jù)庫分頁 ibatis自動生成工具ibator及配置文件示例 ibatis的ibatorForEclipse的安裝與配置和ibator的錯誤日志查看 ibatis:使用ibator自動生成代碼和配置文件 A code generator for iBATIS Myeclipse?8.5?下?iBATIS?的代碼生成插件?ibator安裝
推薦群組: struts2
更多相關推薦
iBATIS
源地址:
http://cache.baidu.com/c?m=9d78d513d99811fc1eb0d4690c66c0161e43f1652bd6a0020fd6843893732d445016e1ac26520774a0d20d1116ae394b9bf72105311456b38cb9895e9afbcc2775ce6176671df55c0f8942b8cb3175927bc61dfeaf6eb6e7af2f84d8d5c4ae5344bc56120c81e7fb501763c072a04a6cb6bbc20e42000db8ef3535fc587d289a7046e211f2ea303a0383f78e581fc83dd0164bd1f06b&p=8534d50c8c904eab1abd9b7f0e4f&user=baidu&fm=sc&query=ibator%B5%C4%B0%B2%D7%B0%BA%CD%C5%E4%D6%C3&qid=819f7ee217769ff1&p1=1
?
下載ibator插件地址:
http://people.apache.org/builds/ibatis/ibator/
http://people.apache.org/builds/ibatis/ibator/ibator-1.2.1-681.zip
http://people.apache.org/builds/ibatis/ibator/IbatorForEclipse1.2.1.zip
?
?
現(xiàn)在我們著手來寫一個ibatis的簡單例子.
如果你是使用eclipse開發(fā)項目的話,那么,有一個eclipse的插件ibator,可以通過 配置 自動生成java代碼sqlmap等,蠻好用。下面先做一個使用ibator插件的例子。
1.使用link方式在線 安裝 ibator。
eclipse菜單? help-->
software updates-->
add site-->(填入在線 安裝 地址:http://ibatis.apache.org/tools/ibator
-->一直下一步 安裝
2.新建一個web工程,導入相應的包,我使用的數(shù)據(jù)庫是ORACLE,所以我需要導入的包是:
ojdbc14.jar或classes12.jar,把ibatis需要的jar包都導進去
此例我導入的jar包如下:
?
ojdbc14.jar
ibatis-common.jar
ibatis-dao.jar
ibatis-sqlmap.jar
?
3.由于你 安裝 了ibator插件,那么你在你的工程某個目錄下單擊右鍵-->new-->other里將會看到
Apache iBatis Ibator文件夾,下面只有一個選項
?
Apache iBatis ibator configuration File
?
點擊以后要求你輸入文件名(這個就是 ibator的 配置 文件):
?
Location: test/src
File name: ibatorConfig.xml
?
?
填入 配置 文件名稱,可以隨便設置 配置 文件名字。一般為“ibatorConfig.xml”,點確定后就創(chuàng)建好了一個ibator 配置 文件的模板。
代碼如下:
?
xml?version = " 1.0 " ?encoding = " UTF-8 " ? ?>
< ibatorConfiguration? >
< ibatorContext?id = " context1 " ? >
< jdbcConnection?driverClass = " ??? " ?connectionURL = " ??? " ?userId = " ??? " ?password = " ??? " ? />
< javaModelGenerator?targetPackage = " ??? " ?targetProject = " ??? " ? />
< sqlMapGenerator?targetPackage = " ??? " ?targetProject = " ??? " ? />
< daoGenerator?targetPackage = " ??? " ?targetProject = " ??? " ?type = " GENERIC-CI " ? />
< table?schema = " ??? " ?tableName = " ??? " ? >
< columnOverride?column = " ??? " ?property = " ??? " ? />
table >
ibatorContext >
ibatorConfiguration >
?
?
4.將對應 配置 參數(shù)替換掉上面的“?”號。我自己的替換文件是這樣的:
?
?
?
5.之后我們只需要在這個 配置 文件上點擊右鍵-->點擊Generate ibatis artifacts,這樣就應該能生成對應的package 和 類了
?
?
6.如果出現(xiàn)錯誤使用一下方式查看錯誤日志
?
? 運行cmd用來查詢ibatorConfig.xml中出現(xiàn)的錯誤日志
java -jar d:\ibator.jar -configfile E:\Workspace\test\src\ibatorConfig.xml -overwrite >>c:\log.log
來源:ITEYE
發(fā)布時間:2020-08-27 14:39:24
結貼,折騰了一天,剛發(fā)帖就找到原因了,我用了rapid-framework3.9.3,里面的分頁plugin可能有問題,再研究下。
來源:ITEYE
發(fā)布時間:2020-08-27 14:39:01
相關推薦: mybatis和Spring的集成 整合Mybatis與Spring3 MyBatis3新手上路 Springboot整合MyBatis, yml配置,超詳細從mybatis-spring-boot-starter根據(jù)源碼進行配置,MybatisProperties類中的屬性【源碼版】) SpringBoot整合MyBatis-Plus3.1詳細教程 SpringBoot(十六):SpringBoot整合Mybatis-Plus spring boot集成mybatis-generator-maven-plugin和通用mapper MyBatis-Spring整合
推薦群組: 系統(tǒng)架構與架構應用
更多相關推薦
iBATIS 從網(wǎng)上下載官方mybatis-spring整合示例源代碼,整合放上來,如果有必要的朋友可以下載,這里說的已經(jīng)很全了,最好是下載官方相關文檔來看。
來源:ITEYE
發(fā)布時間:2020-08-27 14:38:55
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
請問在哪里可以下載eova1.6的jar包?
來源:開源中國
發(fā)布時間:2019-03-18 08:36:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 求beetl的視頻教程 感激不盡 好人一生平安
來源:開源中國
發(fā)布時間:2015-11-18 11:49:00
相關推薦: ibatis源碼學習(三)參數(shù)和結果的映射原理 spring ibatis clob ibatis經(jīng)典示例 mule進階之ibatis component iBATIS入門知識進階四 iBatis高級應用 ibatis學習進階 iBATIS SQL Maps之Result Map屬性進階。
推薦群組: JBPM @net
更多相關推薦
iBATIS
Ibatis比較少人使用的配置語法?
簡單來說,ibatis3雖然沒有ognl,不過也支持基本的表達式(看起來有點像el表達式的樣子) 上次有個問題,說到兩個表單數(shù)據(jù)(兩個javabean),入同一個表,傳參就應該不成問題了
java代碼1:
Map map = new HashMap(); ComplexBean bean = new ComplexBean(); bean.setMap(new HashMap()); bean.getMap().put("id", new Integer(1)); map.put("bean", bean); Account account = new Account(); account.setId(2); Account anotherAccount = new Account(); anotherAccount.setId(3); map.put("accounts", new Account[] {account, anotherAccount}); Integer id = (Integer) sqlMap.queryForObject("mapBeanMap", map);
ibatis配置1:
select count(ACC_ID) from Account where ACC_ID in (#bean.map.id#,#accounts[0].id#,#accounts[1].id#)
java代碼2:
Map map = new HashMap(); ComplexBean bean = new ComplexBean(); bean.setMap(new HashMap()); Account account = new Account(); account.setId(2); Account anotherAccount = new Account(); anotherAccount.setId(3); bean.getMap().put("accounts", new Account[] {account, anotherAccount}); map.put("bean", bean);
ibatis配置2:
select count(ACC_ID) from Account where ACC_ID in #bean.map.accounts[].id#
當使用復雜配置并且參數(shù)帶有泛型的時候,使用比較標簽有可能導致如下錯誤: There is no READABLE property named ‘XXX’ in class ‘java.lang.Object’ .這是因為進行比較的時候,ibatis是通過反射獲取類型而不是先計算值的,這樣泛型的時候會獲取到Object類而不能得到真實的類型,自己簡單打個補丁先:
Index: src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java =================================================================== --- src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java (revision 1079874) +++ src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java (working copy) @@ -72,14 +72,13 @@ if (prop != null) { value1 = PROBE.getObject(parameterObject, prop); - type = PROBE.getPropertyTypeForGetter(parameterObject, prop); } else { value1 = parameterObject; - if (value1 != null) { - type = parameterObject.getClass(); - } else { - type = Object.class; - } + } + if (value1 != null) { + type = value1.getClass(); + } else { + type = Object.class; } if (comparePropertyName != null) { Object value2 = PROBE.getObject(parameterObject, comparePropertyName); ?
關于inlineParameterMap
例如#name#(標準配置),#name:NUMBER#(以:分割),#myVar:javaType=int#都是有效的
其中以:分割的有兩種方式,#name:jdbcTypeName#,#name:jdbcTypeName:nullvalue#(如果后面還有則會被加到nullvalue上去) 這是老配置方法,個人不推薦使用。
最后一種是新的配置方式,可以帶上javaType,jdbcType,mode,nullValue,numericScale,handler等參數(shù)(這個文檔有詳細描述)
jdbcType,javaType和TypeHandler
首先要說明一點的是,配置里邊的jdbcType和javaType兩個配置參數(shù)是為了生成TypeHandler(如果沒有指定的話);
查找typeHandler的內部結構是Map>,其中javaType是一個類,jdbcType是一個字符串;
所以jdbcType其實和數(shù)據(jù)庫的字段類型沒什么關系,只要能找到相應的TypeHandler即可(當然通常都會對應上);
typeHandler主要是做什么用的呢?無非就是使用jdbc api的時候選擇setString/setInt還是getString/getObject之類~~
只指定resultClass,沒有resultMap
如果沒有指定resultMap,ibatis會根據(jù)parameterClass生成一個AutoResultMap對象;
對于AutoResultMap,里邊的每個屬性的映射對應的typeHandler是什么?
resultClass TypeHandler Map ObjectTypeHandler
原型類型 Bean
相應類對應的typeHandler(javaType=?,jdbcType=null) 會對實例變量名稱進行大寫并和ResultSetMetaData信息進行對比,最后生成typeHandler(javaType=?,jdbcType=null)
所以使用parameterClass是map的時候,某些字段的處理可能會有點問題,例如oracle的NUMBER類型會被轉成BigDecimal類;
只指定parameterClass,沒有parameterMap
如果沒有指定parameterMap,就會根據(jù)配置的sql解析inlineParameterMap;
其中每個參數(shù)的TypeHandler如果沒有指定,會根據(jù)參數(shù)的類型來尋找,例如#name,jdbcType=NUMBER# 會根據(jù)name計算后的類型來制定javaType
這個typeHandler的好處可以對jdbc api友好,例如對于int默認會采用IntegerTypeHandler,這樣會調用PreparedStatement#setInt, 而不是統(tǒng)統(tǒng)setString或者setObject。
通常參數(shù)類型和jdbc類型不對應的時候,需要考慮設置typeHandler或者使用更強類型的Bean而不是統(tǒng)統(tǒng)使用map;
來源:ITEYE
發(fā)布時間:2020-08-27 14:38:25