hibernate初体验,配置和测试
因为公司的持久层使用的是 hibernate ,而我会的持久层框架只会 mybatis 。故自学一波
什么是 hibernate 框架
1、hibernate 一般使用在 javaee 三层架构中的 dao 层(持久化层)。
2、在 dao 层里面做对数据库的 crud 操作,使用 hibernate 实现 crud 操作,它的底层代码就是 JDBC 。hibernate 对 JDBC 进行封装,好处是不需要写复杂 JDBC 代码、不需要写 sql 语句实现。
3、开源、轻量级
正式使用
首先创建个项目,然后导入一堆 jar 包。话说我用惯了 IDEA ,还用 springboot 一键配置完了,突然切回 eclipse 用传统方式还真有些别扭。
然后创建一个实体类,用于映射表一条数据。
在 hibernate 中,你甚至可以没有表。。。它自动给你创建,只需要在配置文件写好就OK了。
我写了个 User 类:
package top.yibobo.entity;
import java.io.Serializable;
public class User implements Serializable{
private int uid;
private String username;
private String password;
private String address;
public User(int uid, String username, String password, String address) {
super();
this.uid = uid;
this.username = username;
this.password = password;
this.address = address;
}
public User() {
super();
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", address=" + address + "]";
}
}
在这之后,自然是需要配置 XML 了,用于映射实体类和表的关系, eclipse 配置 XML 是有点恶心哈。
一般都有默认的规范: 类名.hbm.xml,所以我的映射文件叫 User.hbm.xml
这个映射文件放哪都行,反正要在 hibernate 的核心配置文件指定位置的。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 配置类和表的映射
class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="top.yibobo.entity.User" table="user_">
<!-- 配置实体类id和表id对应 -->
<id name="uid" column="uid">
<!-- 设置数据表id增长策略
native:生成表id值就是主键自动增长 -->
<generator class="native">
</generator>
</id>
<!-- 配置其他属性和表字段的映射 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
然后需要在 src 目录下创建 hibernate.cfg.xml ,必须在 src 目录下!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置数据库信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mybase?characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">614</property>
<!-- 下面是配置hibernate信息 -->
<!-- 这表示使用MySQL方言。 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 这是Hibernate事务管理方式,即每个线程一个事务 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- 这表示是否会自动更新数据库的表结构,有这句话,其实是不需要创建表的,因为Hibernate会自动去创建表结构 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 把映射文件放到核心配置文件中 -->
<mapping resource="top/yibobo/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
万事具备,测试,经过测试证明他确实给我创建了个表,还往里加了一条字段。所以是没有问题的。
使用hibernate操作的基本步骤是:
1. 获取SessionFactory
2. 通过SessionFactory 获取一个Session
3. 在Session基础上开启一个事务
4. 写具体逻辑crud操作
5. 提交事务
6. 关闭Session
7. 关闭SessionFactory
package top.yibobo.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import top.yibobo.entity.User;
public class TestHibernate {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
//事务
s.beginTransaction();
User user = new User();
user.setAddress("长沙");
user.setUsername("张三三");
user.setPassword("666666");
s.save(user);
//提交
s.getTransaction().commit();
s.close();
sf.close();
}
}
期间遇到了一个问题。报错:Message: cvc-complex-type.3.2.2,元素 ‘property’ 中不允许出现属性 ‘generated’
百度都百度不到。。搞了半天找到原因了,原来是XML文件的约束写错了,这个映射xml和核心配置xml用的不是一个约束,那个指向的链接不同。我是直接复制过来的。所以爆了错。
话说这个错误百度google都找不到解决方法,也不知道为啥,还好对着教程一行行对比找出来问题所在了,不然就卡死在这了= =
