使用Hibernate向MySQL存储中文字符数据时出现了乱码,从MySQL取出数据时显示的是???,下面做下笔记说下解决方法:
1.打开MySQL安装目录下的my.ini文件,将字符集修改为gbk:
2.打开项目的hibernate.cfg.xml文件,在配置数据库url时加上编码参数:
<property name="connection.url">jdbc:mysql://localhost/hibernate?useUnicode=true&characterEncoding=gbk</property>
注意上面的"&"必不可少,在HTML中表示&的转义字符。
又例如,在HTML中空格转义字符是" "
3.删除MySQL中的数据库hibernate。因为之前修改mysql的字符集前可能已经新建该数据库,此时hibernate的字符集可能是utf-8或者latin1,与我们重设的gbk不一致,所以要删除该数据库。
方法:
drop database hibernate;
4.重启mysql,回到cmd路径,输入命令:
net stop mysql
net start mysql
5.在MySQL中创建hibernate数据库:
create database hibernate;
6.再在程序中向数据库写入中文数据,部分测试代码如下:
//打开线程安全的session对象
Session session = HibernateUtil.currentSession();
//打开事务
Transaction tx = session.beginTransaction();
//创建Person对象
Person xiaoming = new Person();
//为Person对象设置属性
xiaoming.setAge(19);
xiaoming.setName("小明");
//创建List集合
List<String> schools = new ArrayList<String>();
schools.add("小学");
schools.add("中学");
//设置List集合属性
xiaoming.setSchools(schools);
session.save(xiaoming);
tx.commit();
HibernateUtil.closeSession();
取出数据,在控制台打印查看结果:
Person p2 = (Person)session.get(Person.class, 1);
System.out.println(p2.getSchools().get(0));
运行结果:
1.数据库中存储内容如下:
2.控制台输出如下:
Hibernate:
select
person0_.person_id as person1_0_0_,
person0_.name as name0_0_,
person0_.age as age0_0_
from
person_inf person0_
where
person0_.person_id=?
Hibernate:
select
schools0_.person_id as person1_0_0_,
schools0_.school_name as school2_0_,
schools0_.list_order as list3_0_
from
school schools0_
where
schools0_.person_id=?
小学
最后说一下个人感想:使用mysql存储数据,像我们这些初学者必须花费一些时间(个人认为是无谓的)和字符集作斗争是一件让我无法容忍的事,开发者居然因此而不能更加专注于自己的程序部分,真的是太麻烦了。