Hibernate框架应用在dao层对数据库进行crud操作,其实hibernate底层代码就是jdbc,它只不过时jdbc进行了封装,使用hibernate框架之后不需要再写jdbc的代码了,也不需要再去写sql语句实现。
那么现在假如说我们想创建一个user表,按照我们以前的惯例,我们需要create table然后等等之后的操作,但是我们现在可以不用,我们先创建一个实体类,就叫user,然后配置实体类和数据库表一一对应关系(映射),这里我们使用配置文件来实现映射关系。创建xml格式的配置文件。
再配置文件里面主要要做这些事情,(1)引入约束 (2)配置映射关系
下列是具体实现:
Uesr表
public class User {
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password=" + password + "]";
}
private int id;
private String userName;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
配置映射关系(xml文件):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 1 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="cn.itcast.entity.User" table="t_user">
<!-- 2 配置实体类id和表id对应
hibernate要求实体类有一个属性唯一值
hibernate要求表有字段作为唯一值
-->
<!-- id标签
name属性:实体类里面id属性名称
column属性:生成的表字段名称
-->
<id name="uid" column="uid">
<!-- 设置数据库表id增长策略
native:生成表id值就是主键自动增长
-->
<generator class="native"></generator>
</id>
<!-- 配置其他属性和表字段对应
name属性:实体类属性名称
column属性:生成表字段名称
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
</class>
</hibernate-mapping>
下一步是创建hibernate的核心配置文件:
(1)核心配置文件格式xml,但是核心配置文件名称和位置固定的
- 位置:必须src下面
- 名称:必须hibernate.cfg.xml
<?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</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!-- 第二部 配置hibernate信息 (可选)-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 配置session绑定本地线程 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 第三步 把映射文件放到核心配置文件中(必须) -->
<mapping resource="xhl/day01/userhbm.xml"/>
</session-factory>
</hibernate-configuration>
这是在表里面填充数据,执行这段代码之后,你会发现,你并没有写insert这样的语句,就会发现你的表里面数据依然添加了进去的。
public static void testAdd() {
SessionFactory sf = HibernateUtils.getSessionFactory();
//第三步,使用SessionFactory创建session对象。
Session session = sf.openSession();
//第四步,开启事务
Transaction tx = session.beginTransaction();
//第五步 写具体逻辑crud操作
User user = new User();
user.setUserName("aa");
user.setPassword("123");
session.save(user);
//第六步 提交事务
tx.commit();
//第七步 关闭事务
session.close();
sf.close();
}
这里我使用了工具类的,因为这样可以避免多次重复创建,
public class HibernateUtils {
private static Configuration cfg = null;
private static SessionFactory s = null;
static {
cfg = new Configuration();
cfg.configure();
s = cfg.buildSessionFactory();
}
public static Session getThreadSession() {
return s.getCurrentSession();
}
public static SessionFactory getSessionFactory() {
return s;
}
}
Configuration:
到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)。
SessionFactory:
1 使用configuration对象创建sessionFactory对象 (1)创建sessionfactory过程中做事情: - 根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建
2 创建sessionFactory过程中,这个过程特别耗资源的 (1)在hibernate操作中,建议一个项目一般创建一个sessionFactory对象,这就是我前面为什么用工具类。
|
Session:
1 session类似于jdbc中connection
2 调用session里面不同的方法实现crud操作
(1)添加 save方法
(2)修改 update方法
(3)删除 delete方法
(4)根据id查询 get方法
3 session对象单线程对象
(1)session对象不能共用,只能自己使用
Transaction:
用来提交事务和回滚事务。