zoukankan      html  css  js  c++  java
  • Hibernate的基础入门(一)

    Java三层结构

          1 web:struts框架

          2 service:Spring框架

          3  dao:hibernate框架

     相当于MVC的思想

       1 M:模型èhibernate框架

        2 V:视图èstruts框架 

      3 C:控制器èSpring框架

     

    1:Hibernate是对JDBC进一步封装

      不需要复杂的jdbc代码,不需要写sql语句也能实现  

    1.   没有使用hibernate如下:
    Jdbc:  
    public static final  String URL="jdbc:mysql://localhost:3306/数据库";//链接的mysql
            public static final String NAME = "root";
            public static final String PASSWORD = "root";
             public static final String DREIVER = "com.mysql.jdbc.Driver";
       //加载驱动
       Class.forName(DREIVER);
    //创建连接
    Connection con=DriverManager.getConnection(URL, NAME, PASSWORD);
    //对sql进行编译操作
    String sql = "select * from users "; // 查询多条数据
        PreparedStatement psmt=con.prepareStatement(sql);
    //执行sql
      ResultSet rs= psmt. executeQuery();
    //遍历结果集
    …..
    //释放资源

          2 使用hibernate:让实体类和表一一对应不需要代码即可实现,使用配置文件完成

    hibernate封装的对象session     

    //创建实体类的对象

      User user =new User();

    user.setName("明珠");

    session.sava(user);

    2:Hibernate的核心

      A :Configuration接口:负责配置并启动Hibernate

     B :SessionFactory接口:负责初始化Hibernate

     C :Session接口:负责持久化对象的CRUD操作

     D :Transaction接口:负责事务

     F :Query接口和Criteria接口:负责执行各种数据库查询

     注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃

     二:Hibernate 准备

    1.   导入jar包

        2.创建实体类(Javabean)      

         创建一个User的实体类

    /**
     * 2 创建实体类,然后配置实体类和数据库表一一对应关系(映射关系) 
     * @author Xiao_Zhu
     *
     */
    public class User {
        // hibernate要求实体类有一个属性唯一的
        // private String uuid;
        private int id;
        private String name;
        private String password;
        private String address;
    
        /*
         * public String getUuid() { return uuid; }
         * 
         * public void setUuid(String uuid) { this.uuid = uuid; }
         */
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    }

      3 :配置实体类和数据库表一一对应关系(映射关系) 

      (1):使用配置文件实现映射关系

        a. 创建xml格式的配置文件

          映射配置文件名称和位置没有固定要

         建议:配置文件最好放在实体类相应的包的路径下.  配置文件的名称:实体名称.hbm.xml (这是我的习惯)

     创建一个User.hbm.xml的配置文件

     

    <?xml version="1.0"?>
    <!-- 只有引入约束,下面才能使用hibernate-mapping的标签 -->
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
        <!-- 1配置类和表对应 
        class标签
        name属性:实体类全路径 ==>如: com.zhu.domain.User
        table属性:数据库表名称 -->
        <class name="com.zhu.domain.User" table="td_users">
            <!-- 2配置实体类ID和表里面的id对应 
                  hibernate:要求实体类有个属性唯一值 
                  hibernate:要求表有字段作为
                   -->
            <!-- id标签 
            name:实体类里面 id属性名  
            column:生成的表字段名称 
            -->
            <id name="uuid" column="uuid">
                <!-- 3 设置数据库表id增长策略
                 native: 生成表id值就是主键自动增长
                  -->
               <generator class="uuid"></generator>
            </id>
         
         <!--   4:配置其他属性和表字段对应
                 name属性:实体类属性(变量)名称
                 column :数据库表字段的名称     
          -->
          <property name="name" column="name"></property>
           <property name="password" column="password"></property>
            <property name="address" column="address"></property>
              
        </class>
    </hibernate-mapping>

      4:创建hibernate的核心配置文件

      a:核心配置文件格式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>
        <!-- 第一部分:配置数据库信息 jdbc:mysql://localhost:3306/-->
        <property name="hibernate.connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="hibernate.connection.url">
            jdbc:mysql://localhost:3306/jdbc01
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
    
        <!-- 第二部分:配置hibernate信息 -->
        <!--输出底层sql语句   --> 
        <property name="hibernate.show_sql">true</property>
        <!-- 输出底层SQL语句格式  -->
        <property name="hibernate.format_sql">true</property>  
        <!-- hibernate帮创建表,需要配置之后
            update:如果已经有表,那么就更新,如果没有,创建 -->
        <property name="hibernate.hbm2ddl.auto">update</property> 
        <!-- 配置数据库方言
            在mysql里面实现分页关键字limit,只能使用mysql里面
            在Oracle数据库,实现纷纷也rownum
            让hibernate框架识别不同数据库语句 -->
        <property name="hibernate.dialect">
            org.hibernate.dialect.MySQL5Dialect
        </property>
        
        <!-- 把session绑定到hibernate -->
       <property name="current_session_context_class">thread</property>
       
        <!-- 第三部分:把映射文件放到核心配置文件中 -->
        <!--  因为对应的表hibernatexml.hbm.xml配置文件放在包里,不是src下面的目录下;所以路径要这样写 -->
        <!-- 如果User.hbm.xml放在src下的目录下面,那么路径 就可以 直接这样写==>User.hbm.xml -->
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/jdbc01</property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <mapping resource="com/zhu/domain/User.hbm.xml" /> 
    </session-factory>
    </hibernate-configuration>

       5 创建数据的表

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    
    public class HibernateUtils {
        static    Configuration cfg=null;
         static SessionFactory sessionFactory=null;
         static {
             cfg=new Configuration();
             cfg.configure();
             
    ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
          sessionFactory = cfg.buildSessionFactory(registry);
         }
         //提供方法放回本地线程绑定session的方法
         public static Session getSessionObejct(){
             return sessionFactory.getCurrentSession();
         }
         
         public static SessionFactory getSessionFactory(){ 
             return sessionFactory;
         }
         
         public static void main(String[] args) {
             //要运行这里程序,运行之后才会在相应的某个数据库中生产一张表
               //运行之后去mysql中看一下是否成功生产了td_users表
        }
    }
     

        

    三:实现CRUD操作

    第一步: 加载hibernate核心配置文件       

    第二步:创建SessionFactory对象         

    第三部使用SessionFactory创建session对象  

    第四部:开启事务

    第五步:写具体逻辑crud操作

    第六步:提交事务

    第七步:关闭资源

     

    (1):瞬时态持久态,  托管态

      (a):瞬时态:对象里面没有id值,对象与session没有关联

      (b):持久态:对象里面有ID值,对应于session关联

      (c):托管态:对象有ID值,对象与session没有关联

       如:托管态

       User user=new User();

        user.setId(1);

      1 创建一个TestCRUD的类 

      

    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    
    import com.zhu.domain.User;
    import com.zhu.unit.HibernateUtils;
    
    public class TestCRUD {
    
        public static void main(String[] args) {
            // 新增数据
            // insertData();
    
            // 查询一条数据 通过ID
            // queryDataById();
    
            // 修改一条数据
            // updateData();
    
            /// 查询多条数据
            QueryListData();
    
            // 删除数据
            // deleteData();
    
        }
    
        // 查询一条数据 通过ID
        public static void queryDataById() {
            // 1;调用工具类得到sessionFactory
    
            SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
            // 2;获取到session
            Session session = sessionFactory.openSession();
            // 3:开启事务
            Transaction tx = session.beginTransaction();
    
            // 4根据ID查询
            // 调用session里面的get方法
            // 第一个参数:是实体类的class
            // 第二参数:是数据库 的id值
    //(b):持久态:对象里面有ID值,对应于session关联 User user = (User) session.get(User.class, 1); System.out.println("地址 ==>" + user.getAddress()); // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } // 修改一条数据 public static void updateData() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); // 4根据修改 // 调用session里面的get方法 // 第一个参数:是实体类的class // 第二参数:是数据库 的id值 User user = (User) session.get(User.class, 1); user.setAddress("中国"); // 调用session的方法update修改 session.update(user); // 注意:sava的方法也能进行修改 // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } // 删除数据 public static void deleteData() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); // 4 删除 // 第一种删除:根据ID查询对象再删除 User user = (User) session.get(User.class, 1); session.delete(user); /* * //第二种删除: User user2=new User(); user.setId(3); session.delete(user2); */ // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } // 新增数据 public static void insertData() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); // 第五步:写具体逻辑crud操作 // 添加功能
    //(a):瞬时态:对象里面没有id值,对象与session没有关联
    User user = new User(); user.setPassword("123123"); user.setAddress("美國s"); user.setName("mm"); // 调用session的方法实现添加 session.save(user); // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } // 查询多条数据 public static void QueryListData() { // 1;调用工具类得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2;获取到session Session session = sessionFactory.openSession(); // 3:开启事务 Transaction tx = session.beginTransaction(); String qhl = "from User"; Query query = session.createQuery(qhl); // 2 调用query对象里面的方法得到结果 List<User> list = query.list(); for (User user : list) { System.out.println(user.getAddress()); } // 5 提交事务 tx.commit(); // 6:关闭资源 session.close(); sessionFactory.close(); } }

    网盘地址  http://pan.baidu.com/s/1qYHPm8W

  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/zhu520/p/7373729.html
Copyright © 2011-2022 走看看