MyBatis动态SQL之动态返回列(Dynamic Column)

一,业务描述

最近单位有这样一个报表,根据选择的年份返回年份的列,比如,选择 城市,2015,2016年,那么返回列就是三列,城市,2015年数据,2016年数据,如果是只返回城市 , 2016年数据,那么返回列只有两列 ,城市,2016年数据


二,实现技术MyBatis

我们只是在Mybatis中,where子句中可以采用foreach进行动态集合的输入查询,但是在select子句中,网上的例子几乎没有,与是咱们不防来试试如何实现“一”中描述的需求


三,准备环境

1,mybatis环境,网上资料很多自行搜索

2,可以采用mysql,oracle等关系型数据库

建表语句:插入数据

dtop table 'tree' ;
create table tree(
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) ,
age int(2),
year int(4),
notes varchar(20),
PRIMARY KEY (id)
)ENGINE=MyISAM  DEFAULT CHARSET=utf8; 
insert into tree(name, age , year , notes) values 
('nanjing' , 10 , 2006 , 'BTP'),
('beijing' , 11 , 2005 , 'BTP'),
('nanjing' , 11 , 2006 , 'CTP') ;
insert into tree(name, age , year , notes) values 
('nanjing' , 10 , 2006 , 'Activation'),
('beijing' , 11 , 2005 , 'NNNN'),
('beijing' , 11 , 2005 , 'YYYY'),
('nanjing' , 11 , 2005 , 'Activation') ;

3,自行根据建表语句建Tree.java

4,Tree.xml中动态条件 TreeSearcher 

public class TreeSearcher {
private List ages;
public List getAges() {
return ages;
}
public void setAges(List ages) {
this.ages = ages;
}
}

5,TreeDAO.java

public List getTrees(TreeSearcher treeSearcher) ;


6,TreeDAO.xml

7, 测试类,

public class UserController {


public static void main(String[] args) {
ApplicationContext app = null; 
app = new ClassPathXmlApplicationContext("applicationContex.xml");

TreeDao treeDAO = (TreeDao)app.getBean("treeDao") ;
TreeSearcher t = new TreeSearcher();
List ts = new ArrayList();
ts.add(new Integer(10));
// ts.add(new Integer(11));
t.setAges(ts);

List trees = treeDAO.getTrees(t);
for(Tree tt:trees){
System.out.println(tt.toString());
}
}
}

8,测试结果请看图片 MyBatis_DynamicColumn.png

MyBatis动态SQL之动态返回列(Dynamic Column)_第1张图片

如需源代码,可以加个人QQ: 2845695726


你可能感兴趣的:(MyBatis动态SQL之动态返回列(Dynamic Column))