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

  • 相关阅读:
    Swift
    Swift
    Swift
    Swift
    iOS 判断某一日期是否在一日期区间
    iOS 本地推送通知
    iOS json解析中包含“ ”等解析出错
    iOS UILabel两侧加阴影
    IOS 设置ios中DatePicker的日期为中文格式
    [分享] 关于App Store下载到一半发生错误的问题 [复制链接]
  • 原文地址:https://www.cnblogs.com/zhu520/p/7373729.html
Copyright © 2011-2022 走看看