1.入门程序
a.导包
jpa
required
hibernate2
驱动包
b.配置文件hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!--property 用于配置hibernate中的属性-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--配置驱动器-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8</property>
<!--配置用户名-->
<property name="hibernate.connection.username">root</property>
<!--配置密码-->
<property name="hibernate.connection.password">123</property>
<!--show_sql:操作数据库时,会向控制台打印sql语句-->
<property name="show_sql">true</property>
<!--打印sql语句前,会将sql玉湖先格式化-->
<property name="format_sql">true</property>
<!-- update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构.
如果存在表结构,并且表结构与实体一致,那么不做修改
如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.
-->
<property name="hbm2ddl.auto">update</property>
<!-- hibernate.connection.autocommit: 事务自动提交 -->
<property name="hibernate.connection.autocommit">true</property>
<!-- 将Session与线程绑定=> 只有配置了该配置,才能使用getCurrentSession -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 数据库方言配置
org.hibernate.dialect.MySQLDialect (选择最短的)
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--添加映射文件-->
<mapping resource="uer.hb.xml"/>
b.配置uer.hb.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>
<class name="it.hema.hibernate.User" table="tb_user" dynamic-insert="true">
<!--主键-->
<id name="id">
<!--固定的值主键生成策略-->
<!--
<id>配置主键
name:属性名称
access="" 设置使用属性还是字段
column="" 表的列名
length="" 长度
type="" 类型
<generator> class属性用于设置主键生成策略
1.increment 由hibernate自己维护自动增长
底层通过先查询max值,再+1策略
不建议使用,存在线程并发问题
2.identity hibernate底层采用数据库本身自动增长列
例如:mysql auto_increment
3.sequence hibernate底层采用数据库序列
例如:oracle 提供序列
4.hilo
</generator>
5.native 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】
##以上策略使用整形,long, short 或者 int 类型
6.uuid 采用字符串唯一值【】
##以上策略 代理主键,有hibernate维护。
7.assigned 自然主键,由程序自己维护。【】
-->
<generator class="native"></generator>
</id>
<!--定义普通属性-->
<property name="username"/>
<property name="password"/>
</class>
</hibernate-mapping>
记住包urb.hb.xml导入到hibernate.cfg.xml
2.详解Configuration对象
public void fun2() {
// 默认加载src下的hibernate.cfg.xml
new Configuration().configure();
// 如果默认不能加载则使用
new Configuration().configure("通过文件file加载");
new Configuration().configure("通过路径path加载");
// 规范: 1>orm映射文件名称与实体的简单类名一致
// 2>orm映射文件 需要与实体的类在同一包下
new Configuration().configure().addClass(User.class);
}
3.详解Session对象 增,改,查
public void fun3() {
// 加载配置文件
Configuration config = new Configuration().configure();
// 根据配置信息创建factory
SessionFactory factory = config.buildSessionFactory();
// 开启session
Session session = factory.openSession();
// 开启事务
Transaction tra = session.beginTransaction();
User user = new User();
user.setUsername("jerry");
user.setPassword("1234");
// 保存
// session.save(user);
// 改
// get查询
User us = (User) session.get(User.class, 1);
us.setUsername("Tom");
// load查询
User ur = (User) session.load(User.class, 3);
// get: get方法被调用时立刻 发送sql语句查询
// load : 调用时并没有查询数据库,当我们需要使用该对象的时候,才查询数据
session.update(us);
tra.commit();
// 关闭资源
session.close();
factory.close();
}
4.// 查询所有对象
// HQL语言 ,creatQuery 传入hql语句查询
public void fun4() {
// 加载配置文件
Configuration config = new Configuration().configure();
// 根据配置信息创建factory
SessionFactory factory = config.buildSessionFactory();
// 开启session
Session session = factory.openSession();
// 开启事务
Transaction tra = session.beginTransaction();
// HQL语言 ,creatQuery 传入hql语句查询
Query query = session.createQuery("from it.hema.hibernate.User");
List<User> list = query.list();
System.out.println(list);
// 运行结果:[it.hema.hibernate.User@799e11a1,
// it.hema.hibernate.User@20d12eea, it.hema.hibernate.User@55f157b,
// it.hema.hibernate.User@257b40fe, it.hema.hibernate.User@3ee7f6eb,
// it.hema.hibernate.User@6f03de90]
for (User ob : list) {
System.out.println(list.toString());
}
tra.commit();
// 关闭资源
session.close();
factory.close();
}
5.// 查询所有对象
// Criteria查询=》Hibernate独创的面向对象的查询=> 无语句
public void fun5() {
// 加载配置文件
Configuration config = new Configuration().configure();
// 根据配置信息创建factory
SessionFactory factory = config.buildSessionFactory();
// 开启session
Session session = factory.openSession();
// 开启事务
Transaction tra = session.beginTransaction();
// Criteria查询=》Hibernate独创的面向对象的查询=> 无语句
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
System.out.println(list);
// 运行结果:[it.hema.hibernate.User@799e11a1,
// it.hema.hibernate.User@20d12eea, it.hema.hibernate.User@55f157b,
// it.hema.hibernate.User@257b40fe, it.hema.hibernate.User@3ee7f6eb,
// it.hema.hibernate.User@6f03de90]
tra.commit();
// 关闭资源
session.close();
factory.close();
}
6.条件查询
// 條件查詢
public void fun11() {
// 加载配置文件
Configuration config = new Configuration().configure();
// 根据配置信息创建factory
SessionFactory factory = config.buildSessionFactory();
// 开启session
Session session = factory.openSession();
// 开启事务
Transaction tra = session.beginTransaction();
// Criteria查询=》Hibernate独创的面向对象的查询=> 无语句
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("username", "Tom"));
// select * from t_user;
// list() 将查询执行,并返回结果(多行)
// List<User> list = criteria.list();
// System.out.println(list);
// 返回一个查询结果
User u = (User) criteria.uniqueResult();
System.out.println(u);
tra.commit();
// 关闭资源
session.close();
factory.close();
}
7.// 原生的Sql查询
public void fun6() {
// 加载配置文件
Configuration config = new Configuration().configure();
// 根据配置信息创建factory
SessionFactory factory = config.buildSessionFactory();
// 开启session
Session session = factory.openSession();
// 开启事务
Transaction tra = session.beginTransaction();
SQLQuery query = session.createSQLQuery("select * from tb_user");
query.addEntity(User.class);
List<User> list = query.list();
System.out.println(list);
// 运行结果:[it.hema.hibernate.User@799e11a1,
// it.hema.hibernate.User@20d12eea, it.hema.hibernate.User@55f157b,
// it.hema.hibernate.User@257b40fe, it.hema.hibernate.User@3ee7f6eb,
// it.hema.hibernate.User@6f03de90]
tra.commit();
// 关闭资源
session.close();
factory.close();
}
public void fun7() {
// 加载配置文件
Configuration config = new Configuration().configure();
// 根据配置信息创建factory
SessionFactory factory = config.buildSessionFactory();
// 开启session
Session session = factory.openSession();
// 开启事务
Transaction tra = session.beginTransaction();
SQLQuery query = session.createSQLQuery("select * from tb_user");
List<Object[]> list = query.list();
for (Object[] objs : list) {
System.out.println(Arrays.toString(objs));
}
// [1, Tom, 123]
// [2, zhangsan, 123]
// [3, zhangsan, 123]
// [4, zhangsan, 123]
// [5, zhangsan, 123]
// [6, jerry, 1234]
tra.commit();
// 关闭资源
session.close();
factory.close();
}
9.SessionFactory的详解
public void fun8() {
// 加载配置文件
Configuration config = new Configuration().configure();
// 根据配置信息创建factory
SessionFactory factory = config.buildSessionFactory();
// 开启一个新的session
Session session = factory.openSession();
// 获取当前的session对象
Session session2 = factory.getCurrentSession();
// 开启事务
Transaction tra = session.beginTransaction();
// 在这里需要在xml文件里面编写
// <property
// name="hibernate.current_session_context_class">thread</property>
System.out.println(session);
System.out.println(session2);
tra.commit();
// 关闭资源
session.close();
factory.close();
}
- // 详解事务
11. public void fun9() {
// 加载配置文件
Configuration config = new Configuration().configure();
// 根据配置信息创建factory
SessionFactory factory = config.buildSessionFactory();
// 开启一个新的session
Session session1 = factory.getCurrentSession();
session1.beginTransaction().commit();// 关闭事务则获得的session就会不一样
// 获取当前的session对象
Session session3 = factory.getCurrentSession();
// 开启事务
// System.out.println(session==session2);true
System.out.println(session3 == session1);// false
// 关闭资源
session1.close();
factory.close();
}
// Query对象 封装HQL语句的对象
// Query中封装查询细节api
public void fun10() {
// 1加载配置
Configuration conf = new Configuration().configure();
// 2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
// 3 获得session
Session session = sf.openSession();
// 打开事务
Transaction ts = session.beginTransaction();
// --------------------------------------------------------
Query query = session.createQuery("from it.hema.hibernate.User ");
// 分页 limit index,count;
// 指定结果从第几个开始拿
query.setFirstResult(0);
// 指定拿几个结果
query.setMaxResults(1);
// query.list() 将hql语句执行,并返回结果(多行)
// List<User> list = query.list();
// System.out.println(list);
// uniqueResult 将hql语句执行,并返回结果(一行)
User u = (User) query.uniqueResult();
System.out.println(u);
// ---------------------------------------------------------
// 提交事务
ts.commit();
// 关闭资源
session.close();
sf.close();
}
//动态插入 需要在uer.hb.xml里面配置
//<class name="it.hema.hibernate.User" table="tb_user" dynamic-insert="true">
@Test
public void fun12(){
Session session = HibernateUtils.getCurrentSession();
Transaction tra = session.beginTransaction();
User user = new User();
user.setUsername("wangwu");
session.save(user);
tra.commit();
}
//动态更新
@Test
public void fun13(){
Session session = HibernateUtils.getCurrentSession();
Transaction tra = session.beginTransaction();
User us = (User) session.get(User.class, 1);
us.setUsername("TTT");
session.update(us);
tra.commit();
}
}