【Java EE 学习 17 下】【数据库导出到Excel】【多条件查询方法】
一、导出到Excel
1.使用DatabaseMetaData分析数据库的数据结构和相关信息。
(1)测试得到所有数据库名:
private static DataSource ds=DataSourceUtils_C3P0.getDataSource();
Connection conn=ds.getConnection();
DatabaseMetaData dbmd=conn.getMetaData();
ResultSet rs=dbmd.getCatalogs();
while(rs.next())
{
System.out.println(rs.getString("TABLE_CAT"));
}
String dbName=dbmd.getDatabaseProductName();
String dbVersion=dbmd.getDatabaseProductVersion();
System.out.println(dbName+":"+dbVersion);
运行结果:
information_schema
bms
bookstore
contacts
day20
mysql
performance_schema
shopping
test
user
users
MySQL:5.5.25
(2)根据数据库名得到所有表名
public void testGetTalbesByDBName() throws SQLException
{
Connection conn=ds.getConnection();
DatabaseMetaData dbmd=conn.getMetaData();
ResultSet rs=dbmd.getTables("test", "test", null, new String[]{"TABLE"});
while(rs.next())
{
System.out.println(rs.getString("TABLE_NAME"));
}
}
运行结果:
people
user
2.使用ResultSetMetaData分析表结构。
public void testTest1() throws SQLException
{
Connection conn=ds.getConnection();
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select id,name,age,sex from people");
ResultSetMetaData rsmd=rs.getMetaData();
int columnsCount=rsmd.getColumnCount();
System.err.println("一共有"+columnsCount+"列!");
for(int i=0;i<columnsCount;i++)
{
String columnName=rsmd.getColumnName(i+1);
System.out.print(columnName+"\t\t");
}
System.out.println();
while(rs.next())
{
for(int i=0;i<columnsCount;i++)
{
String columnName=rsmd.getColumnName(i+1);
System.out.print(rs.getString(columnName)+"\t\t");
}
System.out.println();
}
conn.close();
}
运行结果:
id name age sex
001 张三 12 男
002 李四 13 男
003 王五 15 男
3.使用第三方jar包测试操作Excel文件。
(1)POI下载:http://poi.apache.org/download.html
(2)测试POI
package day17.kdyzm.Test; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; public class TestPOI {
public static void main(String[] args) throws Exception {
FileOutputStream fos=new FileOutputStream("first.xls");
Workbook workbook=new HSSFWorkbook();
Sheet sheet=workbook.createSheet("第一张表");
Row row=sheet.createRow(0);
Cell cell1=row.createCell(0);
cell1.setCellValue("第一行第一列第一个数据");
Cell cell2=row.createCell(1);
cell2.setCellValue("第一行第二列第一个数据");
workbook.close();
workbook.write(fos);
fos.close();
}
}
运行结果:

4.导出数据库到Excel,每一个标签页对应着一张表,而且要求灵活更换内容。
package day17.kdyzm.exportToExcel; import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; import day17.regular.utils.DataSourceUtils_C3P0; /**
* 将数据库中的表数据导出到Excel表格中
* @author kdyzm
*
*/
public class ExportDataToExcel {
private static String dbname="bookstore";
public static void main(String[] args) throws Exception {
List<String>tablenames=getAllTableNames(dbname);
backupToXls(tablenames);
}
//通过所有的表名将数据被分到xls文件中
private static void backupToXls(List<String> tablenames) throws Exception {
Connection conn=DataSourceUtils_C3P0.getConnection();
Workbook wb=new HSSFWorkbook();
FileOutputStream fos=new FileOutputStream(dbname+".xls");
Statement st=conn.createStatement();
for(String tablename:tablenames)
{
Sheet sheet=wb.createSheet(tablename);
String sql="select * from "+dbname+"."+tablename;
ResultSet rs=st.executeQuery(sql);
ResultSetMetaData rsmt=rs.getMetaData();
int columns=rsmt.getColumnCount();
//写入第一行tablehead
Row tablehead=sheet.createRow(0);
for(int i=0;i<columns;i++)
{
String columnName=rsmt.getColumnName(i+1);
Cell cell=tablehead.createCell(i);
cell.setCellValue(columnName);
}
//写入数据
int index=1;
while(rs.next())
{
Row row=sheet.createRow(index++);
for(int i=0;i<columns;i++)
{
String columnName=rsmt.getColumnName(i+1);
String value=rs.getString(columnName);
Cell cell=row.createCell(i);
cell.setCellValue(value);
}
}
}
wb.write(fos);
wb.close();
fos.close();
conn.close();
}
//首先获得所有的表名列表
private static List<String> getAllTableNames(String dbname) throws SQLException {
Connection conn=DataSourceUtils_C3P0.getConnection();
DatabaseMetaData dmd=conn.getMetaData();
ResultSet rs=dmd.getTables(dbname, dbname, null, new String[]{"TABLE"});
List<String>tablenames=new ArrayList<String>();
while(rs.next())
{
tablenames.add(rs.getString("TABLE_NAME"));
}
conn.close();
return tablenames;
}
}
运行结果:

二、多条件查询方法简介
1.核心思想: where 1=1 使用的要恰到好处
2.实现方法:
package day17.kdyzm.searchByMultipleInput;
public class People {
private String id;
private String name;
private int age;
private String sex; public People() {
}
public People(String id, String name, int age, String sex) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "People [id=" + id + ", name=" + name + ", age=" + age
+ ", sex=" + sex + "]";
}
}
package day17.kdyzm.searchByMultipleInput; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler; import day17.regular.utils.DataSourceUtils_C3P0; /**
* 多条件查询方法:可以极大提高代码书写效率
* 结合dbutils
* 结合java Bean
* @author kdyzm
*
*/
public class SearchByMultipleInput {
public static void main(String args[]) throws SQLException{
DataSource ds=DataSourceUtils_C3P0.getDataSource();
String sql="select * from people where 1=1";
People p=new People();
p.setId(null);
p.setName(null);
p.setAge(0);
p.setSex("女");
List<String>list=new ArrayList<String>();
if(p.getId()!=null){
sql=sql+" and id=?";
list.add(p.getId());
}
if(p.getName()!=null){
sql=sql+" and name like ?";
list.add("%"+p.getName()+"%");
}
if(p.getAge()!=0){
sql=sql+" and age=?";
list.add(p.getAge()+"");
}
if(p.getSex()!=null){
sql=sql+" and sex=?";
list.add(p.getSex());
}
QueryRunner run=new QueryRunner(ds);
List<People>peoples=run.query(sql,new BeanListHandler<People>(People.class),list.toArray());
for(People pp:peoples)
{
System.out.println(pp);
}
}
}
【Java EE 学习 17 下】【数据库导出到Excel】【多条件查询方法】的更多相关文章
- 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】
一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...
- 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...
- 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】
一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...
- 【Java EE 学习 69 下】【数据采集系统第一天】【实体类分析和Base类书写】
之前SSH框架已经搭建完毕,现在进行实体类的分析和Base类的书写.Base类是抽象类,专门用于继承. 一.实体类关系分析 既然是数据采集系统,首先调查实体(Survey)是一定要有的,一个调查有多个 ...
- 【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】
疑问:怎样判断存储过程执行之后返回值是否为空. 一.连接oracle数据库 1.需要的jar包:在安装的oracle中就有,所以不需要到官网下载,我的oracle11g下:D:\app\kdyzm\p ...
- 【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】
之前说过,如果一个数据库中要存储的数据量整体比较小,但是其中一个表存储的数据比较多,比如日志表,这时候就要考虑分表存储了:但是如果一个数据库整体存储的容量就比较大,该怎么办呢?这时候就需要考虑分库了, ...
- 【Java EE 学习 74 下】【数据采集系统第六天】【使用Jfreechart的统计图实现】【将JFreechart整合到项目中】
之前说了JFreechart的基本使用方法,包括生成饼图.柱状统计图和折线统计图的方法.现在需要将其整合到数据采集系统中根据调查结果生成三种不同的统计图. 一.统计模型的分析和设计 实现统计图显示的流 ...
- 【Java EE 学习 72 下】【数据采集系统第四天】【移动/复制页分析】【使用串行化技术实现深度复制】
一.移动.复制页的逻辑实现 移动.复制页的功能是在设计调查页面的时候需要实现的功能.规则是如果在同一个调查中的话就是移动,如果是在不同调查中的就是复制. 无论是移动还是复制,都需要注意一个问题,那就是 ...
- 【Java EE 学习 70 下】【数据采集系统第二天】【Action中User注入】【设计调查页面】【Action中模型赋值问题】【编辑调查】
一.Action中User注入问题 Action中可能会经常用到已经登陆的User对象,如果每次都从Session中拿会显得非常繁琐.可以想一种方法,当Action想要获取User对象的时候直接使用, ...
随机推荐
- SVN随记
SVN中提交代码时报如下错误 commit -m "sync" E:/resource/rad_workspace/IMSCrawl/src/configuration.prope ...
- Servlet和JSP学习指导与实践(二):Session追踪
前言: web应用中经常需要对某些有用的信息进行存储或者附加一些信息.本文主要介绍session,即“会话”跟踪的几种不同方式~ ----------------------------4种管理ses ...
- 亿级 Web 系统的容错性建设实践
一. 重试机制 最容易也最简单被人想到的容错方式,当然就是“失败重试”,总而言之,简单粗暴!简单是指它的实现通常很简单,粗暴则是指使用不当,很可能会带来系统“雪崩”的风险,因为重试意味着对后端服务的双 ...
- Linux 下EXT2文件系统 —— 如何将蚂蚁和大象优雅的装进冰箱里
这一阵子真是偷懒,无时无刻不和自己身体中的懒癌做斗争.最终我还是被打败了,星期天两天几乎都是荒废过去的,在空闲的时候实际上我内心也是有点焦虑的,不知道去怎么度过这时间.学习吧又不想学习,看电视娱乐吧也 ...
- 逆向工程学习第三天--另外一个ShellCode
上周自己打造的添加用户的shellcode太长,不过当时主要目的是为了锻炼手动asm,熟悉一些复杂的参数类型如何手动进行构造,然后通过堆栈传递. 接下来就打造一个弹计算器的shellcode来进行接下 ...
- 创建一个点状注记(MarkerElement)
1.根据XY创建一个点 /// <summary> /// 根据x y创建新点 /// </summary> /// <param name="dX" ...
- Endnote专题之--output style相关问题
Endnote专题之--output style相关问题 1. 打开output style, Edit--->Output Styles--->选择要编辑的某个style模板,如下面的E ...
- postgresql:pgadmin函数调试工具安装过程
通过安装第三方插件pldebugger,可实现在pgadmin客户端对函数设置断点.调试,具体过程如下: 1.下载pldebugger安装包:http://git.postgresql.org/git ...
- XML Schema and XMLspy notes
Introduction An xml documents consists of elements, attributes and text. There are two structures in ...
- BZOJ2006——[NOI2010]超级钢琴
1.题意:给一个序列,让你取出k个不同的区间,要求长度在之间,问所有区间和的最大值 2.分析:这道题拿过来就能知道是要拿出前k个最大的区间,我们思考最暴力的做法,就是把这个所有的区间枚举出来算,取出前 ...