解决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

解决Java操作MySQL数据库时的数据处理乱码问题

相关推荐