Hibernate(01)
2017-09-14 本文已影响4人
71150ce14a00
首先认识Hibernate框架是ORM关系映射框架, 工作在持久(dao)层,用对象的方式操作sql数据库
优点:全自动型,自动生成sql语句,具有很强的反射和代理机制,生成代理对象
缺点:因为做的事情太多,所以新能就会大大减弱,虽然有缓存等很多优化手段,但是效果并不明显
搭建Hibernate三个准备七个步骤
第一个准备:创建数据库
第二个准备编写实体类和ORM映射文件
实体类配置ORM映射文件:xml配置文件要与实体类名字一样并在同一个目录下xxx.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 >
<!-- class: 配置类与表的映射
name: 类对应的完整包路径名字
table:表名
-->
<class name= "com.itcast.domin.User" table="user">
<!-- 配置主键
name:类中属性名
column:表中字段名
-->
<id name= "id" column ="id">
<!-- 自增策略 identity:mysql专用 -->
<generator class= "identity"></generator >
</id>
<!-- 其他属性
name:类中属性名
column:表中字段名 :如果column与name一致,可以省略
-->
<property name= "name" column ="username"></ property>
<property name= "birthday"></property >
<property name= "email"></property >
</class>
</hibernate-mapping >
第三个准备配置Hibernate灵魂文件
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: 在hibernate中,session可以看成是Connection,但是,session比Connection强大N倍
session-factory:看成数据库连接池 -->
<session-factory>
<!-- 驱动 name:键,固定值 hibernate可以省略不写 -->
<property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver </property>
<!-- url -->
<property name="hibernate.connection.url" >jdbc:mysql:///user </property>
<!-- 用户名 -->
<property name= "hibernate.connection.username" >root </property>
<!-- 密码 -->
<property name= "hibernate.connection.password" >123 </property>
<!-- 方言:其实是数据库是sql99标准的扩展 -->
<property name="hibernate.dialect" >org.hibernate.dialect.MySQL5Dialect </property>
<!-- 使用hibernate最轻量级的配置,就是如上5个 -->
<property name= "hibernate.show_sql">true</property >
<property name= "hibernate.format_sql">true</property >
<!-- 自动建表:hibernate.hbm2ddl.auto * create-drop:每次运行的时候,都重新建表,运行结束,自动删除表
* create:运行的时候,检查表是否存在,如果存在,就什么都不干;如果不存在,则自动建表;但是 mysql每次都是重新建表 * update:运行的时候,检查表是否存在,
1 如果不存在,则自动建表 2 如果表存在,检查表的结构与 hbm映射文件是否一致 2.1 如果一致,则进行下一步操作 2.2 如果结构不一致,则修改表结构(只能增加列,不能删除列)
* validate:运行的时候,检查表结构 如果表结构与 hbm映射一致,则进行下一步操作 如果表结构与......不一致,则报错 * none:什么都不干 -->
<property name= "hibernate.hbm2ddl.auto" >update </property>
<!-- 自动事务提交,但是很遗憾,只有 mysql支持,oracle不支持 -->
<property name= "hibernate.connection.autocommit" >true </property>
<!--配置C3P0的数据库连接池 -->
<property name="hibernate.connection.provider_class" >org.hibernate.connection.C3P0ConnectionProvider </property>
<!-- 配置映射文件的位置 -->
<mapping resource= "com/itcast/domin/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
接下来就是使用Hibernate的七个步骤
//1 加载灵魂文件
Configuration cfg = new Configuration().configure();
//2 创建会话工厂
SessionFactory sessionFactory = cfg .buildSessionFactory();
//3 获取会话
Session session = sessionFactory.openSession();
//4 开启事务
Transaction tran = session.beginTransaction();
//5 CRUD操作
User user = new User();
user.setUsername( "小歪");
user.setBirthday( new Date());
user.setEmail( "516123@qq.com");
// 保存:面向对象的方式操作数据库
// session.save(user);
session.persist( user); // 这个方法跟save功能一样,没有区别,只是名字不一样
//6 事务提交
tran.commit();
//7 释放资源
session.close();
sessionFactory.close();
下面是CRUD操作
保存
1. session.save(user);
2.session.persist(user); // 和save没有区别只是名字不一样
修改操作
注意:更新操作必须设置id
// Hibernate更新的是所有字段,所以不需要更新的字段也需要赋值
User user = new User();
user.setId(4);
user.setUsername( "kk");
session.update( user);
根据id查询
根据id查询有两种方式,get和load
区别:当查询数据不存在时,get打印null,load报错
User user = session.get(User.class,1);
查询所有
Hibernate查询所 用HQL语句
List<User> list = session.createQuery("from User").list();
用sql
List<Object[]> list = sessioncreateSQLQuery("select * from user").list();
根据条件查询
HQL
// 匿名方式
1.User user = (User) session.createQuery("from User where name=?").setParameter(0,"ros").uniqueResult();
2. User user = (User) session.createQuery("from User where name=?").setString(0,"ros").uniqueResult();
// 命名方式
3.User user = (User) session.createQuery("from User where name=:name").setString("name","ros").uniqueResult();
4.User user = (User) session.createQuery("from User where name=:name").setParameter("name","ros").uniqueResult();
删除
User user = session.load(User.class,5);// 先查找,再删除
session.delete(user);
提取工具类
public class HibernateUtil {
private static SessionFactory factory;
static{
try {
Configuration cfg = new Configuration();
cfg.configure();
factory = cfg.buildSessionFactory();
//为系统停止运行的时候添加一个监听事件
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
factory.close();
}
});
} catch (Exception e) {
//throw new RuntimeException("创建SessionFactory失败!");
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory(){
return factory;
}
public static Session getCurrentSession(){
return factory.getCurrentSession();
}
}