【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);
        }
    }
}
时间: 2024-11-19 09:26:27

【Java EE 学习第17天】【数据库导出到Excel】【多条件查询方法】的相关文章

【Java EE 学习第17天】【dbutils和回调函数】

一.dbutils的核心就是回调函数,可以说如果没有回调函数的思想,dbutils是不可能被开发出来的. 对于dbutils中的QuryRunner类,向该类的query方法提供不同的参数,可以得到不同类型的返回值类型,但是该方法并非是重载方法,这里借助回调函数和泛型可以实现和重载方法相同的效果,而且灵活性更高. 二.简单回调函数结构. 1.首先需要一个处理句柄的顶级接口,这是回调规范. interface RunnerHandler<T> { T handler(String str); }

Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库

参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Java EE 学习(6):IDEA + maven + spring 搭建 web(2) 5 数据库配置 下面,就要通过一个简单的例子,来介绍 SpringMVC 如何集成 Spring Data JPA(由 Hibernate JPA 提供),来进行强大的数据库访问,并通过本章节

Java EE学习--Quartz基本用法

新浪博客完全不适合写技术类文章.本来是想找一个技术性的博客发发自己最近学的东西,发现博客园起源于咱江苏,一个非常质朴的网站,行,咱要养成好习惯,以后没事多总结总结经验吧.很多时候都在网上搜索别人的总结,我自己也总结些东西,或许多多少少能帮得上别人. 首先提到的是Quartz,一个开源的定期执行计划任务的框架.其实我内心好奇这个框架很久了,像那些能定时修改数据库数据,定时分配任务的功能一直觉得很神奇.心动不如行动,今天我就小小的学习了一下用法,力求言简意赅,大家都懂的我就不说了. 第一步:下载Qu

Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理

转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库 记录: 通过对用户表的管理,更加深入地讲解SpringMVC的操作. 6 用户管理 既然我们

Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库 Java EE 学习(8):IDEA + maven + spring 搭建 web(

【Java EE 学习第16天】【dbcp数据库连接池】【c3p0数据库连接池】

零.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: 1 package day16.utils; 2 3 import java.io.IOException; 4 import java.lang.reflect.InvocationHandler; 5 import java.lang.reflect.Method; 6 import java.lang.reflect.Proxy; 7 import java.sql.Connection; 8 import java.sql.D

Java EE学习之旅1——HeadFirstJavaEE

因为找到的实习是用Java开发的公司,所以来学习一下Java EE的知识. 首先找来了书<轻量级Java EE企业应用实战>. 啊不得不说学了Java之后直接看这个还是完全不行呢,好多名词看都没有看过啊哈哈. 首先来看看都些啥看不懂的词... 1.JSP.Servlet和JavaBean JSP和Servlet都是用在表现层的东西,而实质上JSP编译成Servlet才运行. 但Servlet开发成本太大,所以用JSP. JavaBean用来通信交换表现层和底层数据. 2.MVC和Struts

Java EE学习——Quartz的Cron表达式

经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比如我们想设定淘宝“秒杀”的那一秒时间,完全可以用下面的方法设置执行时间. Calendar cal = Calendar.getInstance(); //设置将要发生的时间... cal.set(Calendar.DATE, xxx); //.......常规的生成scheduler和job //

Java EE学习之旅2——Ant

上次也了解了一下Ant是啥了,就是管理Java生成的工具嘛. 然后今天来学习一下如何使用Ant. 首先是指令: -find和-s Ant会一直到上级目录搜索build.xml,直到到达文件系统根目录: -buildfile.-file和-f 使用其他生成文件,例如a.xml: -quiet和-q 运行时只输出少数提示信息: -verbose和-v 输出多一点的提示信息. 2014-07-12 22:17:14 Java EE学习之旅2--Ant