解决Java操作MySQL数据库时的数据处理乱码问题
0x01 引言
最近在学习Java的Struts2的框架,就用JSP + Struts2 + MySQL写了一个Struts2的小Demo,因为在用JDBC操作MySQL做数据处理的时候,因为数据包含中文字符,出现了往数据库中写入和读取的时候,发生了中文乱码问题,个人感觉有必要把这次问题的解决方案整理出来,以提醒自己避免在今后再次踩坑(因为只有自己走过的路,才是印象深刻的)。本人码字水平有限(一直在努力往更好的水平迈进),所以如果文章有语义问题,请多包涵,当然您发现问题也欢迎指正,可以在博客留言,或者加我微信(yz2638385556)一起交流学习。
0x02 错误的错误操作
先看一下连接数据库的类
public class DBConnection {
private static Connection CONN = null;
private final static String URL = "jdbc:mysql://localhost:3306/move";
private final static String USER = "root";
private final static String PASSWORD = "root";
/**
* 获取数据库连接方法
* @return连接对象Connection
*/
public static Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
CONN = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return CONN;
}
/**
* 关闭数据库连接方法
* @param connConnection
* @param pstmPreparedStatement
* @param rsResultSet
*/
public static void closeConnection(Connection conn,PreparedStatement pstm,ResultSet rs) {
try {
if(rs!=null) {
rs.close();
}
if(pstm!=null) {
pstm.close();
}
if(conn!=null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试数据库连接方法
* @param args
*/
public static void main(String args[]) {
Connection conn = getConnection();
if(conn!=null) {
System.out.println("Connection Success");
}else {
System.out.println("Connection Failure");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
DAO层数据操作类
/**
* 新增预约登记信息
* <li>1.定义新增SQL语句,使用PreparedStatement对SQL进行预处理</li>
* <li>2.为SQL语句进行设值</li>
* <li>3.执行新增操作,获取executeUpdate的返回值</li>
* <li>4.判断如果返回值大于0,则返回true,则为新增成功;如果小于0则返回false,则表示新增失败</li>
*/
@Override
public boolean doInsertBookingInfo(Move_bookingEntity bookingInformation) {
// 定义标记
Boolean flag = false;
try {
// 获取连接对象
conn = DBConnection.getConnection();
// 定义新增SQL语句
String insertSQL = "INSERT INTO move_booking(area,cartype,movedate,contact,phone,status) VALUES(?,?,DEFAULT,?,?,?)";
pstm = conn.prepareStatement(insertSQL);
pstm.setString(1, bookingInformation.getArea());
pstm.setString(2, bookingInformation.getCartype());
pstm.setString(3, bookingInformation.getContact());
pstm.setString(4, bookingInformation.getPhone());
pstm.setInt(5, bookingInformation.getStatus());
int x = pstm.executeUpdate();
if(x>0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
断点调试的参数传递截图
发现Action中数据格式的传递是正常的,然后我们再看下DAO层的对象中的数据。
这里可以证明,两次的数据传递都是正常的,那我们看下数据库中的数据写入情况。
发现此时,数据库中存放的数据是乱码的,为了解决数据库写入时的乱码问题,需要在数据库连接池(DBConnection)中,修改URL的连接驱动,修改如下:
private static Connection CONN = null;
private final static String URL = "jdbc:mysql://localhost:3306/move?useUnicode=true&characterEncoding=utf-8";
private final static String USER = "root";
private final static String PASSWORD = "root";
1
2
3
4
发现此时,中文乱码问题已得到解决。
本例子Git地址:https://github.com/CharlesYeoung/Demo