1.核心配置文件位置放置src目录下,名称为hibernate.cxf.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>
<!-- 1 数据库部分配置 必须-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置连接池 -->
<!-- <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->
<!-- 2 hibernate基本配置 可选 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--
创建数据库表,需要配置实现
create-drop: 如果数据库存在相同的表,把表删除再创建
create:如果数据库存在相同的表,再创建相同字段的表
update:如果数据库存在相同的表,把表更新,如果没有表,创建表
validate:如果数据库存在相同的表,把表更新,如果没有表,创建表;多个校验功能:数据库表字段必须和实体类属性完全一样
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--
配置数据库方言
mysql做分页使用limit关键字,limit关键字只能使用在mysql里面
oracle使用rownum,只能使用oracle里面
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 与线程绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 3 引入映射文件 必须-->
<mapping resource="cn/itcast/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2.映射配置文件:一般命名为 类名.hbm.xml
<?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>
<!-- 完成类和表对应
name: 实体类全路径
table: 数据库表名称
-->
<class name="cn.entity.User" table="t_user">
<!-- 完成类里面属性和表里面字段对应 -->
<!-- 配置实体类属性和表主键对应使用id标签
name: 类里面属性名称
column:表字段名称
-->
<id name="uid" column="uid">
<generator class="native"></generator>
</id>
<!-- 其他属性和字段对应
name: 类里面属性名称
column:表字段名称
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
配置细节问题
(1)name属性里面写实体类相关的部分
(2)column属性里面写表字段名称
(3)column属性可以省略,属性值和name属性值一样的
(4)length属性设置表字段长度,省略有默认值
(5)type属性设置字段类型
(6)双引号里面不能添加空格
3.添加测试:
@Test
public void addUser() {
// 第一步 加载hibernate核心配置文件
/*
* 到项目里面src下面找到名称是 hibernate.cfg.xml配置文件
* 把配置文件加载到cfg对象里面
* */
Configuration cfg = new Configuration();
cfg.configure();
// 第二步 创建SessionFactory对象
/*
* 做很多事情:
* 创建sessionFactory过程中
* (1)找到核心文件中数据库部分,连接数据库
* (2)找是否需要hibernate帮创建表,
* ** 找到需要帮创建表,找到映射,根据映射关系在连接数据库把表创建
* ** 如果不需要创建表,直接返回sessionFactory对象
* */
SessionFactory sessionFactory = cfg.buildSessionFactory();
// 第三步 使用SessionFactory对象创建Session对象
/*
* 类似于jdbc里面connection
* */
Session session = sessionFactory.openSession();
// 第四步 开启事务
/*
* hibernate建议手动控制事务
* */
Transaction tx = session.beginTransaction();
// 第五步 调用session方法实现添加操作
/*
* 不需要写sql语句
* 不是直接操作数据库表,操作表对应实体类对象就可以了
* */
User user = new User();
user.setUsername("东方不败");
user.setPassword("1314520");
user.setAddress("日本");
//调用session方法实现
session.save(user);
// 第六步 提交事务
tx.commit();
// 第七步 关闭连接
session.close();
sessionFactory.close();
}
因为创建SessionFactory过程中做很多事情,这个过程特别耗资源
解决sessionFactory耗资源问题:
(1)方案:让sessionFactory对象在一个项目里面只需要创建一次
* 类似于 ServletContext对象
(2)实现:
* 静态代码块,类加载时候执行,执行一次
public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//静态代码块实现
static {
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
//提供返回sessionFactory对象的方法
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
4.根据id查询:
(1)第一个参数 实体类的Class
(2)第二个参数 id值
//根据idc查询
@Test
public void getUserDemo() {
//SessionFactory对象
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//session对象
Session session = sessionFactory.openSession();
//开启事务
Transaction tx = session.beginTransaction();
//根据id查询
User user = session.get(User.class,2);
System.out.println(user);
//提交事务
tx.commit();
//关闭
session.close();
sessionFactory.close();
}
5.修改操作:
@Test
public void updateUser() {
//SessionFactory对象
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//session对象
Session session = sessionFactory.openSession();
//开启事务
Transaction tx = session.beginTransaction();
//1 根据id查询
User user = session.get(User.class, 1);
//2 修改值,设置user对象里面值
user.setPassword("9999");
//3 调用方法实现修改
/*
* 到user对象里面找到id值,根据id值修改对象里面其他数据
* */
session.update(user);
//提交事务
tx.commit();
//关闭
session.close();
sessionFactory.close();
}
6.删除操作:
@Test
public void deleteUser() {
//SessionFactory对象
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//session对象
Session session = sessionFactory.openSession();
//开启事务
Transaction tx = session.beginTransaction();
//1 根据id查询对象
User user = session.get(User.class, 2);
/*
* 到传递user对象里面找到id值,根据id值进行删除
* */
session.delete(user);
//提交事务
tx.commit();
//关闭
session.close();
sessionFactory.close();
}