ibatis 动态语句拼写心得
文章分类:Java编程
项目中用到了ibatis。看了很多篇在XML 里动态编写sql 的文章!
我突然有了疑问,在一个statement 中可以包含多个 dynamic 子标签么?
于是 试验了一把,嘿嘿 果然能行~~
dynamic 标签的作用是 可以自动添加或者移除 在SQL语句中 多余的表单符号 不用再担心 少了逗号,and 连接符号之类的
贴代码。。。(前提是你要理解dynamic 动态标签的基本作用)
下面代码 是一段插入数据 片段 我所要说的是只要数据库字段没有强制的 “不许为空”的话 都可以这样写,这样加大了 灵活性,只要设置作为参数的对象 sheetState 的任何一个或者N个属性 都成。可以进行动态的插入 ,也不用再担心SQL 语句会因为少写插入字段出错的问题。
当然如果表字段多的话 我还是不建议使用这样写~~ 因为每个字段都要去写入判断标签内的,会很长很长。
但虽然麻烦,但只要写完一个,以后的所有关于此表的添加 都可以这样通用了。
- < statement id = "addSheetState" parameterClass = "sheetState" resultClass = "Integer" >
- INSERT INTO
- < dynamic prepend = "EOMS_SHEETSTATE" open = "(" close = ")" >
- < isNotEmpty prepend = "," property = "v_parachsheetid" >
- V_PARACHSHEETID
- </ isNotEmpty >
- < isNotEmpty prepend = "," property = "v_sheetno" >
- V_SHEETNO
- </ isNotEmpty >
- < isNotEmpty prepend = "," property = "v_sheetstatus" >
- V_SHEETSTATUS
- </ isNotEmpty >
- < isNotEmpty prepend = "," property = "dtm_statustime" >
- DTM_STATUSTIME
- </ isNotEmpty >
- < isNotEmpty prepend = "," property = "v_people" >
- V_PEOPLE
- </ isNotEmpty >
- < dynamic open = "(" close = ")" prepend = "VALUES" >
- < isNotEmpty prepend = "," property = "v_parachsheetid" >
- #v_parachsheetid#
- </ isNotEmpty >
- < isNotEmpty prepend = "," property = "v_sheetno" >
- #v_sheetno#
- </ isNotEmpty >
- < isNotEmpty prepend = "," property = "v_sheetstatus" >
- #v_sheetstatus#
- </ isNotEmpty >
- < isNotEmpty prepend = "," property = "dtm_statustime" >
- #dtm_statustime#
- </ isNotEmpty >
- < isNotEmpty prepend = "," property = "v_people" >
- #v_people#
- </ isNotEmpty >
- </ dynamic >
- </ statement >
<statement id="addSheetState" parameterClass="sheetState" resultClass="Integer"> INSERT INTO <dynamic prepend="EOMS_SHEETSTATE" open="(" close=")"> <isNotEmpty prepend="," property="v_parachsheetid"> V_PARACHSHEETID </isNotEmpty> <isNotEmpty prepend="," property="v_sheetno"> V_SHEETNO </isNotEmpty> <isNotEmpty prepend="," property="v_sheetstatus"> V_SHEETSTATUS </isNotEmpty> <isNotEmpty prepend="," property="dtm_statustime"> DTM_STATUSTIME </isNotEmpty> <isNotEmpty prepend="," property="v_people"> V_PEOPLE </isNotEmpty> <dynamic open="(" close=")" prepend="VALUES"> <isNotEmpty prepend="," property="v_parachsheetid"> #v_parachsheetid# </isNotEmpty> <isNotEmpty prepend="," property="v_sheetno"> #v_sheetno# </isNotEmpty> <isNotEmpty prepend="," property="v_sheetstatus"> #v_sheetstatus# </isNotEmpty> <isNotEmpty prepend="," property="dtm_statustime"> #dtm_statustime# </isNotEmpty> <isNotEmpty prepend="," property="v_people"> #v_people# </isNotEmpty> </dynamic> </statement>
这是测试时调用的代码
- Eoms_SheetState sheetstate= new Eoms_SheetState();
- sheetstate.setV_parachsheetid("testid" );
- sheetstate.setDtm_statustime("2010-11-13 11:31:21" );
- sheetstatedao.addSheetState(sheetstate);
Eoms_SheetState sheetstate=new Eoms_SheetState();
sheetstate.setV_parachsheetid("testid");
sheetstate.setDtm_statustime("2010-11-13 11:31:21");
sheetstatedao.addSheetState(sheetstate);
1.首先要先去下载你需要的DTD文件,只所以MyEclipse不会给出关于ibatis的提示,就是因为MyEclipse 本身没有此DTD文件!(要注意的是你下载的DTD文件要和你使用ibatis版本一致) 要不知道怎么下?最简单的办法就是下面例子中的那个以HTTP 开头的地址 就是了 。
2.你打开你的ibatis XML文件 看到DTD的引入部分 最好复制下来 粘贴到TXT文本里 方便操作使用
例如:
- <!DOCTYPE sqlMap
- PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
- "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
3. 具体操作 :
打开MyEclipse(我的是6.5其他的应该差不多吧!)
选择Window-Preferences-(在搜索框里输入XML 会出现 XML Catalog选项),选中XML Catalog后 点击右边 Add按钮 第一个Location 选项是你DTD文件的真实地址,你放到哪都无所谓,只要能找得到。
第二个选项KeyType 不用管 应该是默认的 Public ID
第三个就要填 上面例子中 PUBLIC 后 第一段用引号包含的部分了。
也就是 -//ibatis.apache.org//DTD SQL Map 2.0//EN 这一部分。。
- < html >
- < head >
- < title > 可输入字符进行下拉框筛选 </ title >
- </ head >
- < script >
- var presscount = 0 ;
- var pressvalue = "" ;
- var Select = {
- showtext : function(obj,e){
- presscount++;
- var inputvalue = String .fromCharCode(e.charCode||e.which||e.keyCode);
- pressvalue pressvalue =pressvalue+inputvalue;
- e.returnValue = false ;
- var comboxitems = obj .options;
- for(var i = 0 ;i < comboxitems.length ;i++){
- if(comboxitems[i].text.toUpperCase().indexOf(pressvalue.toUpperCase())==0){
- comboxitems[i].selected = "selected" ;
- break;
- }
- }
- },
- clear : function(){
- alert("已清空!");
- presscount = 0 ;
- pressvalue = "" ;
- }
- }
- </ script >
- < body >
- < select id = "select" onkeypress = "Select.showtext(this,event);" onchange = "Select.clear();" >
- < option value = "" > </ option >
- < option value = "CONVMAXULTXPWR" >
- CONVMAXULTXPWR
- </ option
- < option value = "DLBETRAFFTHSONHSDPA" >
- DLBETRAFFTHSONHSDPA
- </ option >
- < option value = "DLINTERFERERSV" >
- DLINTERFERERSV
- </ option >
- < option value = "DLSTRTHSONHSDPA" >
- DLSTRTHSONHSDPA
- </ option >
- < option value = "DWPCHPOWER" >
- DWPCHPOWER
- </ option >
- < option value = "EVENT4ATHD" >
- EVENT4ATHD
- </ option >
- < option value = "EVENT4BTHD" >
- EVENT4BTHD
- </ option >
- < option value = "HSSCCHBLER" >
- HSSCCHBLER
- </ option >
- < option value = "HSSICHACKNACKPO" >
- HSSICHACKNACKPO
- </ option >
- < option value = "HSSICHSIRTARGET" >
- HSSICHSIRTARGET
- </ option >
- < option value = "HSSICHTPCSTEPSIZE" >
- HSSICHTPCSTEPSIZE
- </ option >
- < option value = "HYSTFOR3A" >
- HYSTFOR3A
- </ option >
- < option value = "HYSTFORINTERCELL" >
- HYSTFORINTERCELL
- </ option >
- < option value = "IDLESSEARCHRAT" >
- IDLESSEARCHRAT
- </ option >
- < option value = "INITSIRTARGET" >
- INITSIRTARGET
- </ option >
- < option value = "MAXALLOWEDULTXPOWER" >
- MAXALLOWEDULTXPOWER
- </ option >
- < option value = "MAXDLTXPWR" >
- MAXDLTXPWR
- </ option >
- < option value = "MAXFACHPOWER" >
- MAXFACHPOWER
- </ option >
- < option value = "MAXFPACHPOWER" >
- MAXFPACHPOWER
- </ option >
- < option value = "MAXHSSICHPRXPWR" >
- MAXHSSICHPRXPWR
- </ option >
- < option value = "MAXSIRTARGET" >
- MAXSIRTARGET
- </ option >
- < option value = "MAXTXPOWER" >
- MAXTXPOWER
- </ option >
- < option value = "MINDLTXPWR" >
- MINDLTXPWR
- </ option >
- < option value = "MINHSSICHPRXPWR" >
- MINHSSICHPRXPWR
- </ option >
- < option value = "MINSIRTARGET" >
- MINSIRTARGET
- </ option >
- < option value = "N300" >
- N300
- </ option >
- < option value = "N302" >
- N302
- </ option >
- < option value = "N304" >
- N304
- </ option >
- < option value = "N308" >
- N308
- </ option >
- < option value = "N312" >
- N312
- </ option >
- < option value = "N313" >
- N313
- </ option >
- < option value = "N315" >
- N315
- </ option >
- </ select >
- </ body >
- </ html >
<html>
<head>
<title>可输入字符进行下拉框筛选</title>
</head>
<script>
var presscount=0;
var pressvalue="";
var Select = {
showtext : function(obj,e){
presscount++;
var inputvalue=String.fromCharCode(e.charCode||e.which||e.keyCode);
pressvalue=pressvalue+inputvalue;
e.returnValue=false;
var comboxitems=obj.options;
for(var i=0;i<comboxitems.length;i++){
if(comboxitems[i].text.toUpperCase().indexOf(pressvalue.toUpperCase())==0){
comboxitems[i].selected="selected";
break;
}
}
},
clear : function(){
alert("已清空!");
presscount=0;
pressvalue="";
}
}
</script>
<body >
<select id="select" οnkeypress="Select.showtext(this,event);" οnchange="Select.clear();">
<option value=""></option>
<option value="CONVMAXULTXPWR">
CONVMAXULTXPWR
</option
<option value="DLBETRAFFTHSONHSDPA">
DLBETRAFFTHSONHSDPA
</option>
<option value="DLINTERFERERSV">
DLINTERFERERSV
</option>
<option value="DLSTRTHSONHSDPA">
DLSTRTHSONHSDPA
</option>
<option value="DWPCHPOWER">
DWPCHPOWER
</option>
<option value="EVENT4ATHD">
EVENT4ATHD
</option>
<option value="EVENT4BTHD">
EVENT4BTHD
</option>
<option value="HSSCCHBLER">
HSSCCHBLER
</option>
<option value="HSSICHACKNACKPO">
HSSICHACKNACKPO
</option>
<option value="HSSICHSIRTARGET">
HSSICHSIRTARGET
</option>
<option value="HSSICHTPCSTEPSIZE">
HSSICHTPCSTEPSIZE
</option>
<option value="HYSTFOR3A">
HYSTFOR3A
</option>
<option value="HYSTFORINTERCELL">
HYSTFORINTERCELL
</option>
<option value="IDLESSEARCHRAT">
IDLESSEARCHRAT
</option>
<option value="INITSIRTARGET">
INITSIRTARGET
</option>
<option value="MAXALLOWEDULTXPOWER">
MAXALLOWEDULTXPOWER
</option>
<option value="MAXDLTXPWR">
MAXDLTXPWR
</option>
<option value="MAXFACHPOWER">
MAXFACHPOWER
</option>
<option value="MAXFPACHPOWER">
MAXFPACHPOWER
</option>
<option value="MAXHSSICHPRXPWR">
MAXHSSICHPRXPWR
</option>
<option value="MAXSIRTARGET">
MAXSIRTARGET
</option>
<option value="MAXTXPOWER">
MAXTXPOWER
</option>
<option value="MINDLTXPWR">
MINDLTXPWR
</option>
<option value="MINHSSICHPRXPWR">
MINHSSICHPRXPWR
</option>
<option value="MINSIRTARGET">
MINSIRTARGET
</option>
<option value="N300">
N300
</option>
<option value="N302">
N302
</option>
<option value="N304">
N304
</option>
<option value="N308">
N308
</option>
<option value="N312">
N312
</option>
<option value="N313">
N313
</option>
<option value="N315">
N315
</option>
</select>
</body>
</html>
- 16:56
- 浏览 (50)
- 评论 (0)
- 分类: javascript
在javaeye上的收获可真不小啊,呵呵!
看了过来人的文章,感觉很好,我也顺便写到这里,方便以后用到的来看!
ibatis sql语句中 如果遇到 <,>,&,这三类符号的 ,必须要用CDATA 符号,因为在DTD规定中,那三个字符时有特殊含义的!
貌似项目用的是EXT3.2.1
当我查询出来数据 要动态更新时,此列是combox,可是我之前在renderer中 只单单使用了 load 和 return value,
初始化查询出来值是 汉字, 当我点击汉字要编辑时,会出来下拉框,但当我选择后失去焦点离开后,那值就会变成数字,我一直很迷茫,结果一个玩EXT 很转的同事 帮我解决了~~哎~~ 他说是老外的编码习惯,本身人家是没有汉字的。
下面是解决代码 重点在 renderer中~
- {
- header : "县市" ,
- width : 100 ,
- sortable : false ,
- dataIndex : 'v_country_name' ,
- renderer : function(value, metedata, record,columnIndex, rowIndex, store) {
- var combo = Ext.getCmp("combo_country" );
- combo.getStore().load({params : {i_subcomp_id:Ext.getCmp('company_id' ).getValue()}});
- if (combo.getStore().getCount()> 0 ){
- for (var i = 0 ; i < combo.getStore().getCount();i++){
- if (combo.getStore().getAt(i).get( 'i_country_id' )==value) {
- value = combo.getStore().getAt(i).get('v_country_name' );
- }
- }
- }
- return value;
- },
- editor : new fm.ComboBox({
- editable : false ,
- id : 'combo_country' ,
- triggerAction : 'all' ,
- mode : 'local' ,
- store : new Edata.JsonStore({
- root : 'country_lst' ,
- proxy : new Edata.HttpProxy({
- url : contextPath + 'prodata/findCountry.action'
- }),
- fields : ['i_country_id' , 'v_country_name' ]
- }),
- displayField : 'v_country_name' ,
- valueField : 'i_country_id'
- })
- }
{
header : "县市",
width : 100,
sortable : false,
dataIndex : 'v_country_name',
renderer : function(value, metedata, record,columnIndex, rowIndex, store) {
var combo = Ext.getCmp("combo_country");
combo.getStore().load({params : {i_subcomp_id:Ext.getCmp('company_id').getValue()}});
if(combo.getStore().getCount()>0){
for(var i = 0; i < combo.getStore().getCount();i++){
if(combo.getStore().getAt(i).get('i_country_id')==value) {
value = combo.getStore().getAt(i).get('v_country_name');
}
}
}
return value;
},
editor : new fm.ComboBox({
editable : false,
id : 'combo_country',
triggerAction : 'all',
mode : 'local',
store : new Edata.JsonStore({
root : 'country_lst',
proxy : new Edata.HttpProxy({
url : contextPath + 'prodata/findCountry.action'
}),
fields : ['i_country_id', 'v_country_name']
}),
displayField : 'v_country_name',
valueField : 'i_country_id'
})
}
①运行开始 -> 程序 -> BEA Products -> Tools -> Configuration Wizard。
②选择 Create a new WebLogic domain,Next。
③在 Select Domain Source 界面保持默认,Next。
④在 User name 处输入 user,两个 password 都输入 12345678(密码要求 8 位),Next。
⑤ 在 Configure Server Start Mode and JDK 界面中保持默认,即 JDK 选择的是“Sun SDK 1.5.0_04 @ C:\BEA\jdk150_04”,注意这里若选择“Other JDK”配置比 SDK 1.5.0_04 更高的版本,服务器启动时将会出现异常,所以最好保持默认,然后 Next。
⑥在 Customize Environment and Services Settings 界面中默认为 No,Next。
⑦在 Domain name 处输入 mydomain,点击 Create。
⑧完成后点击 Done 关闭 Configuration Wizard 对话框。
⑨ 运行开始 -> 程序 -> BEA Products -> User Projects -> mydomain -> Start Admin Server for Weblogic Server Domain,检查服务器是否启动成功。
--------------------关于服务器的配置----------------------
启 动 Eclipse,选择“Window -> Preferences”菜单,打开首选项对话框。展开 MyEclipse 下的 Application Servers 节点,点击 WebLogic 9,选中右边的 Enable 单选按钮,启用 WebLogic 服务器。配置如下:
①BEA home directory:C:\BEA(假定 WebLogic 安装在 C:\BEA 目录中)
②WebLogic installation directory:C:\BEA\WebLogic92
③Admin username:user(来自 WebLogic 中的配置)
④Admin password:12345678(来自 WebLogic 中的配置)
⑤Execution domain root:C:\BEA\user_projects\domains\mydomain
⑥Execution server name:AdminServer
⑦Security policy file:C:\BEA\WebLogic92\server\lib\weblogic.policy
⑧JAAS login configuration file:(Null)
接 着展开 WebLogic 9 节点,点击 JDK,在右边的 WLS JDK name 处选择 WebLogic 9 的默认 JDK。这里组合框中缺省为单独安装的 JRE。单击 Add 按钮,弹出 WebLogic -> Add JVM 对话框,在 JRE 主目录处选择 WebLogic 安装文件夹中的 JDK 文件夹,我的版本为 C:\BEA\jdk150_04,程序会自动填充其他选项。单击确定按钮关闭对话框。这时候就可以在 WLS JDK name 组合框中选择 jdk150_04 了。
至 此,MyEclipse 中 WebLogic 9 的配置工作就算完成了。下面可以看看在 Eclipse 中能否启动 WebLogic 服务器了?安装了 MyEclipse 之后,Eclipse 工具栏中就会有一个“Run/Stop/Restart MyEclipse Application Servers”下拉按钮。点击该按钮的下拉部分,选择“WebLogic 9 -> Start”菜单,即开始启动 WebLogic 了。通过查看控制台的消息,就可以检查启动是否成功,或发生什么异常。
补充配置
点击 Paths,在右边的 Prepend to classpath 列表框中,通过 Add JAR/ZIP 按钮,加入:
C:\BEA\WebLogic81\server\lib\weblogic.jar
C:\BEA\WebLogic81\server\lib\webservices.jar
如果要用到数据库,还需要把数据库的驱动类库添加进来,这里我们用 WebLogic 自带的 SQL Server 数据库驱动类库:
C:\BEA\WebLogic81\server\lib\mssqlserver4v65.jar
对常见启动问题
出现 The WebLogic Server did not start up properly. 提示和 java.io.InvalidClassException 异 常的问题,通常是因为 JDK 选择不当引起的,在 MyEclipse 的配置中选择的 JDK 应该必须与配置 WebLogic 时选择的 JDK 相同。当选择默认 JDK 时,也可以在 MyEclipse 中配置 BEA 的 jrockit90_150_04 这个 JDK。
这样更灵活 可以在外部调用的时候想哪到Properties文件里的哪个属性都行,当然必须要是Properties里存在的。。。
- /**
- * 读取properties文件
- * @param propertiesname
- * @return
- */
- public static Properties getProperties(String propertiesname) {
- Map map=new HashMap();
- Properties prop=null ;
- try {
- InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(propertiesname);
- prop = new Properties();
- prop.load(in);
- in.close();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- return prop;
- }
- public static void main(String args[]) {
- Map map=null ;
- Properties prop=Htools.getProperties("imageurl.properties" );
- String url=prop.getProperty("imgurl" ).toString();
- String aa=prop.getProperty("country" ).toString();
- //这里是为了解决读取中文的问题
- try {
- aa=new String(aa.getBytes( "ISO8859_1" ), "GBK" );
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println(url+"-----" +aa);
- }
/**
* 读取properties文件
* @param propertiesname
* @return
*/
public static Properties getProperties(String propertiesname) {
Map map=new HashMap();
Properties prop=null;
try {
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(propertiesname);
prop = new Properties();
prop.load(in);
in.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return prop;
}
public static void main(String args[]) {
Map map=null;
Properties prop=Htools.getProperties("imageurl.properties");
String url=prop.getProperty("imgurl").toString();
String aa=prop.getProperty("country").toString();
//这里是为了解决读取中文的问题
try {
aa=new String(aa.getBytes("ISO8859_1"), "GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(url+"-----"+aa);
}
- 16:35
- 浏览 (40)
- 论坛浏览 (432)
- 评论 (0)
- 分类: java
- <wls:virtual-directory-mapping>
- <local-path>E:/upload</local-path>
- <url-pattern>/*</url-pattern>
- </wls:virtual-directory-mapping>
<wls:virtual-directory-mapping>
<local-path>E:/upload</local-path>
<url-pattern>/*</url-pattern>
</wls:virtual-directory-mapping>
但去掉wls就OK!
OK!上面的说过了 那么就开始配置虚拟路径了
1.在自己工程/WEB-ROOT/WEB-INF/能找到自己需要的Weblogic.xml
2.在XML里写入下面这段代码即 配置成功!
例如:你想访问E:/upload/1/1025/1025_2009_1.jpg 只要输入contextPath/1/1025/1025_2009_1.jpg
contextPath可以通过 request.getContextPath()得到
- //这是正确的
- <virtual-directory-mapping>
- <local-path>E:/upload</local-path>
- <url-pattern>/*</url-pattern>
- </virtual-directory-mapping>
//这是正确的
<virtual-directory-mapping>
<local-path>E:/upload</local-path>
<url-pattern>/*</url-pattern>
</virtual-directory-mapping>