java链接mysql数据库以及乱码(一)

2015-07-24 09:09:46 · 作者: · 浏览: 2
??

JDK:j2sdk1.5.0
MySQL:mysql-5.0.41-win32_178
JDBC驱动:mysql-connector-java-3.2.0-alpha-bin.jar

一、java与数据库的连接
java与数据库的连接书上写有四种方法,我的理解其实从其实质上说就两种,一种建立JDBC-ODBC桥,通过ODBC数据源与数据库相连。另一种是纯java式的连接,通过java类库API驱动连接。以MySQL为例,这两种方法分别需要MySQL-ODBC驱动和MySQL-JDBC-ODBC驱动。我用的是第二种方法,当然也建议使用纯java式的连接,需要MySQL-JDBC-ODBC驱动,可以从网上下载
首先需要把驱动放在jdk的安装目录的lib目录中,并在环境变量classpath中加上该jar包,其设置和jdk的classpath中dt.jar和tools.jar一样。
连接过程分三步:加载驱动程序;使用java.sql包中的Connection建立连接;由Connection对象产生Statement对象,然后Statement对象就可以调用其方法传递SQL语句了。
下面以一个具体的实例来测试我们的连接:

?

import java.sql.*;
public class ConnectToMySQLTest
{
public static void main(String[] args)
{
try
{
//加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建指定数据库的URL
String url="jdbc:mysql://localhost:3306/student"; //student是创建的数据库的名字
String userName="root"; //root是MySQL默认的用户名
String password="123"; //123是你设置的MySQL密码
//创建连接
Connection conn=DriverManager.getConnection(url,userName,password);
//创建Statement对象
Statement stmt=conn.createStatement();
//Statement对象向数据库提交SQL语句
stmt.execute("drop table if exists stu"); //若表stu存在则删除
stmt.execute("create table stu(id int not null primary key,name varchar(20) not null,sex varchar(4))"); //创建表stu
//插入记录
stmt.execute("insert into stu values(1,'aaa','boy')");
stmt.execute("insert into stu values(2,'bbb','girl')");
stmt.execute("insert into stu values(3,'ccc','girl')");
//执行查询数据库操作,并返回查询的结果集
ResultSet rs=stmt.executeQuery("select * from stu");
//将结果集表指针定位到第一条记录前
rs.beforeFirst();
//打印查询结果
System.out.println("stu表的数据如下:");
System.out.println("---------------------");
System.out.println("学号\t姓名\t性别");
System.out.println("---------------------");
int num;
String name;
String sex;
while (rs.next())
{
num=rs.getInt("id");
name=rs.getString("name");
sex=rs.getString("sex");
System.out.println(num+"\t"+name+"\t"+sex);
}
stmt.close();
conn.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

在测试之前,你需要启动MySQL,在mysql命令窗口中输入:create database student; 回车建立student数据库,然后在命令提示符中编译运行ConnectToMySQLTest,即可出现如下结果:



二、MySQL中文乱码问题
首先我们先来做个测试:
上面的代码运行成功后,打开mysql命令窗口,在其中输入:use student; (回车选择数据库)
select * from stu; (回车出现如下查询结果)


然后把上面代码stmt.execute("insert into stu values(1,'aaa','boy')");中的'aaa'改为'张三',然后保存重新编译运行,运行的结果为:

?

我们再打开mysql命令窗口,因为刚才我们已经选择了student数据库,我们可以直接输入:select * from stu; (回车查询) 结果如下:


可以发现改成张三以后,运行结果正常显示,但mysql中却显示的是两个问号。

MySQL默认的字符编码是latin1,与java对应的就是ISO-8859-1。所以要正确的显示我们的中文字符,只需要将MySQL的字符编码方式有latin1改成中文的就行了,改成“gbk”或"gb2312",修改的方法有两种:
一种是重新配置MySQL,在它的配置向导中有一项是让你选择字符的编码,你可以选择自定义选项,然后将其自定义为“gbk”或“gb2312”;
另一种是直接修改MySQL安装目录中的“my.ini”文件,在MySQL的安装目录下找到该文件,用记事本打开,在其中找到以下两句:
[my sql]
default-character-set=latin1

[my sqld]
……
……
default-character-set=latin1
分别将其中的latin1改成“gbk”即可,注意要用小写,听说大写不识别。

网上还有几种其他的方法,在这里也说一下,有一种是在连接数据的连接串中指定字符集和Unicode编码,他把数据库的URL写成:
String url="jdbc:mysql://localhost:3306/student?user=root&password=123&useUnicode=true&characterEncoding=gb2312";
这样写的目的是告诉驱动在与数据库进行转码的时候按照这种方式来转,从而避免乱码,这种方法只能解决从java从MySQL中取出数据输出时的乱码问题,但若从java中向MySQL中插入中文数据时,在MySQL中仍然显示的是乱码,因为你并没有修改MySQL的字符编码方式,它还是默认的latin1,所以中文仍然不能正常显示,换句话也就是说,若MySQL的编码方式是latin1,你ja