使用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存储数据,像我们这些初学者必须花费一些时间(个人认为是无谓的)和字符集作斗争是一件让我无法容忍的事,开发者居然因此而不能更加专注于自己的程序部分,真的是太麻烦了。