一,业务描述
最近单位有这样一个报表,根据选择的年份返回年份的列,比如,选择 城市,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<Integer> ages;
public List<Integer> getAges() {
return ages;
}
public void setAges(List<Integer> ages) {
this.ages = ages;
}
}
5,TreeDAO.java
public List<Tree> getTrees(TreeSearcher treeSearcher) ;
6,TreeDAO.xml
<select id="getTrees" parameterType="com.beck.TreeSearcher.TreeSearcher" resultType="com.springMyBatis.system.model.Tree">
select name ,
<foreach collection="ages" index="index" item="item" open="" separator="," close="">
(select age from tree a where a.id = t.id and a.age=#{item}) as age#{item}
</foreach>
from tree t group by name
</select>
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<Integer> ts = new ArrayList<Integer>();
ts.add(new Integer(10));
// ts.add(new Integer(11));
t.setAges(ts);
List<Tree> trees = treeDAO.getTrees(t);
for(Tree tt:trees){
System.out.println(tt.toString());
}
}
}
8,测试结果请看图片 MyBatis_DynamicColumn.png
如需源代码,可以加个人QQ: 2845695726