本节摘要:本节介绍ibatis的多条件查询
1.引言
最近,项目中某个表需要配置500多条数据,数据配置中难免会出错,此表关键字段为编号和方法名称,编号和方法名称要对应,如此的话,少配置一条记录,编号和方法名称不对应等等,这些错误都是可能存在的。人工去检查数据,如此多的数据,一是工作量大,二是人工检查也容易出错。签于此,写了一段代码来做一些简单的校验。采用ibatis加jxl的方式来实现此功能。采用jxl去取excle的数据,然后再根据取出的编号和方法名称去数据库查询数据,如果根据此条件可以查询到数据,那么表示此脚本已经配置,同时把表中未配置的数据给筛选出来。采用ibatis是因为之前学习过ibatis半自动化框架,这次只是想拿出来巩固一下。采用sql脚本的形式应该也可以实现此功能,这里不是我想介绍的。
本节的介绍是基于之前的一篇博客ibatis学习笔记,本节我就不再新建工程以及对应的接口和实现类,直接在原来的接口和实现类中增加一个方法。
关于jxl的介绍,也可以参考之前的一篇博客jxl简单介绍--excle数据的读和取
数据库连接的是本地的oracle数据库。
(1)excel中的数据形式如下:
这里只贴出10条记录,第一列编号,第二列为方法名称,我用jxl的方式取出每一行的编号和方法名称,如果根据这两个条件可以在表中查询到数据,表示我这条数据已经在表中配置了。
检验的前提是excel中的数据是经过整理的,是完全无误的,是基于这个的基础上,去对数据库表中的数据做以下检验.
(2)表的结构如下:
本来准备表把建表的语句贴出来,想想还是算了,毕竟是公司内部的东东,还是慎重点好。
2.代码文件
实在没什么好介绍的,就直接上代码吧
从本节你可能没什么收获请见谅,有些博客我只是想记录一下工作中的点点滴滴。
为了方便查看,我把增加的文件和修改的文件分开介绍。
(1)增加的文件
BsServiceCorba.java---表对应的javabean对象


1 package ibatis; 2 3 /** 4 * 5 *Module: BsServiceCorba.java 6 *Description: bs_service_corba的javabean 7 *Company: 8 *Author: pantp 9 *Date: May 12, 2012 10 */ 11 public class BsServiceCorba { 12 13 public String STATE; 14 public String IMPL_METHOD; 15 public String BILL_ID_EXPR; 16 public String REMARKS; 17 public String BUSI_CODE; 18 public String STATE_DATE; 19 public String CREATE_DATE; 20 public String SERVICE_ID; 21 public String IMPL_MODE; 22 public String IMPL_CLASS; 23 24 public String getSTATE() { 25 return STATE; 26 } 27 28 public void setSTATE(String state) { 29 STATE = state; 30 } 31 32 public String getIMPL_METHOD() { 33 return IMPL_METHOD; 34 } 35 36 public void setIMPL_METHOD(String impl_method) { 37 IMPL_METHOD = impl_method; 38 } 39 40 public String getBILL_ID_EXPR() { 41 return BILL_ID_EXPR; 42 } 43 44 public void setBILL_ID_EXPR(String bill_id_expr) { 45 BILL_ID_EXPR = bill_id_expr; 46 } 47 48 public String getREMARKS() { 49 return REMARKS; 50 } 51 52 public void setREMARKS(String remarks) { 53 REMARKS = remarks; 54 } 55 56 public String getBUSI_CODE() { 57 return BUSI_CODE; 58 } 59 60 public void setBUSI_CODE(String busi_code) { 61 BUSI_CODE = busi_code; 62 } 63 64 public String getSTATE_DATE() { 65 return STATE_DATE; 66 } 67 68 public void setSTATE_DATE(String state_date) { 69 STATE_DATE = state_date; 70 } 71 72 public String getCREATE_DATE() { 73 return CREATE_DATE; 74 } 75 76 public void setCREATE_DATE(String create_date) { 77 CREATE_DATE = create_date; 78 } 79 80 public String getSERVICE_ID() { 81 return SERVICE_ID; 82 } 83 84 public void setSERVICE_ID(String service_id) { 85 SERVICE_ID = service_id; 86 } 87 88 public String getIMPL_MODE() { 89 return IMPL_MODE; 90 } 91 92 public void setIMPL_MODE(String impl_mode) { 93 IMPL_MODE = impl_mode; 94 } 95 96 public String getIMPL_CLASS() { 97 return IMPL_CLASS; 98 } 99 100 public void setIMPL_CLASS(String impl_class) { 101 IMPL_CLASS = impl_class; 102 } 103 104 }
BsServiceCorba.xml---表对应的javabean的配置文件


1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!DOCTYPE sqlMap 4 PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" 5 "http://ibatis.apache.org/dtd/sql-map-2.dtd"> 6 7 <sqlMap> 8 <typeAlias alias="BsServiceCorba" type="ibatis.BsServiceCorba" /> 9 10 <!-- 精确查询 多条件查询--> 11 <parameterMap class="java.util.HashMap" id="myParam"> 12 <!-- property屬性,对应代码中map对象的key,可以随便写,尽量望文生义 --> 13 <parameter property="BUSI_CODE" /> 14 <parameter property="IMPL_METHOD" /> 15 <parameter property="STATE" /> 16 </parameterMap> 17 18 <select id="multQuery" parameterMap="myParam" 19 resultClass="BsServiceCorba"> 20 SELECT BUSI_CODE,IMPL_METHOD FROM BS_SERVICE_CORBA WHERE 21 BUSI_CODE =? AND IMPL_METHOD =? AND STATE = ? 22 </select> 23 24 </sqlMap>
Check.java---读取excel数据的方法和测试的main方法


1 package ibatis; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 7 import jxl.Sheet; 8 import jxl.read.biff.BiffException; 9 import jxl.read.biff.WorkbookParser; 10 11 /** 12 * 13 *Module: Check.java 14 *Description: 采用jxl读取excel数据,然后根据读取的数据采用ibatis去查询oracle数据库 15 *Company: 16 *Author: pantp 17 *Date: May 12, 2012 18 */ 19 public class Check { 20 21 //指定excel所在的路径,这里采用的是绝对路径 22 public final static String excelPath = "d:/data.xls"; 23 24 /** 25 * add by pantp 2012/05/12 26 * 采用jxl的方式去读取excel中的数据 27 * @throws BiffException 28 * @throws IOException 29 */ 30 public static void queryExcel() throws BiffException, IOException { 31 InputStream is = new FileInputStream(excelPath); 32 WorkbookParser rwb = (WorkbookParser) WorkbookParser.getWorkbook(is); 33 Sheet rs1 = rwb.getSheet(0);//得到excel中第一个sheet的对象 34 int rows = rs1.getRows();// 获取所有的行数 35 System.out.println("\n【" + excelPath 36 + "】表所在的信息为如下:=================="); 37 System.out.println("行数=" + rows); 38 int cols = rs1.getColumns();// 获得所有的列数 39 System.out.println("列数=" + cols); 40 System.out.println("========================================\n"); 41 42 System.out.println("\n========================================"); 43 IDeptSV query = new DeptSVImpl(); 44 int m = 0; 45 int n = 0; 46 for (int j = 0; j < rows; j++) { 47 String busiCode = rs1.getCell(0, j).getContents();//得到编号 48 String implMehtod = rs1.getCell(1, j).getContents();//得到方法名称 49 BsServiceCorba bcs = query.qryBsServieceCorba(busiCode, implMehtod); 50 if (bcs == null) {//对象为null,表示没有查询到数据 51 if (m % 5 == 0) {//每5行空一行 52 System.out.println(); 53 } 54 //打印一个序号 55 System.out.println("(" + (m + 1) + ")" + "\t\t" + busiCode 56 + "\t\t记录不存在"); 57 m++;//统计未配置数据的个数 58 } else { 59 n++;//统计已配置数据的个数 60 } 61 } 62 System.out.println("\n=========================================\n"); 63 64 System.out.println("校验记录如下:================================="); 65 System.out.println("数据库脚本【已】配置的条数为:" + n); 66 System.out.println("数据库脚本【未】配置的条数为:" + m); 67 System.out.println("=========================================="); 68 } 69 70 /** 71 * add by pantp 2012/05/12 72 * 测试的main方法 73 * @param args 74 * @throws BiffException 75 * @throws IOException 76 */ 77 public static void main(String[] args) throws BiffException, IOException { 78 79 queryExcel(); 80 81 } 82 83 }
(2)修改的文件
IDeptSV.java---增加一个查询表的qryBsServieceCorba接口
/**
* add by pantp 2012/05/12
* 根据需求编号和方法名称去查询BS_SERVICE_CORBA表
* @param busiCode 需求编号
* @param implMehtod 方法名称
* @return
*/
public BsServiceCorba qryBsServieceCorba(String busiCode,String implMehtod);
DeptSVImpl.java---增加对qryBsServieceCorba接口的实现


1 /** 2 * add by pantp 2012/05/12 3 * 根据需求编号和方法名称去查询BS_SERVICE_CORBA表 4 * @param busiCode 需求编号 5 * @param implMehtod 方法名称 6 * @return 7 */ 8 public BsServiceCorba qryBsServieceCorba(String busiCode, String implMehtod) { 9 Map p = new HashMap(); 10 // 此处的key和BsServiceCorba.xml文件中的parameter标签的property属性是一一对应的 11 p.put("BUSI_CODE", busiCode.trim());// 需求编号 12 p.put("IMPL_METHOD", implMehtod.trim());// 方法名称 13 p.put("STATE", "U");// 数据有效 14 15 // BsServiceCorba bsc = new BsServiceCorba(); 16 BsServiceCorba bsc = null; 17 try { 18 sqlMapClient.startTransaction();// 开始事务 19 20 bsc = (BsServiceCorba) sqlMapClient.queryForObject("multQuery", p, 21 bsc); 22 23 sqlMapClient.commitTransaction();// 提交事务 24 } catch (SQLException e) { 25 try { 26 sqlMapClient.getCurrentConnection().rollback();// 回滚事务 27 System.out.println(busiCode + "\t\t" + e.getMessage()); 28 } catch (SQLException e1) { 29 e1.printStackTrace(); 30 } 31 e.printStackTrace(); 32 } finally { 33 try { 34 sqlMapClient.endTransaction();// 结束事务 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } 38 } 39 return bsc; 40 }
SqlMapConfig.xml---添加对实体类BsServiceCorba和数据库表BS_SERVICE_CORBA的映射
只用加以下一句配置:
<sqlMap resource="ibatis/BsServiceCorba.xml" />
3.测试效果
把文件放在代码中指定的位置,运行Check类中的main方式,测试的效果如下:
为了方便把测试的整个效果截下来,我只用了100条数据来操作。
多条件查询也可以通过在java代码中拼装sql语句来实现,只是这种方式失去了ibatis代码和sql语句分离的好处,这里就采用以上的配置文件来实现了。