JAVA数据库取数据万用方法
Java千万级别数据处理与优化

Java千万级别数据处理与优化随着互联网的发展,数据规模异常的庞大。
对于Java开发人员来说,面对这种情况,我们需要从性能和优化的角度思考,从而使我们的程序在处理海量数据时更有效率、更加可靠。
一、数据处理1. 数据读取优化数据读取是数据处理的第一步,良好的数据读取优化可以最大限度地提高程序的效率。
在数据读取方面,我们需要注重以下几个方面的优化:(1)缓存读取:对于内存中需要反复读取的数据,我们应该缓存读取,避免多次访问磁盘带来的性能损耗。
(2)文件切割:对于大文件的读取,我们可以将其切割成多个小文件,以便于多线程同时读取,并且有效减少了每个线程读取文件大小的开销。
(3)使用BufferedInputStream和BufferedReader:Java中提供了BufferedInputStream和BufferedReader这两种缓存读取的方式,可以有效地提高文件读取的效率。
2. 数据存储优化在面对千万级别的数据时,数据的存储也是我们需要优化的重要环节。
在数据存储方面,我们需要注重以下几个方面的优化:(1)使用内存存储:对于频繁读写的数据,我们应该尽量使用内存存储,避免频繁的磁盘读写,从而提高程序效率。
(2)使用NoSQL数据库:对于大规模的数据存储,我们可以使用NoSQL数据库来代替传统的关系型数据库,NoSQL数据库对分布式存储的支持更加完善,可以提高数据存储的效率。
(3)批量操作:在实际开发中,我们应该尽量采用批量操作的方式进行数据存储,这样可以有效提高数据处理的效率。
二、数据处理算法1. 分治算法分治算法是一种非常常见的算法,可以用于解决很多常见的数据处理问题。
在数据分析处理过程中,分治算法可以用来将庞大的数据集划分成多个小数据集,然后并行处理每个小数据集,最后合并结果。
通过这种方法,可以有效提高程序的处理效率。
2. MapReduce算法MapReduce算法是一种分布式数据处理算法,可以对千万级别的数据进行优化。
java中的try语句

java中的try语句
嘿,朋友!你知道在 Java 里那个神奇的 try 语句吗?就好像是你出门时带着的一把保护伞。
比如说,你要从一个文件里读取数据(这就好比要从一个神秘的宝箱里拿宝贝),可万一这个文件不存在或者出了啥问题,那可就糟糕啦!这时候 try 语句就闪亮登场啦!
想象一下,你正在写一段代码,要打开一个网络连接来获取信息。
如果网络突然断了,程序不得崩溃啊?但是有了 try 语句,它就会说:“别怕,我来罩着!” 然后把可能出问题的那段代码放在 try 块里。
就像你走在一条充满陷阱的路上,try 语句就是提前给你围起来的保护栏,让你能相对安全地通过。
再比如说,你要调用一个可能会抛出异常的方法,把这调用放在try 里,不就相当于给这个操作穿上了一层防护服嘛!
总之,Java 中的 try 语句简直就是我们的救星,能在代码可能出现意外的时候,帮我们稳住局面,避免整个程序乱套。
你说,这么好用的东西,咱们能不好好利用吗?
我的观点就是:在 Java 编程中,一定要熟练运用 try 语句,它能让我们的代码更健壮,更可靠!。
java从数据库读取千万数据进行遍历生成文件的方法

Java从数据库读取千万数据进行遍历生成文件的方法在实际的开发中,我们经常会遇到需要从数据库中读取大量数据并进行处理的情况。
本文将介绍如何使用Java从数据库读取千万数据,并进行遍历生成文件的方法。
1. 数据库准备首先,我们需要准备一个数据库,并在其中创建一个表来存储需要读取的数据。
假设我们有一个名为user的表,包含以下字段:•id:用户ID,类型为整数•name:用户名,类型为字符串•age:用户年龄,类型为整数2. 导入数据库驱动在Java程序中连接数据库,我们需要导入相应的数据库驱动。
以MySQL为例,我们可以使用mysql-connector-java驱动。
可以在Maven项目的pom.xml文件中添加以下依赖:<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency></dependencies>3. 连接数据库在Java程序中连接数据库,需要使用java.sql包中的相关类。
首先,我们需要建立数据库连接,并创建一个Connection对象。
可以编写一个工具类来封装数据库连接的操作,例如:import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBUtil {private static final String URL = "jdbc:mysql://localhost:3306/mydb";private static final String USERNAME = "root";private static final String PASSWORD = "123456";public static Connection getConnection() {Connection connection = null;try {Class.forName("com.mysql.cj.jdbc.Driver");connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}return connection;}}以上代码中,getConnection方法用于获取数据库连接。
Java实现大批量数据导入导出(100W以上) -(二)导出

Java实现⼤批量数据导⼊导出(100W以上) -(⼆)导出使⽤POI或JXLS导出⼤数据量(百万级)Excel报表常常⾯临两个问题:1. 服务器内存溢出;2. ⼀次从数据库查询出这么⼤数据,查询缓慢。
当然也可以分页查询出数据,分别⽣成多个Excel打包下载,但这种⽣成还是很缓慢。
⼤数据量导⼊请参考:那么如何解决呢?我们可以借助XML格式利⽤模板替换,分页查询出数据从磁盘写⼊XML,最终会以Excel多sheet形式⽣成。
亲测2400万⾏数据,⽣成Excel⽂件4.5G,总耗时1.5分钟。
我利⽤StringTemplate模板解析技术对XML模板进⾏填充。
当然也可以使⽤FreeMarker, Velocity等Java模板技术实现。
⾸先引⼊StringTemplate所需Jar包:使⽤技术为 stringTemplatepom.xml:1 <dependency>2<groupId>antlr</groupId>3<artifactId>antlr</artifactId>4<version>2.7.7</version>5</dependency>67<dependency>8<groupId>org.antlr</groupId>9<artifactId>stringtemplate</artifactId>10<version>3.2.1</version>11</dependency>⾸先准备导出Excel模板,然后打开-》另存为-》选择格式为XML,然后⽤⽂本打开XML,提取XML头模板(head.st可通⽤),数据体模板(boday.st):head.st可通⽤:1<?xml version="1.0"?>2<?mso-application progid="Excel.Sheet"?>3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"4 xmlns:o="urn:schemas-microsoft-com:office:office"5 xmlns:x="urn:schemas-microsoft-com:office:excel"6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"7 xmlns:html="/TR/REC-html40">8<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">9<Created>1996-12-17T01:32:42Z</Created>10<LastSaved>2013-08-02T09:21:24Z</LastSaved>11<Version>11.9999</Version>12</DocumentProperties>13<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">14<RemovePersonalInformation/>15</OfficeDocumentSettings>16<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">17<WindowHeight>4530</WindowHeight>18<WindowWidth>8505</WindowWidth>19<WindowTopX>480</WindowTopX>20<WindowTopY>120</WindowTopY>21<AcceptLabelsInFormulas/>22<ProtectStructure>False</ProtectStructure>23<ProtectWindows>False</ProtectWindows>24</ExcelWorkbook>25<Styles>26<Style ss:ID="Default" ss:Name="Normal">27<Alignment ss:Vertical="Bottom"/>28<Borders/>29<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>30<Interior/>31<NumberFormat/>32<Protection/>33</Style>34</Styles>boday.st:1 $worksheet:{2<Worksheet ss:Name="$it.sheet$">3<Table ss:ExpandedColumnCount="$it.columnNum$" ss:ExpandedRowCount="$it.rowNum$" x:FullColumns="1"4 x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">5 $it.rows:{6<Row>7<Cell><Data ss:Type="String">$1$</Data></Cell>8<Cell><Data ss:Type="String">$2$</Data></Cell>9<Cell><Data ss:Type="String">$3$</Data></Cell>10</Row>11 }$12</Table>13</Worksheet>14 }$⽣成⼤数据量Excel类:ExcelGenerator:1package test.exportexcel;23import org.antlr.stringtemplate.StringTemplate;4import org.antlr.stringtemplate.StringTemplateGroup;5import test.exportexcel.bean.Row;6import test.exportexcel.bean.Worksheet;78import java.io.*;9import java.util.ArrayList;10import java.util.List;11import java.util.Random;1213/**14 * 类功能描述:generator big data Excel15 *16 * @author WangXueXing create at 19-4-13 下午10:2317 * @version 1.0.018*/19public class ExcelGenerator {20public static void main(String[] args) throws FileNotFoundException{21 ExcelGenerator template = new ExcelGenerator();22 template.output2();23 }2425/**26 * ⽣成数据量⼤的时候,该⽅法会出现内存溢出27 * @throws FileNotFoundException28*/29public void output1() throws FileNotFoundException{30 StringTemplateGroup stGroup = new StringTemplateGroup("stringTemplate");31 StringTemplate st4 = stGroup.getInstanceOf("test/exportexcel/template/test");32 List<Worksheet> worksheets = new ArrayList<>();3334 File file = new File("/home/barry/data/output.xls");35 PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)));3637for(int i=0;i<30;i++){38 Worksheet worksheet = new Worksheet();39 worksheet.setSheet("第"+(i+1)+"页");40 List<Row> rows = new ArrayList<>();41for(int j=0;j<6000;j++){42 Row row = new Row();43 row.setName1("zhangzehao");44 row.setName2(""+j);45 row.setName3(i+" "+j);46 rows.add(row);47 }48 worksheet.setRows(rows);49 worksheets.add(worksheet);50 }5152 st4.setAttribute("worksheets", worksheets);53 writer.write(st4.toString());54 writer.flush();55 writer.close();56 System.out.println("⽣成excel完成");57 }5859/**60 * 该⽅法不管⽣成多⼤的数据量,都不会出现内存溢出,只是时间的长短61 * 经测试,⽣成2400万数据,2分钟内,4.5G⼤的⽂件,打开⼤⽂件就看内存是否⾜够⼤了62 * 数据量⼩的时候,推荐⽤JXLS的模板技术⽣成excel⽂件,谁⽤谁知道,⼤数据量可以结合该⽅法使⽤63 * @throws FileNotFoundException64*/65public void output2() throws FileNotFoundException{66long startTimne = System.currentTimeMillis();67 StringTemplateGroup stGroup = new StringTemplateGroup("stringTemplate");6869//写⼊excel⽂件头部信息70 StringTemplate head = stGroup.getInstanceOf("test/exportexcel/template/head");71 File file = new File("/home/barry/data/output.xls");72 PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)));73 writer.print(head.toString());74 writer.flush();7576int sheets = 400;77//excel单表最⼤⾏数是6553578int maxRowNum = 60000;7980//写⼊excel⽂件数据信息81for(int i=0;i<sheets;i++){82 StringTemplate body = stGroup.getInstanceOf("test/exportexcel/template/body");83 Worksheet worksheet = new Worksheet();84 worksheet.setSheet(" "+(i+1)+" ");85 worksheet.setColumnNum(3);86 worksheet.setRowNum(maxRowNum);87 List<Row> rows = new ArrayList<>();88for(int j=0;j<maxRowNum;j++){89 Row row = new Row();90 row.setName1(""+new Random().nextInt(100000));91 row.setName2(""+j);92 row.setName3(i+""+j);93 rows.add(row);94 }95 worksheet.setRows(rows);96 body.setAttribute("worksheet", worksheet);97 writer.print(body.toString());98 writer.flush();99 rows.clear();100 rows = null;101 worksheet = null;102 body = null;103 Runtime.getRuntime().gc();104 System.out.println("正在⽣成excel⽂件的 sheet"+(i+1));105 }106107//写⼊excel⽂件尾部108 writer.print("</Workbook>");109 writer.flush();110 writer.close();111 System.out.println("⽣成excel⽂件完成");112long endTime = System.currentTimeMillis();113 System.out.println("⽤时="+((endTime-startTimne)/1000)+"秒");114 }115 }定义JavaBean:WorkSheet.java:1package test.exportexcel.bean;23import java.util.List;45/**6 * 类功能描述:Excel sheet Bean7 *8 * @author WangXueXing create at 19-4-13 下午10:219 * @version 1.0.010*/11public class Worksheet {12private String sheet;13private int columnNum;14private int rowNum;15private List<Row> rows;1617public String getSheet() {18return sheet;19 }20public void setSheet(String sheet) {21this.sheet = sheet;22 }2324public List<Row> getRows() {25return rows;26 }27public void setRows(List<Row> rows) {28this.rows = rows;29 }3031public int getColumnNum() {32return columnNum;33 }34public void setColumnNum(int columnNum) {35this.columnNum = columnNum;36 }3738public int getRowNum() {39return rowNum;40 }41public void setRowNum(int rowNum) {42this.rowNum = rowNum;43 }44 }Row.java:1package test.exportexcel.bean;23/**4 * 类功能描述:Excel row bean5 *6 * @author WangXueXing create at 19-4-13 下午10:227 * @version 1.0.08*/9public class Row {10private String name1;11private String name2;12private String name3;1314public String getName1() {15return name1;16 }17public void setName1(String name1) {1 = name1;19 }2021public String getName2() {22return name2;23 }24public void setName2(String name2) {2 = name2;26 }2728public String getName3() {29return name3;30 }31public void setName3(String name3) {3 = name3;33 }34 }另附实现源码: 此外,⼤数据量并并且Excel列较多时,会出现内存溢出。
mysql jdbc preparedstatement封装的万能改查方法 -回复

mysql jdbc preparedstatement封装的万能改查方法-回复MySQL JDBC PreparedStatement封装的万能改查方法详解在进行数据库操作时,我们经常需要使用到PreparedStatement进行改查操作。
而为了提高代码的复用性和简洁度,我们可以封装一些万能的改查方法,使得代码更加灵活。
下面将一步一步回答你关于MySQL JDBC PreparedStatement封装的万能改查方法的问题。
1. 什么是PreparedStatement?PreparedStatement是Java中的一个接口,它是PreparedStatement 用于预编译SQL语句并可以用于多次执行。
相比于Statement,PreparedStatement具有更高的性能和安全性。
2. 为什么要封装PreparedStatement?封装PreparedStatement可以提高代码的复用性和简洁度。
通过封装,我们可以减少代码的重复编写,同时也能更好地处理和控制SQL语句和参数的传递。
3. 如何封装PreparedStatement的万能改查方法?(1) 创建一个BaseDao类作为公共的数据库操作类,里面封装各种万能改查方法。
(2) 在BaseDao类中,定义一个公共的getConnection方法,用于获取数据库连接。
(3) 在BaseDao类中,定义一个公共的executeUpdate方法,用于执行更新操作。
(4) 在BaseDao类中,定义一个公共的executeQuery方法,用于执行查询操作。
4. executeUpdate方法的封装过程?(1) 在executeUpdate方法中,传入SQL语句和参数。
(2) 获取数据库连接并创建PreparedStatement对象。
(3) 循环遍历参数列表,为SQL语句中的占位符赋值。
(4) 执行SQL语句并返回影响的行数。
(5) 关闭PreparedStatement和数据库连接。
Java线程池+生产者消费者+MySQL读取300万条数据

Java线程池+⽣产者消费者+MySQL读取300万条数据1.1需求数据库300 万条⽤户数据,遍历获取所有⽤户,各种组合关联,获取到⼀个新的json ,存到redis 上。
1.2 难点数据库⽐较多,不可能单线程查询所有的数据到内存。
1.3解决办法多线程读取,⽣产者每次获取200 条数据,消费者去消费。
(这⾥主要是根据MySQL分页去获取下⼀个200 条数据)1.4 代码1.4.1 调⽤⽅法/*** 线程启动*/public void update() {//redis操作类HashRedisUtil redisUtil= HashRedisUtil.getInstance();//⽣产者消费者ProducerConsumer pc = new ProducerConsumer();//数据仓库Storage s = pc.new Storage();ExecutorService service = Executors.newCachedThreadPool();//⼀个线程进⾏查询Producer p = pc.new Producer(s,userMapper);service.submit(p);System.err.println("⽣产线程正在⽣产中。
");//是个线程进⾏修改for(int i=0;i<10;i++){System.err.println("消费线程"+i+"正在消费中。
");service.submit(pc.new Consumer( redisUtil,userMapper,s));}}1.4.2 主要核⼼类package com.ypp.thread;import java.math.BigDecimal;import java.util.Calendar;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import ng.StringUtils;import org.apache.log4j.Logger;import org.joda.time.LocalDateTime;import com.alibaba.fastjson.JSONObject;import com.ypp.constants.Constants;import erMapper;import er;import erAlis;import erBaseModel;import erVip;import com.ypp.util.HashRedisUtil;import com.ypp.util.JsonUtils;import com.ypp.util.PHPSerializer;public class ProducerConsumer {private static Logger logger = Logger.getLogger(ProducerConsumer.class);//这个page 是核⼼,全局变量,当⽣产者⽣产⼀次,获取200 个⽤户,会把这个page++, 下次获取就是后⼀个200 条⽤户了private static Integer page = 0;//消费者public class Consumer implements Runnable {private HashRedisUtil redisUtil;private UserMapper userMapper;private Storage s = null;public Consumer(HashRedisUtil redisUtil, UserMapper userMapper, Storage s) {super();this.redisUtil = redisUtil;erMapper = userMapper;this.s = s;}public void run() {try {while (true) {User users = s.pop();long bbb = System.currentTimeMillis();// 获取⼀个⽤户的粉丝列表并存到redistry {fansUpdate(users.getToken(), users.getUserId(), redisUtil);} catch (Exception e1) {e1.printStackTrace();}// 获取⼀个⽤户的关注列表,并存到redistry {followUpdate(users.getToken(), users.getUserId(), redisUtil);} catch (Exception e) {e.printStackTrace();}// 获取⼀个⽤户的⿊名单,并存到redistry {blackUpdate(users.getToken(), users.getUserId(), redisUtil);} catch (Exception e) {e.printStackTrace();}// ⽤户基本信息try {userbaseUpdate(users.getToken(), users.getUserId(), redisUtil);} catch (Exception e) {e.printStackTrace();}long ccc = System.currentTimeMillis();System.out.println("⽤户:" + users.getToken() + " 全部总共耗时:" + (ccc - bbb) + "毫秒");Thread.sleep(500);}} catch (InterruptedException e) {e.printStackTrace();}}public List<User> getUserInfo(Integer iThread) {return userMapper.findUserInfo((iThread - 1) * 200 + 1);}/*** ⽤户基本信息修改** @param token* @param myuserId* @param redisUtil* @throws Exception*/private void userbaseUpdate(String token, String myUserId, HashRedisUtil redisUtil) throws Exception {}/*** 更新⼀个⽤户的⿊名单(原来的token改成userID)** @param token* @param string* @param redisUtil* @throws Exception*/private void blackUpdate(String token, String myUserId, HashRedisUtil redisUtil) throws Exception { }/*** 获取⼀个⽤户的关注** @param token* @param string* @param redisUtil* @throws Exception*/private void followUpdate(String token, String myUserId, HashRedisUtil redisUtil) throws Exception { }/*** 获取⼀个⽤户的粉丝列表** @param token* @param userId* @param redisUtil* @throws Exception*/private void fansUpdate(String token, String myUserId, HashRedisUtil redisUtil) throws Exception { }//⽣产者public class Producer implements Runnable {private Storage s = null;private UserMapper mapper ;public Producer( Storage s, UserMapper mapper) {this.s = s;this.mapper = mapper;}public void run() {try {while (true) {System.err.println("当前分页是:"+page+"****************************************");List<User> list= mapper.findUserInfo(page);s.push(list);page++;}} catch (InterruptedException e1) {e1.printStackTrace();}}}//数据仓库public class Storage {BlockingQueue<User> queues = new LinkedBlockingQueue<User>(200);/*** ⽣产** @param p* 产品* @throws InterruptedException*/public void push(List<User> p) throws InterruptedException {for(User user:p){queues.put(user);}}/*** 消费** @return产品* @throws InterruptedException*/public User pop() throws InterruptedException {return queues.take();}}}。
程序员鱼皮 java 后端万用项目模板

程序员鱼皮 java 后端万用项目模板程序员鱼皮 Java 后端万用项目模板概述在 Java 后端开发中,项目模板是一个非常重要的工具。
它可以帮助开发者快速地搭建项目框架、配置环境、引入依赖等,从而节省大量的时间和精力。
本文将介绍程序员鱼皮 Java 后端万用项目模板,包括其特点、使用方法以及常见问题解决方案等。
特点程序员鱼皮 Java 后端万用项目模板具有以下特点:1. 高度可定制化:该项目模板提供了丰富的配置选项,可以根据不同的需求进行定制化设置。
2. 全面覆盖:该项目模板涵盖了常见的后端开发场景,包括 Web 应用、RESTful API、消息队列等。
3. 统一标准:该项目模板遵循了一套统一的代码规范和工程结构标准,使得不同开发者之间可以更加协同地进行开发。
4. 持续更新:该项目模板会持续跟进最新的技术和框架,保证其始终处于最佳状态。
使用方法使用程序员鱼皮 Java 后端万用项目模板非常简单,只需要按照以下步骤进行操作即可:1. 下载项目模板:将程序员鱼皮 Java 后端万用项目模板从官网或者GitHub 上下载到本地。
2. 配置项目信息:根据实际需求修改项目信息,包括项目名称、包名、数据库配置等。
3. 选择开发场景:根据实际需求选择需要使用的开发场景,比如 Web 应用、RESTful API、消息队列等。
4. 运行项目:使用 IDE(比如 IntelliJ IDEA)打开项目,运行主类即可启动应用程序。
常见问题解决方案在使用程序员鱼皮 Java 后端万用项目模板的过程中,可能会遇到一些常见问题。
下面列举了一些常见问题及其解决方案:1. 如何添加新的依赖?答:在 pom.xml 文件中添加新的依赖即可。
具体方法是,在dependencies 标签内添加新的 dependency 标签,并指定 groupId、artifactId 和 version 等信息。
2. 如何修改数据库配置?答:在 application.yml 文件中修改数据库相关配置即可。
java excel导入20万条

java excel导入20万条
在Java中导入20万条Excel数据可以通过以下几种方式来实现:
1. 使用Apache POI库,Apache POI是一个用于读写Microsoft Office文件的开源Java库。
你可以使用Apache POI来读取Excel文件并将数据导入到Java中。
你需要使用XSSFWorkbook和XSSFSheet类来读取Excel文件中的数据。
然后,你可以将读取到的数据存储在Java对象中,或者直接将数据插入到数据库中。
2. 使用JDBC连接Excel文件,你可以使用JDBC(Java Database Connectivity)来连接Excel文件,并通过Java代码将数据导入到数据库中。
首先,你需要使用ODBC(Open Database Connectivity)驱动程序来连接Excel文件,然后使用JDBC来执行插入操作。
3. 使用第三方库,除了Apache POI之外,还有一些其他的第三方库可以用来处理Excel文件,比如JExcelApi、JExcel等。
你可以选择适合你需求的库来实现数据导入操作。
无论你选择哪种方式,都需要注意以下几点:
内存管理,在导入大量数据时,需要注意内存的使用,避免内存溢出的问题。
优化性能,对于大量数据的导入,需要考虑性能优化,比如批量插入、使用索引等方式来提高导入速度。
异常处理,需要处理可能出现的异常情况,比如文件不存在、格式错误等。
总之,导入20万条Excel数据是一个比较大的任务,需要仔细考虑数据量、性能和异常处理等方面的问题,选择合适的方式来实现数据导入操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA数据库取数据万用方法
2009-03-21 12:24
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Administrator
*/
public class DBAccess {
private static String Dr =
"com.microsoft.jdbc.sqlserver.SQLServerDriver";
private static String url =
"jdbc:microsoft:sqlserver://localhost:1433;databaseName=BookShop"; //创建Connection对象
public Connection getConnection() {
Connection conn = null;
try {
Class.forName(Dr);//创建驱动
conn = DriverManager.getConnection(url, "用户名", "密码");//创建数据库连接
} catch (ClassNotFoundException ex) {
Logger.getLogger(DBAccess.class.getName()).log (Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(DBAccess.class.getName()).log (Level.SEVERE, null, ex);
}
return conn;
}
//查询方法
//传入一个sql语句,返回一个Vector集合
public Vector inquiryFacility(String sql) {
Connection con;
Vector vc = new Vector();
ResultSet rs = null;
PreparedStatement st = null;
//得到数据库连接对象
con = this.getConnection();
//判断是否为空
if (con != null) {
try {
st = con.prepareCall(sql);
//执行sql语句
rs = st.executeQuery();
while (rs.next()) {
ResultSetMetaData rsmd =
rs.getMetaData();
//获得一行中有多少个字段
int numberOfColumns =
rsmd.getColumnCount();
Vector vt = new Vector();
//循环便利每一行的值
for (int i = 1; i <= numberOfColumns; i++) {
//将每一个字段的值加入vt集合中
vt.add(rs.getObject(i) );
}
//将获得的每一行的集合放到vc 集合中
vc.add(vt);
}
} catch (SQLException ex) {
Logger.getLogger(DBAccess.class.getNam e()).log(Level.SEVERE, null, ex);
} finally {
try {
//关闭连接
rs.close();
st.close();
con.close();
} catch (SQLException ex) {
Logger.getLogger(DBAccess.clas
s.getName()).log(Level.SEVERE, null, ex);
}
}
} else {
System.out.println("数据库连接错误");
}
//返回一个Vector对象
return vc;
}
public static void main(String[] args) {
//传入sql语句,获得查询结果
Vector vc = new DBAccess().inquiryFacility("sql语句");
//取出每一行数据
for(int i = 0;i < vc.size(); i++){
//取出每一列数据
for(int j = 0;j <
((Vector)vc.get(i)).size();j++){
System.out.print("\t"+((Vector)vc.get( i)).get(j));
}
System.out.println("");
}
}
}
运行的适合别忘了加载驱动包,上面的驱动是针对SQL server2005来用的,如果你用的是MySQL、oracle请把上面的驱动改掉,取出来的数据是Object类型的,别忘了转换类型!!!这个方法是我自己写的,有什么不足的地方,请把你宝贵的意见提出来!谢谢。