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都找不到解决方法,也不知道为啥,还好对着教程一行行对比找出来问题所在了,不然就卡死在这了= =