小弟写了个带数据库的图书馆系统,但是在书籍查询这个模块上出现了点问题,代码如下:package library;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;public class BookQuery extends JFrame implements ActionListener {
private JFrame frame;
private JTextField jtfd1;
private JRadioButton rbt1, rbt2;
private JTable tb;
private Object[][] row = new Object[20][6];
private String[] columns = {"书名","ISBN号","作者",
"出版社","在架情况","书架号"};
private JButton bt1;
private Connection conn;
private Statement stmt;
public BookQuery() {
JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame("书籍查询");
// frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
Container content = frame.getContentPane();
JPanel
jp1 = new JPanel(),
jp2 = new JPanel();
jtfd1 = new JTextField("请输入查询内容");
rbt1 = new JRadioButton("书名");
rbt1.setSelected(true);
rbt2 = new JRadioButton("ISBN号");
ButtonGroup bg = new ButtonGroup();
bg.add(rbt1);
bg.add(rbt2);
// String[] searchKind = {"书名","ISBN号"};
// cmbx = new JComboBox(searchKind);
bt1 = new JButton("搜索");
bt1.addActionListener(this);
jp1.setLayout(new GridLayout());
jp1.add(rbt1);
jp1.add(rbt2);
jp1.add(jtfd1);
jp1.add(bt1);
tb = new JTable(row, columns);
tb.setRowHeight(25);
JScrollPane sp = new JScrollPane(tb); content.add(jp1, BorderLayout.NORTH);
content.add(sp, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setSize(600, 200);
frame.setVisible(true);
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/library","jmwu","12345");
stmt = conn.createStatement();
// System.out.println("s");
}catch(ClassNotFoundException e) { }catch(SQLException e) { }
}
public void actionPerformed(ActionEvent e) {
String str = jtfd1.getText().trim();
String sqlStr;
ResultSet rs;
int i = 0;
Object obj = e.getSource();
if(rbt1.isSelected()) {
sqlStr = "select name,ISBN,author,press,ava,loc from book " +
"where name ="+"'"+str+"'"; //问题所在
}
else {
sqlStr = "select name,ISBN,author,press,ava,loc from book " +
"where ISBN ="+"'"+str+"'"; //问题所在
}
try {
if(obj == bt1) {
if(str.equals("") ||str.equals("请输入查询内容")) {
JOptionPane.showMessageDialog(frame, "请输入查询内容");
return;
}
rs = stmt.executeQuery(sqlStr);
for(int j = 0; j < row.length; j++) {
for(int k = 0; k < 6; k++) {
row[j][k] = null;
}
tb.repaint();
if(rs.next()) {
if(i < row.length) {
row[i][0] = rs.getString("name");
row[i][1] = rs.getString("ISBN");
row[i][2] = rs.getString("author");
row[i][3] = rs.getString("press");
row[i][4] = rs.getString("ava");
row[i][5] = rs.getString("loc");
i++;
}
}
jtfd1.setText("");
}
}
}catch(SQLException se) {
}
}
public static void main(String[] args) {
new BookQuery();
}
}问题是,在执行数据查询时,如果选择 查询“ISBN” table中就能显示查询结果,而如果选择“书名”,无查询结果,确定数据库建表正确,输入正确,我很疑惑,望赐教另:我用的是eclipse 在eclipse中输入的汉字,在数据库中显示是乱码,同样在数据库中插入汉字,用eclipse查询出来也是乱码,求解决办法 谢谢大家!
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;public class BookQuery extends JFrame implements ActionListener {
private JFrame frame;
private JTextField jtfd1;
private JRadioButton rbt1, rbt2;
private JTable tb;
private Object[][] row = new Object[20][6];
private String[] columns = {"书名","ISBN号","作者",
"出版社","在架情况","书架号"};
private JButton bt1;
private Connection conn;
private Statement stmt;
public BookQuery() {
JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame("书籍查询");
// frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
Container content = frame.getContentPane();
JPanel
jp1 = new JPanel(),
jp2 = new JPanel();
jtfd1 = new JTextField("请输入查询内容");
rbt1 = new JRadioButton("书名");
rbt1.setSelected(true);
rbt2 = new JRadioButton("ISBN号");
ButtonGroup bg = new ButtonGroup();
bg.add(rbt1);
bg.add(rbt2);
// String[] searchKind = {"书名","ISBN号"};
// cmbx = new JComboBox(searchKind);
bt1 = new JButton("搜索");
bt1.addActionListener(this);
jp1.setLayout(new GridLayout());
jp1.add(rbt1);
jp1.add(rbt2);
jp1.add(jtfd1);
jp1.add(bt1);
tb = new JTable(row, columns);
tb.setRowHeight(25);
JScrollPane sp = new JScrollPane(tb); content.add(jp1, BorderLayout.NORTH);
content.add(sp, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setSize(600, 200);
frame.setVisible(true);
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/library","jmwu","12345");
stmt = conn.createStatement();
// System.out.println("s");
}catch(ClassNotFoundException e) { }catch(SQLException e) { }
}
public void actionPerformed(ActionEvent e) {
String str = jtfd1.getText().trim();
String sqlStr;
ResultSet rs;
int i = 0;
Object obj = e.getSource();
if(rbt1.isSelected()) {
sqlStr = "select name,ISBN,author,press,ava,loc from book " +
"where name ="+"'"+str+"'"; //问题所在
}
else {
sqlStr = "select name,ISBN,author,press,ava,loc from book " +
"where ISBN ="+"'"+str+"'"; //问题所在
}
try {
if(obj == bt1) {
if(str.equals("") ||str.equals("请输入查询内容")) {
JOptionPane.showMessageDialog(frame, "请输入查询内容");
return;
}
rs = stmt.executeQuery(sqlStr);
for(int j = 0; j < row.length; j++) {
for(int k = 0; k < 6; k++) {
row[j][k] = null;
}
tb.repaint();
if(rs.next()) {
if(i < row.length) {
row[i][0] = rs.getString("name");
row[i][1] = rs.getString("ISBN");
row[i][2] = rs.getString("author");
row[i][3] = rs.getString("press");
row[i][4] = rs.getString("ava");
row[i][5] = rs.getString("loc");
i++;
}
}
jtfd1.setText("");
}
}
}catch(SQLException se) {
}
}
public static void main(String[] args) {
new BookQuery();
}
}问题是,在执行数据查询时,如果选择 查询“ISBN” table中就能显示查询结果,而如果选择“书名”,无查询结果,确定数据库建表正确,输入正确,我很疑惑,望赐教另:我用的是eclipse 在eclipse中输入的汉字,在数据库中显示是乱码,同样在数据库中插入汉字,用eclipse查询出来也是乱码,求解决办法 谢谢大家!
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
这样的 具体我不会看
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/library","jmwu","12345");
连接字符串中指定一下编码,要与数据库中的编码一至。
例如jdbc:mysql://localhost:3306/mlm?useUnicode=true&characterEncoding=UTF-8
但是我用的系统是ubuntu10.04,无法用网上的方法在mysql的my.cnf中修改,因为my.cnf只有root用户才能修改,而我试过了网上的很多方法,都不行,比较棘手,弄了一晚上了 ,打算明天再试。:)
-> ;
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
我在my.cnf中改完以后是这样的,然后eclipse的默认编码也是utf8,但是现在的情况是我在终端中向表中插入中文也显示乱码了,而且从程序代码向表插入数据也是乱码
原因在于:mysql默认字符集是latin,而eclipse默认是utf8,字符集不一致造成两边输入输出乱码;
在my.cnf修改mysql默认字符集为utf8后,乱码仍旧存在,于是将Mysql中原先存在的旧database删除,新建一个,使用新建的database以后就不再有乱码问题了,希望大家能引以为鉴,从我的错误中吸取教训