#include <QCoreApplication>
#include "threadh"
#include <QVector>
#include <QDebug>
int main(int argc, char argv[])
{
QCoreApplication a(argc, argv);
QVector<Thread> vector;
Thread thread;
//创建多个线程,并start
for(int i=0;i<10;i++){
thread=new Thread;
vectorappend(thread);
thread->set(i);
thread->start();
}
//等待所有线程执行完,然后删除线程
foreach(thread,vector){
thread->wait();
}
foreach(thread,vector){
delete thread;
}
return aexec();
}
excel是一个自由表,一个EXCEL的工作薄就是一个数据库,它里面的每一张表就是数据库的表,你可象 *** 作表一样对其进行查询等 *** 作,它里面的列就是数据库的字段,行就是记录,因此你可以按数据库的架构来组建数据,只是你如果你组建的数据不符合数据库的规则,在查询时不能得到时相应的结果。因此在EXCEL中不存在创建数据库。但对存在的数据可以引用。当满足条件A、B、C、D……时引用是可以的,但如果是在EXCEL中直接引用是不行的,一种是用VBA利用ADO访问EXCEL,在查询时把A、B、C、D几个条件按SQL语法写进查询语句中,引用返回的记录集,一种是利用函数把满足A、B、C、D的记录筛选出来,然后再引用。
最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文。因为我是修改403的Launcher,所以后面文章里面的Launcher都是基于Android403的Launcher2修改。Launcher源码比较多,而且里面应用了很多设计模式,要把它分析清楚要花不少精力,网上也有一些零碎的分析文章,不过关于修改的文章不多。所以打算写一些分析和修改Launcher结合的文章。
今天主要是分析修改Launcher的默认界面如何配置和修改。Launcher修改是最近才开始,下面两张是最近修改后的结果。因为程序是用于车载导航仪的,所以界面和一般的手机界面差别较大。改动也比较大,不过对于Launcher的分析修改都是通用的。
这是基于Android403修改后的Launcher界面,因为程序是用在汽车导航上,所以图标做了放大 *** 作。删除了一些不需要的东西。
下面针对界面修改的地方做分析。
1、界面默认配置文件
机器刚升级的时候,Launcher的界面是默认读取一个xml配置文件,完成配置工作。这个配置文件在Launcher目录下,
路径是:\Launcher\res\xml\default_workspacexml 。这个XML文件就是刚升级,Launcher第一次显示的时候,会读取的配置文件。
default_workspace。xml里面可以配置APP快捷方式、Widget、Search搜索栏等。下面就常用的这几个属性进行解析:
快捷方式说明
<favorite //程序快捷键属性标签
launcher:className="comapicalradioradioMainActivity"//该应用的类,点击图标时,需要启动的类
launcher:packageName="comapicalradio" //该应用的包名
launcher:screen="1" //第1屏,0-4屏共5屏
launcher:x="0" //图标X位置,左上角第一个为0,向左递增,0-4共5个
l0auncher:y="0" //图标Y位置,左上角第一个为0,向下递增,0-2共3个
/>
复制代码
Launcher默认是有5个分屏,不过这个可以配置。同样,每行每列有多少图标也是可以配置的,这个在后面会说在哪里可以修改。这里按我修改的是3行5列的界面排布(对应上面的效果图)。一般配置APP的快捷方式,使用上面的属性标签就可以。
//桌面Widget的标签
<appwidget //插件
launcher:className="dednsprojectclock_widget_mainClock1AppWidgetProvider" //该应用的类
launcher:packageName="dednsprojectclock_widget_main" //该应用的包名
launcher:screen="1" //第1屏,0-4屏共5屏
launcher:x="2" //图标X位置,左上角第一个为0,向左递增,0-4共5个
launcher:y="1" //图标Y位置,左上角第一个为0,向下递增,0-2共3个
launcher:spanX="3" //在x方向上所占格数
launcher:spanY="2" /> //在y方向上所占格数
复制代码
桌面Widget跟桌面快捷方式属性类型,不过这里需要注意launcher:spanX和launcher:spanY 这两个属性是说明Widget多大的,这个和Widget的最小宽高配置有关。我们在编写桌面Widget的时候,需要在XML配置文件里面指定Widget最小的宽和高,一般最小宽高计算公式是(minWidth = 72占用格数-2) 计算出来,最小高度也是一样。(上面那个模拟时钟是MIUI的时钟) minWidth = 72占用格数-2里面的占用格数就是上面launcher:spanX和launcher:spanY配置的数目。针对上面的效果图,就是占用了3个横向的格子,2个竖向的格子。minWidth应该等于214。
<search //搜索栏
launcher:screen="1" //第2屏
launcher:x="0" //图标X位置
launcher:y="1"/> //图标Y位置
复制代码
这个是搜索栏的配置,因为我这里不需要用到搜索栏,所以把它去掉了,如果需要配置可以使用上面的属性标签。 至于文件夹,在40的Launcher里面是支持的,分析加载函数里面,可以找到解析文件夹标签的方法。上面界面默认配置就是通过使用上面的标签修改default_workspacexml配置的。下面列出default_workspace支持的标签和属性:
//default_workspacexml中,支持的标签有:
favorite:应用程序快捷方式。
shortcut:链接,如网址,本地磁盘路径等。
search:搜索框。
clock:桌面上的钟表Widget
//支持的属性有:
launcher:title:图标下面的文字,目前只支持引用,不能直接书写字符串;
launcher:icon:图标引用;
launcher:uri:链接地址,链接网址用的,使用shortcut标签就可以定义一个超链接,打开某个网址。
launcher:packageName:应用程序的包名;
launcher:className:应用程序的启动类名;
launcher:screen:图标所在的屏幕编号;
launcher:x:图标在横向排列上的序号;
launcher:y:图标在纵向排列上的序号;
复制代码
Launcher里面负责解析default_workspacexml文件的方法是 LauncherProviderjava里面的loadFavorites方法。 2、LauncherProviderjava的loadFavorites分析:
//传入default_workspace文件的资源ID和数据库实力,把xml里面数据解析,保存到Launcher数据库。返回总共解析了多少个标签。
private int loadFavorites(SQLiteDatabase db, int workspaceResourceId) {
//
int type;
while (((type = parsernext()) != XmlPullParserEND_TAG ||
parsergetDepth() > depth) && type != XmlPullParserEND_DOCUMENT)
{
if (type != XmlPullParserSTART_TAG) {
continue;
}
boolean added = false;
final String name = parsergetName();
TypedArray a = mContextobtainStyledAttributes(attrs, RstyleableFavorite);
long container = LauncherSettingsFavoritesCONTAINER_DESKTOP;
if (ahasValue(RstyleableFavorite_container)) {
container = LongvalueOf(agetString(RstyleableFavorite_container));
}
String screen = agetString(RstyleableFavorite_screen);
String x = agetString(RstyleableFavorite_x);
String y = agetString(RstyleableFavorite_y);
// If we are adding to the hotseat, the screen is used as the position in the
// hotseat This screen can't be at position 0 because AllApps is in the
// zeroth position
if (container == LauncherSettingsFavoritesCONTAINER_HOTSEAT
&& IntegervalueOf(screen) == allAppsButtonRank) {
throw new RuntimeException("Invalid screen position for hotseat item");
}
valuesclear();
valuesput(LauncherSettingsFavoritesCONTAINER, container);
valuesput(LauncherSettingsFavoritesSCREEN, screen);
valuesput(LauncherSettingsFavoritesCELLX, x);
valuesput(LauncherSettingsFavoritesCELLY, y);
//解析xml里面的标签,从这里可以找到支持的标签类型和相关属性参数。
if (TAG_FAVORITEequals(name)) {
long id = addAppShortcut(db, values, a, packageManager, intent);
added = id >= 0;
} else if (TAG_SEARCHequals(name)) {
added = addSearchWidget(db, values);
} else if (TAG_CLOCKequals(name)) {
added = addClockWidget(db, values);
} else if (TAG_APPWIDGETequals(name)) {
added = addAppWidget(parser, attrs, type, db, values, a, packageManager);
} else if (TAG_SHORTCUTequals(name)) {
long id = addUriShortcut(db, values, a);
added = id >= 0;
} else if (TAG_FOLDERequals(name))
{
//
//folder属性里面的参数要多于2个,才能形成文件夹。
if (folderItemssize() < 2 && folderId >= 0) {
// We just delete the folder and any items that made it
deleteId(db, folderId);
if (folderItemssize() > 0) {
deleteId(db, folderItemsget(0));
}
added = false;
}
}
if (added) i++;
arecycle();
}
//
return i;
}
复制代码
其实就是一个分析XML和写入数据库的过程,LauncherProviderjava是整个Launcher的数据来源,十分重要,后面我再具体分析数据加载和适配显示方面的逻辑。
workspace就是存放你的java工程的根目录。
比如那么制定
workspace为
C:\
新建一个工程(project)A时,默认的存放路径是C:\A\
1 myeclipse导入项目后,如何把数据库也导入
MySQL数据库的导入,有两种方法:
1) 先导出数据库SQL脚本,再导入;
2) 直接拷贝数据库目录和文件。
在不同 *** 作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生。
所以一般推荐用SQL脚本形式导入。下面分别介绍两种方法。
2 方法一 SQL脚本形式
*** 作步骤如下:
21 导出SQL脚本
在原数据库服务器上,可以用MyAdmin工具,或者mysqldump命令行,导出SQL脚本。
211 用MyAdmin工具
导出选项中,选择导出“结构”和“数据”,不要添加“DROP DATABASE”和“DROP TABLE”选项。
选中“另存为文件”选项,如果数据比较多,可以选中“gzipped”选项。
将导出的SQL文件保存下来。
212 用mysqldump命令行
命令格式
mysqldump -u用户名 -p 数据库名 >; 数据库名sql
范例:
mysqldump -uroot -p abc > abcsql
(导出数据库abc到abcsql文件)
提示输入密码时,输入该数据库用户名的密码。
22 创建空的数据库
通过主控界面/控制面板,创建一个数据库。假设数据库名为abc,数据库全权用户为abc_f。
23 将SQL脚本导入执行
同样是两种方法,一种用MyAdmin(mysql数据库管理)工具,或者mysql命令行。
231 用MyAdmin工具
从控制面板,选择创建的空数据库,点“管理”,进入管理工具页面。
在"SQL"菜单中,浏览选择刚才导出的SQL文件,点击“执行”以上载并执行。
注意:MyAdmin对上载的文件大小有限制,本身对上载文件大小也有限制,如果原始sql文件
比较大,可以先用gzip对它进行压缩,对于sql文件这样的文本文件,可获得1:5或更高的压缩率。
gzip使用方法:
# gzip xxxxxsql
得到
xxxxxsqlgz文件。
提示输入密码时,输入该数据库用户名的密码。
3 直接拷贝
如果数据库比较大,可以考虑用直接拷贝的方法,但不同版本和 *** 作系统之间可能不兼容,要慎用。
31 准备原始文件
用tar打包为一个文件
32 创建空数据库
33 解压
在临时目录中解压,如:
cd /tmp
tar zxf mydbtargz
34 拷贝
将解压后的数据库文件拷贝到相关目录
cd mydb/
cp /var/lib/mysql/mydb/
对于FreeBSD:
cp /var/db/mysql/mydb/
35 权限设置
将拷贝过去的文件的属主改为mysql:mysql,权限改为660
chown mysql:mysql /var/lib/mysql/mydb/
chmod 660 /var/lib/mysql/mydb/
2 如何:添加对数据库项目的引用
可以添加对数据库项目的多种类型引用以应对不同的情况。
例如,可以引用同一解决方案中的其他项目,也可以引用其他解决方案的输出。按照略有不同的过程即可添加其他类型的引用。
例如,若要使用跨数据库引用,不仅必须添加该引用,还必须为数据库和/或服务器定义变量和相关的值。有关引用的类型以及可能使用每种类型的时间的更多信息,请参见在数据库项目中使用引用。
引用在同一解决方案中数据库项目中定义的对象打开一个解决方案,该解决方案包含要向其中添加引用的数据库项目。在“项目”菜单上,单击“添加数据库引用”。
将出现“添加数据库引用”对话框。若要添加对数据库项目的引用,请执行以下步骤:单击“当前解决方案中的数据库项目”。
在列表中,单击要添加对其引用的数据库项目。若要为服务器定义 SETVAR 变量,请执行以下步骤:单击“定义服务器变量”。
在“名称”中,键入表示该服务器的变量名称。在“值”中,键入该变量所表示的服务器名称。
注意如果所引用对象所属的数据库位于要添加对其引用的数据库所在的相同服务器上,则不需要定义服务器变量。若要为要引用的数据库指定 SETVAR 变量,请按下列步骤 *** 作:选中“定义数据库变量”复选框。
如果选中“文本”复选框,则将其清除。在“名称”中,键入表示该数据库的变量的名称。
在“值”中,键入该变量所表示的数据库名称。重要事项如果数据库项目包含显式引用另一个数据库中对象的对象,则应更新这些引用以使用刚刚定义的变量。
如果从包含跨数据库引用的数据库导入了对象,则必须更新这些引用以解决这些显式跨数据库引用导致的警告。若要为要引用的数据库指定文本值,请按下列步骤 *** 作:选中“定义数据库变量”复选框。
选中“文本”复选框。在“值”中,键入要引用的数据库的名称。
注意如果数据库名称始终与目标开发环境中的名称相同,则可能要指定文本而非变量和值对。例如,可以对“master”数据库中定义的对象使用值为“master”的文本。
如果所引用的项目可能引用另一个项目,则可以选中“禁止显示所引用项目中未解析引用导致的错误”复选框。所引用项目中的错误不大可能导致当前项目中的错误。
因此,可能要决定忽略这些错误。如果不想更新对象和脚本,则清除“更新现有架构对象定义和脚本以使用数据库引用变量”复选框,然后单击“确定”。
此时引用即添加到数据库项目,而您不需要在此过程中执行任何其他步骤。如果要更新对象和脚本,则选中“更新现有架构对象定义和脚本以使用数据库引用变量”复选框,然后单击“确定”。
此时将出现“预览更改 - 重命名服务器或数据库”对话框。(可选)如果不想应用一个或多个更改,则清除这些更改旁的复选框。
(可选)单击任意更改,在“预览更改”窗格中显示其详细信息。单击“应用”,更新所指定的对象和脚本。
此时引用即添加到数据库项目,并修改您指定的这些对象和脚本以使用 SETVAR 变量(而非服务器和数据库的名称)。引用另一个数据库项目的编译输出(dbschema 文件)中定义的对象打开一个解决方案,该解决方案包含要向其中添加引用的数据库项目。
在“项目”菜单上,单击“添加数据库引用”。将出现“添加数据库引用”对话框。
若要添加元文件的引用,请执行以下步骤:单击“数据库项目元文件(dbmeta)或架构(dbschema)”。在该框中,键入架构文件的路径和文件名,或者单击“浏览”指定要添加其引用的架构文件。
若要为服务器定义 SETVAR 变量,请执行以下步骤:单击“定义服务器变量”。在“名称”中,键入表示该服务器的变量名称。
在“值”中,键入该变量所表示的服务器名称。注意如果所引用对象所属的数据库位于要添加对其引用的数据库所在的相同服务器上,则不需要定义服务器变量。
若要为要引用的数据库指定 SETVAR 变量,请按下列步骤 *** 作:选中“定义数据库变量”复选框。如果选中“文本”复选框,则将其清除。
在“名称”中,键入表示该数据库的变量的名称。在“值”中,键入该变量所表示的数据库名称。
重要事项如果数据库项目包含显式引用另一个数据库中对象的对象,则应更新这些引用以使用刚刚定义的变量。如果从包含跨数据库引用的数据库导入了对象,则必须更新这些引用以解决这些显式跨数据库引用导致的警告。
若要为要引用的数据库指定文本值,请按下列步骤 *** 作:选中“定义数据库变量”复选框。选中“文本”复选框。
在“值”中,键入要引用的数据库的名称。注意如果数据库名称始终与目标开发环境中的名称相同,则可能要指定文本而非变量和值对。
例如,可以对“master”数据库中定义的对象使用值为“master”的文本。如果所引用的项目可能引用另一个项目,则可以选中“禁止显示所引用项目中未解析引用导致的错误”复选框。
所引用项目中的错误不大可能导致当前项目中的错误。因此,可能要决定忽略这些错误。
如果不想更新对象和脚本,则清除“更新现有架构对象定义和脚本以使用数据库引用变量”复选框,然后单击“确定”。此时引用即添加到数据库项目,而您不需要在此过程。
3 如何把原来做过的JAVA项目导入到另一台电脑里
当下载了包含Eclipse 项目的源代码文件后,我们可以把它导入到当前的Eclipse 工作区然后编辑和查看。点击菜单File > Import,然后在d出的Import 对话框中展开General目录,选择Existing Projects into Workspace,接着点击Next 按钮。当选中单选钮Select root directory:时可以点击Browse…按钮选中包含项目的文件夹,如果包含项目的话就可以在中间的Projects 列表框中显示;而当选中单选钮Select archive file:时可以点击Browse…按钮选中包含项目的ZIP 压缩包,如果包含项目的话就可以在中间的Projects列表框中显示。最后点击Finish 按钮就可以导入项目并打开了。
点击菜单File > Export,然后在d出的Export 对话框中展开General 目录,选择Archive File,接着点击Next 按钮。然后在To archive file:输出框中选中要保存的文件名,一般写成项目名zip,然后点击Finish 按钮即可导出当前项目。还有一种方式是手工打包,用WinRAR 或者WinZIP 等工具都可以
4 自己做的项目涉及到数据库,怎么样把这个项目上传到服务器上
MSSQL数据库:
直接给它提供dmf文件,他给你附加
现在的web空间服务商,他们都有数据库与web 容器在他们的服务器上的。你的项目挂在那,连的数据就相当于连的本地的,只是他在Tomcat的serverxml里面配置了(你可以去找 web项目部署服务器 相关资料)
总之,你给钱 这些东西不需要你去管 人家帮你搞定 。部署发布这块,感兴趣自己可以去学(部署这块也有研究的,比如:WEB程序自动安装--Tomcat+web项目+MySQL+jre 一起打包 exe发布,这样没有JDK环境的机器也照样运行你的项目 、还有你现在问的部署外网服务器等 )说了一大堆 分该给我了吧
5 如何将excel中的数据导入数据库
首先打开SQL SERVER 的企业管理器,到你要导入数据的数据库的表上右键,选择所有任务,导入数据。在d出的对话框上点击下一步。
选择数据源为EXCEL如图所示。
选择要导入的EXCEL文件
输入你的数据库的登入信息
选择第一个项目(从源数据库复制表和视图),然后点下一步
选择你要导入的表的第几页,其中目的表是可以修改的,如果要转换其中的数据,点后面的小方块,上面有三个小点的小方块。
点击下一步,完成,即可
数据导入很快的,导入的结果会反馈给你。点击完成。
刷新你的数据库,这个时候你可以发现你导入的数据表已经存在并可以使用了。
6 如何导入已有的外部数据库
导入已有的外部数据库的方法:
第一种是右击数据库,然后点击附加。出现下面的界面。然后选择添加,添加上你要添加的mdf文件即可。
第二种方法是:新建查询,然后输入下列语句,
EXEC sp_attach_db @dbname = 'yourdatabasename',
@filename1 = 'x:\路径\MSSQL\Data\pubsmdf',
@filename2 = 'x:\路径\MSSQL\DataLdf
如何向数据库快速的写入百万条数据
现在我的处理方式是读取原数据库表的所有数据,大概有一百万条吧,然后放到一个数组里面,循环向目标数据库写数据(两个数据库之间的数据迁移,表结构不同,我是写的php脚本来查询导入的),一开始速度还可以,但是现在几乎一秒钟一条了
String sql ="insert into userinfo(name,pwd) values(,)";
PreparedStatement pst=getConnection()prepareStatement(sql);
pstsetString(1,"小明");
pstsetString(2,"123");
pstexecuteUpdate();
小伙子给你写了一个通用的增删改查的工具类,你那样写太麻烦
资源文件jdbcproperties
jdbcDriver=commysqljdbcDriver
jdbcurl=jdbc:mysql://localhost:3306/xxx
jdbcusername=root
jdbcpassword=root
package comdao;import javasqlConnection;
import javasqlDriverManager;
import javasqlPreparedStatement;
import javasqlResultSet;
import javasqlResultSetMetaData;
import javasqlSQLException;
import javautilArrayList;
import javautilList;
import javautilProperties;
import orgapachecommonsbeanutilsBeanUtils;
import orgapachelog4jLogger;
public class BaseDao {
private static String DRIVDR;
private static String URL;
private static String USER;
private static String PWD;
private static Connection connection;
private static Properties properties = new Properties();
private static Logger logger = LoggergetLogger(BaseDaoclass);
private static PreparedStatement pst;
private static ResultSet rs;
private static final String CLASS_NOT_EXCEPTION = "驱动加载失败";
static {
try {
propertiesload(BaseDaoclassgetResourceAsStream("/jdbcproperties"));
DRIVDR = propertiesgetProperty("jdbcDriver");
URL = propertiesgetProperty("jdbcurl");
USER = propertiesgetProperty("jdbcusername");
PWD = propertiesgetProperty("jdbcpassword");
ClassforName(DRIVDR);
} catch (Exception e) {
loggerdebug(CLASS_NOT_EXCEPTION + egetMessage());
}
}
/
通用的增删改
@param sql
@param args
@return
/
public static int executeCommand(String sql, Object args) {
int m = 0;
try {
initPreparedStatement(sql, args);
m = pstexecuteUpdate();
} catch (Exception e) {
loggerdebug("执行增、删、该。错误。。请检查preparedStatement参数。。。"+egetMessage());
} finally {
closeAll(null, pst, connection);
}
return m;
}
private static PreparedStatement initPreparedStatement(String sql,Objectargs){
try {
pst=getConnection()prepareStatement(sql);
if(args!=null){
for(int i=0;i<argslength;i++){
pstsetObject(i+1, args[i]);
}
}
} catch (Exception e) {
loggerdebug("为pst对象赋值错误。。请检查preparedStatement参数。。。"+egetMessage());
}
return pst;
}
/
通用的执行聚合函数
@param sql
@param args
@return
/
public static int executeScalare(String sql,Objectargs){
int count=0;
initPreparedStatement(sql, args);
try {
rs=pstexecuteQuery();
if(rsnext()){
count=rsgetInt(1);
}
} catch (SQLException e) {
loggerdebug("执行聚合函数出错。。。请检查preparedStatement参数。。。"+egetMessage());
}finally{
closeAll(rs, pst, connection);
}
return count;
}
/
根据id查询单个对象
@param sql
@param clazz
@param args
@return
/
public static <T> T findById(String sql,Class<T> clazz,Objectargs){
T t = null;
try {
initPreparedStatement(sql, args);
rs = pstexecuteQuery();
ResultSetMetaData metaData = rsgetMetaData();
// 以上的代码:获取元数据(各个字段的数据类型)
int count = metaDatagetColumnCount();
// 获取字段的数量
if(rsnext()) {
try {
t = clazznewInstance();// 利用反射自动创建对象的类型的对象 Userclass User
// u=new User();
for (int i = 1; i <= count; i++) {
BeanUtilscopyProperty(t, metaDatagetColumnName(i), rsgetObject(i));
// 自动获取各个字段的名称并获取该字段的值
}
} catch (Exception e) {
loggerdebug("查询单个对象,错误。。请检查preparedStatement参数。。。。"+egetMessage());
}
}
} catch (SQLException e) {
loggerdebug("查询失败。。。。。" + egetMessage());
}
return t;
}
/
通用的查询
@param sql
@param clazz
@param args
@return
/
public static <T> List<T> findAll(String sql, Class<T> clazz, Object args) {
List<T> list = new ArrayList<T>(100);
T t = null;
try {
initPreparedStatement(sql, args);
rs = pstexecuteQuery();
ResultSetMetaData metaData = rsgetMetaData();
// 以上的代码:获取元数据(各个字段的数据类型)
int count = metaDatagetColumnCount();
// 获取字段的数量
while (rsnext()) {
try {
t = clazznewInstance();// 利用反射自动创建对象的类型的对象 Userclass User
// u=new User();
for (int i = 1; i <= count; i++) {
BeanUtilscopyProperty(t, metaDatagetColumnName(i), rsgetObject(i));
// 自动获取各个字段的名称并获取该字段的值
}
} catch (Exception e) {
loggerdebug("查询集合,错误。。。。。"+egetMessage());
}
listadd(t);// 将对象添加到集合中
}
} catch (SQLException e) {
loggerdebug("查询失败。。。。。" + egetMessage());
}
return list;
}
public static Connection getConnection() {
try {
if (connection == null || connectionisClosed()) {
connection = DriverManagergetConnection(URL, USER, PWD);
}
} catch (SQLException e) {
loggerdebug("获取connection失败,请检查配置文件!" + egetMessage());
}
return connection;
}
public static void closeAll(ResultSet rs, PreparedStatement pst, Connection conn) {
if (rs != null)
try {
rsclose();
} catch (SQLException e) {
loggerdebug("关闭ResultSet错误。。。。。" + egetMessage());
}
if (pst != null)
try {
pstclose();
} catch (SQLException e) {
loggerdebug("关闭PreparedStatement错误。。。。。" + egetMessage());
}
if (conn != null)
closeConnection(conn);
}
private static void closeConnection(Connection conn) {
try {
if (!connisClosed()) {
connclose();
}
} catch (SQLException e) {
loggerdebug("关闭Connection错误。。。。。" + egetMessage());
} finally {
conn = null;
}
}
public static void main(String[] args) {
Systemoutprintln(BaseDaogetConnection());
}
}
以上就是关于要疯了,怎样用多线程向MYSQL数据库中写入数据全部的内容,包括:要疯了,怎样用多线程向MYSQL数据库中写入数据、怎么在VBA中把excel中的数据 写入数据库、如何实现workspace加载所有应用 android等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)