针对解决hibernate+mysql写入数据库乱码的问题,我们可以分为以下几步进行解决。
1. 确认数据库编码格式
首先我们需要确认数据库表的编码格式。假设我们的数据库表为student,我们可以使用以下SQL语句来查看该表的编码格式:
SHOW CREATE TABLE student;
我们可以从查询结果中获取到该表的编码格式,例如utf8mb4。
2. Hibernate配置
接下来需要在Hibernate配置文件中正确设置数据库连接配置,包括:
- 数据库连接URL中的编码格式设置
- Hibernate的编码格式设置
下面是一个示例配置:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8mb4</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.connection.charSet">utf8mb4</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
其中 hibernate.connection.url
的参数 useUnicode=true&characterEncoding=utf8mb4
表示使用Unicode编码及指定的编码格式来连接数据库。
3. Java代码中处理编码
如果还是遇到了乱码问题,我们可以从Java代码层面入手,对于写入数据库的内容,可以使用以下方式进行编码处理:
String str = "要入库的字符串";
byte[] bytes = str.getBytes("UTF-8");
String encodedStr = new String(bytes, "UTF-8");
其中 getBytes(
) 用于将字符串转换成字节数组,String
构造函数则将字节数组转换为字符串,最后输入到数据库中。
4. 示例
这里我们提供两个示例,用于更直观地了解解决方案的实现过程。
示例一:使用注解方式实现
Step 1:创建实体类及数据库表
@Entity
@Table(name = "student")
public class Student implements Serializable {
private static final long serialVersionUID = 2652327633296064143L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name", nullable = false, length = 100)
private String name;
// 省略其他属性及get/set方法
}
CREATE TABLE `student` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Step 2:写入数据
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Student student = new Student();
student.setName("张三");
session.persist(student);
tx.commit();
session.close();
这里 session.persist(student)
会调用实体类的 toString()
方法,而默认情况下的编码为 ISO-8859-1
,因此需要在实体类中重写该方法,并手动进行编码转换,如下所示:
@Override
public String toString() {
String str = String.format("{\"id\":%d,\"name\":\"%s\"}", id, name);
try {
byte[] bytes = str.getBytes("ISO-8859-1");
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return super.toString();
}
示例二:使用HQL语句
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String sql = "INSERT INTO `student`(`id`, `name`) VALUES (:id, :name)";
Query query = session.createSQLQuery(sql);
query.setParameter("id", 1L);
query.setParameter("name", "李四");
query.executeUpdate();
tx.commit();
session.close();
在这里使用了 createSQLQuery()
方法来创建HQL语句,并在其中手动绑定参数,从而避免了实体类的 toString()
方法默认编码的错误。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决hibernate+mysql写入数据库乱码 - Python技术站