java随笔

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();
        }
        
        
    }
上一篇 下一篇

猜你喜欢

热点阅读