2023年3月

eclipse使用异常An error has occurred.see error log for more details eclipse

解决Eclipse,MyEclipse出现An error has occurred,See error log for&_雨儿_新浪博客
http://blog.sina.com.cn/s/blog_4ba5b45e0102eam8.html

=======

解决Eclipse,MyEclipse出现An error has occurred,See error log for more details的错误

现把找到的解决方法整理提供给大家,如下:
方法1. 在"开始"-->"运行"---->打入"cmd"进入命令提示行后,再进入eclipse的安装目录,
然后输入eclipse -clean即可(我用的这个方法 成功了)
方法2. 删除configuration文件夹里除config.ini以外的所有文件,重启Eclipse

解决myeclipse则变为:
执行以后,问题依然没有得到解决。

后在进行破解时,发现只要是输入了中文名字,执行破解程序就失败,但如果是输入的是英文名字,则能正确返回
License No,仔细回忆,在系统安装时,由于我的用户名是中文的,且不是系统管理员用户组的用户,是否会是这个问题呢?

再次删除,在 User
目录下建立一个英文的目录,并将该目录赋予当前使用用户的完整读写权限,然后再次安装系统,在安装时选择将 MyEclipse 8.5
安装在这个新建立的目录之下。

在系统启动时,默认有一个 WorkSpaces
目录,将该目录也指向一个不含中文字的目录下,这次启动以后,再也没有报出

 An error has occurred. See error log for more details.107

错误提示,问题得以解决。

附:MyEclipse 8.5 启动过程优化

前言:MyEclipse5.5 大小 139M;MyEclipse6.5 大小 451M;MyEclipse7.0 大小 649M;MyEclipse8.0 大小 772.3MB(速度方面比7.1和7.5都快了许多但还是很费内存)
下 载服务器又是国外的,下载速度累人也就罢了,只要你工作性能一流。不幸的是,MyEclipse 属于狂吃内存的主,特别是 MyEclipse7.0 运行起来,基本上不用干其他工作了,它是一会Quick update,一会 updating indexes ,你耐着性子等它 update 完,它老人家又开始自动 validation 了!

实在忍无可忍,收集了一些关于解决 MyEclipse 的耗内存的办法,经测试非常有效,整理出来,希望可以方便更多的朋友。

1、老是弹出Quick update error 、关闭myeclipse的Quick Update自动更新功能
这个问题的解决办法是关闭自动更新
Windows > Preferences > MyEclipse Enterprise Workbench > Community Essentials,
把选项 ”Search for new features on startup”的前勾去掉即可。

2 、关闭updating indexes
Window > Preferences > Myeclipse Enterprise Workbench > Maven4Myeclipse > Maven>
禁用Download repository index updates on startup 。

3 、关闭MyEclipse的自动validation
validation有一堆,什么xml、jsp、jsf、js等等,我们没有必要全部都去自动校验一下,
只是需要的时候才会手工校验一 下,速度立马提升好几个档次
windows > perferences > myeclipse > validation
将Build下全部勾取消
如果你需要验证某个文件的时候,我们可以单独去验证它。方法是:
在需要验证的文件上( 右键 -> MyEclipse -> Run Validation 。

4、 启动优化,关闭不需要使用的模块
一个系统20%的功能往往能够满足80%的需求,MyEclipse也不例外,我们在大多数时候只需要20%的系统功能,
所以可以将一些不使用的模块禁止 加载启动。
Window > Preferences > General > Startup andy Shutdown 在这里列出的是MyEclipse启动时加载的模块
我这里只让它加载tomcat5 勾选 MyEclipse EASIE Tomcat 5 。
怎样才能知道哪些启动项有用呢?我现在把我知道的启动项用处说一下,还有很多不懂的,
希望大家懂的回复在下面 啊:
WTP :一个跟myeclipse差不多的东西,主要差别是 WTP 是免费的,如果使用myeclipse,这个可以取消
Mylyn:组队任务管理工具,类似于 CVS ,以任务为单位管理项目进度,没用到的可以取消
Derby:一种保存成 jar 形式的数据库,我没用到,取消
一大排以 MyEclipse EASIE 打头的启动项:myeclipse 支持的服务器,只选自己用的,其他取消,
比如我只选了 tomcat 。

5 、去掉MyEclipse的拼写检查(如果你觉的有用可以不去)
拼写检查会给我们带来不少的麻烦,我们的方法命名都会是单词的缩写,他也会提示有错,
所以最好去掉,没有多大的用处
Window > perferences > General > Editors > Text Editors > Spelling > 将Enable spell checking复选框的勾选去掉。

6 、去掉MyEclipse繁杂的自带插件自动加载项
Window > perferences > General > Startup and Shutdown > 将Plug-ins activated on startup
中的复选框有选择性的勾 选去掉。

7 、修改MyEclipse编辑JSP页面时的编辑工具
Window > perferences > General > Editors > File Associations >
在File types 中选择 *.jsp > 在Associated editors 中将”MyEclipse JSP Editor”设置为默认。

8 、修改MyEclipse安装目录的eclipse.ini文件,加大JVM的非堆内存
具体内容如下:
-clean
-showsplash
com.genuitec.myeclipse.product.ide
--launcher.XXMaxPermSize
256m
-vmargs
-Xms128m
-Xmx512m
-Duser.language=en
-XX:PermSize=128M
-XX:MaxPermSize=256M
把下面的那个 -XX:MaxPermSize 调大,比如 -XX:MaxPermSize=512M,再把 -XX:PermSize 调成跟
-XX:MaxPermSize一样大

知识点一、

Class.forName(driverName); 加载一个类,默认会先加载静态方法(可以做“见不得人”的事情),这个静态方法就是把自己注册到 DriverManager中。

Connection dbConn=DriverManager.getConnection(dbURL,userName,userPwd);

public class Driver extends NonRegisteringDriver implementsjava.sql.Driver {//类名和接口名相同,但不是同一个东西static{try{
java.sql.DriverManager.registerDriver(
newDriver());//这里注册
}
catch(SQLException E) {throw new RuntimeException("Can't register driver!");
}
}
……
}

知识点二、 jdbc4.0之后,每个驱动jar包中,在META-INF目录下提供了一个名为java.sql.Driver的文件。文件的内容就是该接口的实现类名称!

所以不用写这句Class.forName(driverName);

知识点三、 各大驱动写法

#mysql
#url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=50&prepStmtCacheSqlLimit=300
#driverClassName=com.mysql.jdbc.Driver

#mssql
#driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
#url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=mydb

#mssql jtds
#driverClassName=net.sourceforge.jtds.jdbc.Driver
#url=jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=mydb

#orcale
#driverClassName=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:mydb

#access
#driverClassName=sun.jdbc.odbc.JdbcOdbcDriver  微软的桌面数据库
#url=jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=mdb\\mydb.mdb

PreparedStatement

l
它是
Statement
接口的子接口;

l 强大之处:


  • SQL
    攻击;
  • 提高代码的可读性、可维护性;
  • 提高效率!

l
学习
PreparedStatement
的用法:

  • 如何得到
    PreparedStatement
    对象:

¨
给出
SQL
模板!

¨
调用
Connection

PreparedStatement prepareStatement(String sql
模板
)

¨
调用
pstmt

setXxx()
系列方法
sql
模板中的
?
赋值!

¨
调用
pstmt

executeUpdate()

executeQuery()
,但它的方法都没有参数。

l 预处理的原理

  • 服务器的工作:

¨
校验
sql
语句的语法!

¨ 编译:一个与函数相似的东西!

¨ 执行:调用函数

  • PreparedStatement

¨ 前提:连接的数据库必须支持预处理!几乎没有不支持的!

¨
每个
pstmt
都与一个
sql
模板绑定在一起,先把
sql
模板给数据库,数据库先进行校验,再进行编译。执行时只是把参数传递过去而已!

¨ 若二次执行时,就不用再次校验语法,也不用再次编译!直接执行!

1
什么是
SQL
攻击

在需要用户输入的地方,用户输入的是
SQL
语句的片段
,最终用户输入的

SQL
片段与我们
DAO
中写的
SQL
语句合成一个完整的
SQL
语句!例如用户在登录时输入的用户名和密码都是为
SQL
语句的片段!

2
演示
SQL
攻击

首先我们需要创建一张用户表,用来存储用户的信息。

CREATE TABLE user(

uid
CHAR(32) PRIMARY KEY,

username
VARCHAR(30) UNIQUE KEY NOT NULL,

PASSWORD
VARCHAR(30)

);

INSERT INTO user VALUES('U_1001', 'zs', 'zs');

SELECT * FROM user;

现在用户表中只有一行记录,就是
zs

下面我们写一个
login()
方法!

public
void
login(String username, String password) {

Connection con =
null
;

Statement stmt =
null
;

ResultSet rs =
null
;

try
{

con = JdbcUtils.
getConnection
();

stmt = con.createStatement();

String sql = "SELECT * FROM user WHERE " +

"username='" + username +

"' and password='" + password + "'";

rs = stmt.executeQuery(sql);

if
(rs.next()) {

System.
out
.println("
欢迎
"
+ rs.getString("username"));

}
else
{

System.
out
.println("
用户名或密码错误!
"
);

}

}
catch
(Exception e) {

throw
new
RuntimeException(e);

}
finally
{

JdbcUtils.
close
(con, stmt, rs);

}

}

下面是调用这个方法的代码:

login("a' or 'a'='a", "a' or 'a'='a");

这行当前会使我们登录成功!因为是输入的用户名和密码是
SQL
语句片段,最终与我们的
login()
方法中的
SQL
语句组合在一起!我们来看看组合在一起的
SQL
语句:

SELECT * FROM tab_user WHERE username='
a' or 'a'='a
' and password='
a' or 'a'='a
'

3
防止
SQL
攻击

l 过滤用户输入的数据中是否包含非法字符;

l 分步交验!先使用用户名来查询用户,如果查找到了,再比较密码;

l
使用
PreparedStatement

4

PreparedStatement
是什么?

PreparedStatement
叫预编译声明!

PreparedStatement

Statement
的子接口,你可以使用
PreparedStatement
来替换
Statement

PreparedStatement
的好处:

l
防止
SQL
攻击;

l 提高代码的可读性,以可维护性;

l 提高效率。

5

PreparedStatement
的使用

l
使用
Connection

prepareStatement(String sql)
:即创建它时就让它与一条
SQL
模板绑定;

l
调用
PreparedStatement

setXXX()
系列方法为问号设置值

l
调用
executeUpdate()

executeQuery()
方法,但要注意,调用没有参数的方法;

String sql = “select * from tab_student where s_number=?”;

PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, “S_1001”);

ResultSet rs = pstmt.executeQuery();

rs.close();

pstmt.clearParameters();

pstmt.setString(1, “S_1002”);

rs = pstmt.executeQuery();

在使用
Connection
创建
PreparedStatement
对象时需要给出一个
SQL
模板,所谓
SQL
模板就是有“
?
”的
SQL
语句,其中“
?
”就是参数。

在得到
PreparedStatement
对象后,调用它的
setXXX()
方法为“
?
”赋值,这样就可以得到把模板变成一条完整的
SQL
语句,然后再调用
PreparedStatement
对象的
executeQuery()
方法获取
ResultSet
对象。

注意
PreparedStatement
对象独有的
executeQuery()
方法是没有参数的,而
Statement

executeQuery()
是需要参数(
SQL
语句)的。因为在创建
PreparedStatement
对象时已经让它与一条
SQL
模板绑定在一起了,所以在调用它的
executeQuery()

executeUpdate()
方法时就不再需要参数了。

PreparedStatement
最大的好处就是在于重复使用同一模板,给予其不同的参数来重复的使用它。这才是真正提高效率的原因。

所以,建议大家在今后的开发中,无论什么情况,都去需要
PreparedStatement
,而不是使用
Statement

useServerPrepStmts
参数

默认使用
PreparedStatement
是不能执行预编译的,这需要在
url
中给出
useServerPrepStmts=true参数(MySQL Server 4.1之前的版本是不支持预编译的,而Connector/J在5.0.5以后的版本,默认是没有开启预编译功能的)。

例如:jdbc:mysql://localhost:3306/test?
useServerPrepStmts=true

这样才能保证
mysql
驱动会先把
SQL
语句发送给服务器进行预编译,然后在执行
executeQuery()
时只是把参数发送给服务器。

cachePrepStmts
参数

当使用不同的
PreparedStatement
对象来执行相同的
SQL
语句时,还是会出现编译两次的现象,这是因为驱动没有缓存编译后的函数
key
,导致二次编译。如果希望缓存编译后函数的
key
,那么就要设置
cachePrepStmts
参数为
true
。例如:

jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&cachePrepStmts=true

黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\

大数据

目标:把
mp3
保存到数据库中!


my.ini
中添加如下配置!

max_allowed_packet=10485760

1
什么是大数据

所谓大数据,就是大的字节数据,或大的字符数据。标准
SQL
中提供了如下类型来保存大数据类型:

类型

长度

tinyblob

2
8-
-1B

256B

blob

2
16
-1B

64K

mediumblob

2
24
-1B

16M

longblob

2
32
-1B

4G

tinyclob

2
8-
-1B

256B

clob

2
16
-1B

64K

mediumclob

2
24
-1B

16M

longclob

2
32
-1B

4G

但是,在
mysql
中没有提供
tinyclob

clob

mediumclob

longclob
四种类型,而是使用如下四种类型来处理文本大数据:

类型

长度

tinytext

2
8-
-1B

256B

text

2
16
-1B

64K

mediumtext

2
24
-1B

16M

longtext

2
32
-1B

4G

首先我们需要创建一张表,表中要有一个
mediumblob

16M
)类型的字段。

CREATE TABLE tab_bin(

id INT PRIMARY KEY AUTO_INCREMENT,

filenameVARCHAR(
100),

data MEDIUMBLOB

);

向数据库插入二进制数据需要使用
PreparedStatement
为原
setBinaryStream(int, InputSteam)
方法来完成。

con = JdbcUtils.
getConnection
();

String sql = "insert into tab_bin(filename,data) values(?, ?)";

pstmt = con.prepareStatement(sql);

pstmt.setString(1, "a.jpg");

InputStream in =
new
FileInputStream("f:\\a.jpg");

pstmt.setBinaryStream(2, in);

pstmt.executeUpdate();

读取二进制数据,需要在查询后使用
ResultSet
类的
getBinaryStream()
方法来获取输入流对象。也就是说,
PreparedStatement

setXXX()
,那么
ResultSet
就有
getXXX()

con = JdbcUtils.
getConnection
();

String sql = "select filename,data from tab_bin where id=?";

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 1);

rs = pstmt.executeQuery();

rs.next();

String filename = rs.getString("filename");

OutputStream out =
new
FileOutputStream("F:\\" + filename);

InputStream in = rs.getBinaryStream("data");

IOUtils.
copy
(in, out);

out.close();

还有一种方法,就是把要存储的数据包装成
Blob
类型,然后调用
PreparedStatement

setBlob()
方法来设置数据

con = JdbcUtils.
getConnection
();

String sql = "insert into tab_bin(filename,data) values(?, ?)";

pstmt = con.prepareStatement(sql);

pstmt.setString(1, "a.jpg");

File file =
new
File("f:\\a.jpg");

byte
[] datas = FileUtils.
getBytes
(file);//
获取文件中的数据

Blob blob =
new
SerialBlob(datas);//
创建
Blob
对象

pstmt.setBlob(2, blob);//
设置
Blob
类型的参数

pstmt.executeUpdate();

con = JdbcUtils.
getConnection
();

String sql = "select filename,data from tab_bin where id=?";

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 1);

rs = pstmt.executeQuery();

rs.next();

String filename = rs.getString("filename");

File file =
new
File("F:\\" + filename) ;

Blob blob = rs.getBlob("data");

byte
[] datas = blob.getBytes(0, (
int
)file.length());

FileUtils.
writeByteArrayToFile
(file, datas);

上课老师敲的代码:

packagecn.itcast.demo4;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.sql.Blob;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjavax.sql.rowset.serial.SerialBlob;importorg.apache.commons.io.IOUtils;importorg.junit.Test;importcn.itcast.demo3.JdbcUtils;/*** 大数据
*
@authorcxf
*
*/ public classDemo4 {/*** 把mp3保存到数据库中。
*
@throwsSQLException
*
@throwsIOException
*
@throwsFileNotFoundException*/@Testpublic void fun1() throwsException {/** 1. 得到Connection
* 2. 给出sql模板,创建pstmt
* 3. 设置sql模板中的参数
* 4. 调用pstmt的executeUpdate()执行
*/Connection con=JdbcUtils.getConnection();
String sql
= "insert into tab_bin values(?,?,?)";
PreparedStatement pstmt
=con.prepareStatement(sql);

pstmt.setInt(
1, 1);
pstmt.setString(
2, "流光飞舞.mp3");/*** 需要得到Blob
* 1. 我们有的是文件,目标是Blob
* 2. 先把文件变成byte[]
* 3. 再使用byte[]创建Blob
*/ //把文件转换成byte[] byte[] bytes = IOUtils.toByteArray(new FileInputStream("F:/流光飞舞.mp3"));//使用byte[]创建Blob Blob blob = newSerialBlob(bytes);//设置参数 pstmt.setBlob(3, blob);

pstmt.executeUpdate();
}
/*** 从数据库读取mp3
*
@throwsSQLException*/@Testpublic void fun2() throwsException {/** 1. 创建Connection*/Connection con=JdbcUtils.getConnection();/** 2. 给出select语句模板,创建pstmt*/String sql= "select * from tab_bin";
PreparedStatement pstmt
=con.prepareStatement(sql);/** 3. pstmt执行查询,得到ResultSet*/ResultSet rs=pstmt.executeQuery();/** 4. 获取rs中名为data的列数据*/ if(rs.next()) {
Blob blob
= rs.getBlob("data");/** 把Blob变成硬盘上的文件!*/ /** 1. 通过Blob得到输入流对象
* 2. 自己创建输出流对象
* 3. 把输入流的数据写入到输出流中
*/InputStream in=blob.getBinaryStream();
OutputStream out
= new FileOutputStream("c:/lgfw.mp3");
IOUtils.copy(in, out);
}
}
}

总结:sql中的时间转 util的时间直接赋值即可;反过来,必须先吧util下的时间转换成毫秒,再通过sql的构造器生成sql的时间格式。

1

Java
中的时间类型

java.sql
包下给出三个与数据库相关的日期时间类型,分别是:

l Date
:表示日期,只有年月日,没有时分秒。会丢失时间;

l Time
:表示时间,只有时分秒,没有年月日。会丢失日期;

l Timestamp
:表示时间戳,有年月日时分秒,以及毫秒。

这三个类都是
java.util.Date
的子类。

2
时间类型相互转换

把数据库的三种时间类型赋给
java.util.Date
,基本不用转换,因为这是把子类对象给父类的引用,不需要转换。

java.sql.Date date = …

java.util.Date d = date;

java.sql.Time time = …

java.util.Date d = time;

java.sql.Timestamp timestamp = …

java.util.Date d = timestamp;

当需要把
java.util.Date
转换成数据库的三种时间类型时,这就不能直接赋值了,这需要使用数据库三种时间类型的构造器。
java.sql
包下的
Date

Time

TimeStamp
三个类的构造器都需要一个
long
类型的参数,表示毫秒值。创建这三个类型的对象,只需要有毫秒值即可。我们知道
java.util.Date

getTime()
方法可以获取毫秒值,那么这个转换也就不是什么问题了。

java.utl.Date d = new java.util.Date();

java.sql.Date date = new java.sql.Date(d.getTime());//
会丢失时分秒

Time time = new Time(d.getTime());//
会丢失年月日

Timestamp timestamp = new Timestamp(d.getTime());

3
代码

我们来创建一个
dt
表:

CREATE TABLE dt(

d DATE,

t TIME,

ts TIMESTAMP

)

下面是向
dt
表中插入数据的代码:

@Test

public
void
fun1()
throws
SQLException {

Connection con = JdbcUtils.
getConnection
();

String sql = "insert into dt value(?,?,?)";

PreparedStatement pstmt = con.prepareStatement(sql);

java.util.Date d =
new
java.util.Date();

pstmt.setDate(1,
new
java.sql.Date(d.getTime()));

pstmt.setTime(2,
new
Time(d.getTime()));

pstmt.setTimestamp(3,
new
Timestamp(d.getTime()));

pstmt.executeUpdate();

}

下面是从
dt
表中查询数据的代码:

@Test

public
void
fun2()
throws
SQLException {

Connection con = JdbcUtils.
getConnection
();

String sql = "select * from dt";

PreparedStatement pstmt = con.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

rs.next();

java.util.Date d1 = rs.getDate(1);

java.util.Date d2 = rs.getTime(2);

java.util.Date d3 = rs.getTimestamp(3);

System.
out
.println(d1);

System.
out
.println(d2);

System.
out
.println(d3);

}

时间类型

数据库类型与
java
中类型的对应关系:

DATE -> java.sql.
Date

TIME -> java.sql.
Time

TIMESTAMP -> java.sql.
Timestamp

l
领域对象(
domain
)中的所有属性不能出现
java.sql
包下的东西!即不能使用
java.sql.Date

l ResultSet#getDate()
返回的是
java.sql.Date()

l PreparedStatement#setDate(int, Date)
,其中第二个参数也是
java.sql.Date

时间类型的转换:

l java.util.Date
->
java.sql.Date

Time

Timestamp


  • util

    Date
    转换成毫秒值
  • 使用毫秒值创建
    sql

    Date

    Time

    Timestamp

java.util.Date date = new java.util.Date();

long l = date.getTime();//util的时间获取毫秒值

java.sql.Date sqlDate = new java.sql.Date(l);

l java.sql.Date

Time

Timestamp
->

java.util.Date

  • 这一步不需要处理了:因为
    java.sql.Date

    java.util.Date