【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对象的时候直接使用, ...
随机推荐
- java中Arraylist复制方法
方法一: ArrayList<Integer> mycopy=new ArrayList<Integer>(); mycopy=(ArrayList<Integer> ...
- Neural Style学习1——简介
该项目是Github上面的一个开源项目,其利用卷积神经网络的理论,参照论文A Neural Algorithm of Artistic Style,可以实现一种效果:两张图片,一张取其内容,另一张取其 ...
- Java 内存管理
java 内存管理机制 JAVA 内存管理总结 java 是如何管理内存的 Java 的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字 new 为 ...
- <<< Tomcat运行提示The server does not support version 3.0
导入了一个项目,运行Tomcat出现此错误大致由于当前导入项目服务器不支持J2ee版本 原因是导入项目的Tomcat版本是6.0,Tomcat 6.0仅支持到Servlet 2.5,而此时项目是3.0 ...
- <<< Oracle表创建、修改、删除基础操作
表是数据库存储数据的基本单元,它对应于现实世界中的对象(如部门和雇员等).表按列进行定义,存储若干行数据.表中应该至少有一列.在 Oracle 中,表一般指的是一个关系型数据表.也可以生成临时表和对象 ...
- 谈谈java开发
1.不要让未来的决策阻止你现在前进的方向 一步步列出每个步骤,那么对于现在应该专注于做什么,就一目了然了.你也不会浪费 时间去担心应该以后操心的事情. 2.不要让自信诱骗你忘事 当你去学习一个新概 ...
- 10月24日上午PHP面向对象
面向对象 程序分为两种,一种是面向过程的,另一种是面向对象的.之前的学的都是面向过程的,按部就班的一步一步的按照顺序往下走. 面向对象: 1.什么叫做对象 一切皆为对象(一个对象由一组属性和有权对这些 ...
- ES5语法
ES5新语法主要是体现在Object和.Array操作,同时涉及到JSON. Function.Date 和 String类型上. 1.Object ES5最大的特点是对象扩展很多方法. 新建对象:c ...
- 使用MicroService4Net 快速创建一个简单的微服务
“微服务架构(Microservice Architecture)”一词在过去几年里广泛的传播,它用于描述一种设计应用程序的特别方式,作为一套独立可部署的服务.目前,这种架构方式还没有准确的定义,但是 ...
- 快排 快速排序 qsort quicksort C语言
现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁. #include<stdio.h> # ...