Java中如何实现与后台数据库的连接?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中如何实现与后台数据库的连接?相关的知识,希望对你有一定的参考价值。
参考技术A 用JAVA连接数据库主要有两种方式,一是用JDBC-ODBC桥来连接,二是用相关厂商提供的相应驱动程序来连接,首先谈谈第一种连接。 \\x0d\\x0a\\x0d\\x0aJDBC-ODBC桥接器是用JdbcOdbc.Class和一个用于访问ODBC驱动程序的本地库实现的。对于WINDOWS平台,该本地库是一个动态连接库DLL(JDBCODBC.DLL)。 \\x0d\\x0a\\x0d\\x0a由于JDBC在设计上与ODBC很接近。在内部,这个驱动程序把JDBC的方法映射到ODBC调用上,这样,JDBC就可以和任何可用的ODBC驱动程序进行交互了。这种桥接器的优点是,它使JDBC目前有能力访问几乎所有的数据库。通行方式如图所示: \\x0d\\x0a\\x0d\\x0a应用程序---JDBC API---JDBC-ODBC---ODBC API---ODBC层---数据源 \\x0d\\x0a\\x0d\\x0a具体操作方法为: \\x0d\\x0a\\x0d\\x0a首先打开控制面板的管理工具,打开数据源(ODBC),在用户DSN里面添加数据源(即你要连接的数据库的名字),在这里假定连接SQL SERVER 2000的GoodsSupply数据库。名称填写你要连接的数据库的名称(GoodsSupply),然后逐步设置,如果选用了使用SQL-SERVER密码认证的话,就要输入相应的用户名及密码连接到数据库。一路下一步设置完成。 \\x0d\\x0a\\x0d\\x0a在JAVA里面编写程序进行测试,在这里我的程序是让用户输入任意的表名与与列名,把该列的所有数据输出。源代码如下: \\x0d\\x0a\\x0d\\x0aimport java.io.BufferedReader; \\x0d\\x0aimport java.io.InputStreamReader; \\x0d\\x0aimport java.sql.*; \\x0d\\x0a\\x0d\\x0apublic class ODBCBridge \\x0d\\x0a\\x0d\\x0apublic static void main(String[] args) \\x0d\\x0aString url="jdbc:odbc:GoodsSupply"; \\x0d\\x0aStatement sm=null; \\x0d\\x0aString command=null; \\x0d\\x0aResultSet rs=null; \\x0d\\x0aString tableName=null; \\x0d\\x0aString cName=null; \\x0d\\x0aString result=null; \\x0d\\x0aBufferedReader input=new BufferedReader(new InputStreamReader(System.in)); \\x0d\\x0atry \\x0d\\x0atry \\x0d\\x0aClass.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动 \\x0d\\x0acatch(ClassNotFoundException e) \\x0d\\x0aSystem.out.println("Can not load Jdbc-Odbc Bridge Driver"); \\x0d\\x0aSystem.err.print("ClassNotFoundException:"); \\x0d\\x0aSystem.err.println(e.getMessage()); \\x0d\\x0a \\x0d\\x0aConnection con=DriverManager.getConnection(url,"USER","PASSWORD"); //使用SQL-SERVER2000认证 \\x0d\\x0aDatabaseMetaData dmd=con.getMetaData(); //DMD为连接的相应情况 \\x0d\\x0aSystem.out.println("连接的数据库:"+dmd.getURL()); \\x0d\\x0aSystem.out.println("驱动程序:"+dmd.getDriverName()); \\x0d\\x0asm=con.createStatement(); \\x0d\\x0aSystem.out.println("输入表名"); \\x0d\\x0atableName=input.readLine(); \\x0d\\x0awhile(true) \\x0d\\x0aSystem.out.println("输入列名(为空时程序结束):"); \\x0d\\x0acName=input.readLine(); \\x0d\\x0aif(cName.equalsIgnoreCase("")) \\x0d\\x0abreak; \\x0d\\x0acommand="select "+cName+" from "+tableName; \\x0d\\x0ars=sm.executeQuery(command); //执行查询 \\x0d\\x0aif(!rs.next()) \\x0d\\x0aSystem.out.println("表名或列名输入有误"); \\x0d\\x0aelse \\x0d\\x0aSystem.out.println("查询结果为:"); \\x0d\\x0ado \\x0d\\x0a \\x0d\\x0aresult=rs.getString(cName); \\x0d\\x0a//数据库语言设置为中文,不用转换编码 \\x0d\\x0a//result=new String(result.getBytes("ISO-8859-1"),"GB2312"); \\x0d\\x0aSystem.out.println(result); \\x0d\\x0awhile(rs.next()); \\x0d\\x0a \\x0d\\x0a \\x0d\\x0acatch(SQLException ex) \\x0d\\x0aSystem.out.println("SQLException:"); \\x0d\\x0awhile(ex!=null) \\x0d\\x0aSystem.out.println("Message:"+ex.getMessage()); \\x0d\\x0aex=ex.getNextException(); \\x0d\\x0a \\x0d\\x0acatch(Exception e) \\x0d\\x0aSystem.out.println("IOException"); \\x0d\\x0a \\x0d\\x0a \\x0d\\x0a如何使用 java.util.concurrent 包实现后台线程?
【中文标题】如何使用 java.util.concurrent 包实现后台线程?【英文标题】:How to implement a background thread using java.util.concurrent package? 【发布时间】:2021-02-19 18:56:50 【问题描述】:这是我首先使用的代码,但在最新的 Android 版本中,AsyncTask
类已被弃用,并且
因此它没有响应,然后我使用了Thread
类,但该类也无法正常工作。
我想要与AsyncTask
类相同的结果。
我知道我必须使用 java.util.concurrent 包的一些执行程序类,但不知道使用哪个以及如何使用它。
请帮我解决这个问题。
private static final String USGS_REQUEST_URL =
"https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2016-01-01&endtime=2016-05-02&minfelt=50&minmagnitude=5";
EarthquakeAsyncTask task = new EarthquakeAsyncTask();
task.execute(USGS_REQUEST_URL);
private class EarthquakeAsyncTask extends AsyncTask<String, Void, Event>
@Override
protected Event doInBackground(String... urls)
// Perform the HTTP request for earthquake data and process the response.
Event result = Utils.fetchEarthquakeData(urls[0]);
return result;
@Override
protected void onPostExecute(Event result)
// Update the information displayed to the user.
updateUi(result);
private static final String USGS_REQUEST_URL =
"https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2016-01-01&endtime=2016-05-02&minfelt=50&minmagnitude=5";
earthquakeRunnable runnable = new earthquakeRunnable(USGS_REQUEST_URL);
runnable.start();
private class earthquakeRunnable extends Thread
String urls;
earthquakeRunnable(String url)
this.urls = url;
@Override
public void run()
// Perform the HTTP request for earthquake data and process the response.
Event result = Utils.fetchEarthquakeData(urls);
// Update the information displayed to the user
updateUi(result);
【问题讨论】:
【参考方案1】:这是一个示例,说明如何在 Activity/Fragment 中使用 ExecutorService:
// Create some member variables for the ExecutorService
// and for the Handler that will update the UI from the main thread
ExecutorService mExecutor = Executors.newSingleThreadExecutor();
Handler mHandler = new Handler(Looper.getMainLooper());
// Create an interface to respond with the result after processing
public interface OnProcessedListener
public void onProcessed(Event result);
private void processInBg(final String url, final boolean finished)
final OnProcessedListener listener = new OnProcessedListener()
@Override
public void onProcessed(Event result)
// Use the handler so we're not trying to update the UI from the bg thread
mHandler.post(new Runnable()
@Override
public void run()
// Update the UI here
updateUi(result);
// ...
// If we're done with the ExecutorService, shut it down.
// (If you want to re-use the ExecutorService,
// make sure to shut it down whenever everything's completed
// and you don't need it any more.)
if(finished)
mExecutor.shutdown();
);
;
Runnable backgroundRunnable = new Runnable()
@Override
public void run()
// Perform your background operation(s) and set the result(s)
Event result = Utils.fetchEarthquakeData(url);
// ...
// Use the interface to pass along the result
listener.onProcessed(result);
;
mExecutor.execute(backgroundRunnable);
然后,无论您需要在哪里触发后台处理:
processInBg("some_url", true);
根据您的情况,您需要自定义 ExecutorService 的实现以更好地满足您的需求。
【讨论】:
Handler 类显示它已被弃用,并且您声明的所有变量都给出了一个错误,即向所有变量声明 final 并且如果它被分配给 final 那么它不能被分配一个新值. 感谢您的帮助,只是需要一些声明更改并且方法是正确的。谢谢! 我想问点别的,handler类和handler类对象有什么用???? 我很抱歉。我是即时写的,忽略了最终的变量声明。是的, Handler() 构造函数已被弃用。构造函数应该是 Handler(Looper.getMainLooper())。我已经更新了我的答案以包含这些内容并展示如何使用界面进行响应。 我包含 Handler 的原因是因为 UI 必须从主线程更新。这是在后台线程上运行后返回主线程的方法之一。以上是关于Java中如何实现与后台数据库的连接?的主要内容,如果未能解决你的问题,请参考以下文章
java后台程序方法执行数据库读写报错Connection is read-only。Queries leading to data modification