• Java框架之Hibernate实战篇


    从零开始Hibernate实战篇:(四篇实战代码,循序渐进,注意事项和学习内容在代码注释里面,面向有一定基础的同学使用)

    第一篇:基础篇(搭建)

    Hibernate开发基本步骤:

    1.导入jar包(hibernate-release-5.0.7.Finallib的文件里面去找所需要的jar包)

    2.写实体类+实体类的映射文件

    User.java

    /**
     * Project Name:hibernate_demo
     * File Name:User.java
     * Package Name:cn.itcast.entity
     *
    */
    
    package cn.itcast.entity;
    
    /**
     * @author zhouP
     * @version
     * @see
     */
    public class User {
    
        // hibernate要求实体类有一个属性唯一的
        private int uid;
    
        private String username;
    
        private String password;
    
        private String address;
    
        public void setUid(int uid) {
            this.uid = uid;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public int getUid() {
            return uid;
        }
    
    }

    User.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>
        <!-- 1.配置类和表对应 class属性:实体类全路径(类路径) table属性:数据库表名称 -->
        <class name="cn.itcast.entity.User" table="t_user">
            <!-- 2.配置实体类id与表id对应 hibernate要求实体类有一个属性唯一值 hibernate要求表有字段作为唯一值 -->
            <!-- id标签 name属性:实体类里面id属性名称 column属性:生成的表字段名称 -->
            <id name="uid" column="uid">
                <!-- 配置数据库表id的增长策略 native:主键自动增长 -->
                <generator class="native"></generator>
            </id>
    
            <!-- 配置其他属性和表字段对应 name属性:实体类属性名称 column属性:生成表字段名称 -->
            <property name="username" column="username"></property>
            <property name="password" column="password"></property>
            <property name="address" column="address"></property>
            
        </class>
    
    </hibernate-mapping>

    3.Hibernate核心配置文件

    <?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>
    <!-- 第一部分:配置数据库信息(必须的) -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql:///hibernate_test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    
    <!-- 第二部分:配置hibernate信息(可选的) -->
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <!-- 两个重要配置ddl、dialect(分页时用) -->
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    
    <!-- 第三部分:把映射文件放到核心配置文件中(必须的)(文件路径) -->
    <mapping resource="cn/itcast/entity/User.hbm.xml"/>
    </session-factory>
    </hibernate-configuration>

    4.编写Hibernate工具类

    package cn.itcast.utils;
    
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtils {
    
        // 创建sessionFactory的过程,特别浪费资源,建议一个项目一般创建一个sessionFactory对象
        // static Configuration cfg = null;
    
        static SessionFactory sessionFactory = null;
        // 静态代码块实现
        static {
            // cfg = new Configuration();
            // cfg.configure();
            // sessionFactory = cfg.buildSessionFactory();
            sessionFactory = new Configuration().configure().buildSessionFactory();
    
        }
    
        // 提供方法返回sessionFactory
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
    }

    5.测试代码

    package cn.itcast.hibernatetest;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.entity.User;
    import cn.itcast.utils.HibernateUtils;
    
    public class HibernateDemo {
    
        @Test
        public void testAdd() {
            // 第一步:加载hibernate核心配置文件
            // Configuration cfg = new Configuration();
            // cfg.configure();
            // 第二步:创建SessionFactory对象
            // SessionFactory sessionFactory = cfg.buildSessionFactory();
    
            SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
            // 第三步:使用SessionFactory创建session对象
            Session session = sessionFactory.openSession();
            // 第四步:开启事务
            Transaction tx = session.beginTransaction();
    
            // 第五步:写具体的逻辑 curd操作
            // 添加功能
            User user = new User();
            user.setUsername("Mr Li");
            user.setPassword("1234");
            user.setAddress("武汉");
    
            // 调用session的方法实现添加
            session.save(user);
    
            // 第六步:提交事务
            tx.commit();
            // 第七步:关闭资源
            session.close();
            sessionFactory.close();
    
        }
    
    }

    第二篇:Hibernate API 练习篇

    1.创建项目(略)2.导入jar包(略)3.实体类+其映射文件(略)

    4.Hibernate核心配置文件

    <?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>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_test2</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        <!-- 在hibernate核心配置文件中配置 -->
        <property name="hibernate.current_session_context_class">thread</property>
        <!-- 把映射文件放到hibernate核心配置文件当中 -->
        <mapping resource="cn/itcast/entity/User.cfg.xml"/>
        </session-factory>    
        </hibernate-configuration>

    5.Hibernate相关测试代码:

    (1)HibernateDemo.java

    package cn.itcast.hibernatetest;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.entity.User;
    import cn.itcast.utils.HibernateUtils;
    
    
    public class HibernateDemo {
    
        @Test
        public void testSaveOrUpdate() {
            // 1.调用工具类得到sessionFactory
            SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
            // 2.获取session
            Session session = sessionFactory.openSession();
            // 3.开启事务
            Transaction tx = session.beginTransaction();
            // 4.添加操作
            // User user = new User();
            // user.setUid(1);
            // user.setUsername("王第一");
            // user.setPassword("12345");
            // user.setAddress("杏林二小");
            // session.save(user);
    
            // 把uid=1的记录username修改
            // User user = new User();
            // user.setUid(1);
            // user.setUsername("韩梅梅梅");
            // session.save(user);要用update
            // session.update(user);
    
            // User user = session.get(User.class, 2);
            // user.setAddress("兴隆林业局");
            // // 实体类对象是持久态,做修改
            // session.saveOrUpdate(user);
    
            // User user = new User();
            // user.setUsername("rose");
            // user.setPassword("1314");
            // user.setAddress("阿尔巴尼亚");
            // session.save(user);
    
            // User user = new User();
            // user.setUsername("jack");
            // user.setPassword("520");
            // user.setAddress("朝鲜");
            // session.save(user);
    
            User user = new User();
            user.setUsername("jack");
            user.setPassword("124");
            user.setAddress("china");
            session.save(user);
    
            // 5.提交事务
            try {
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                // 6.关闭资源
                session.close();
                sessionFactory.close();
            }
    
        }
    
        @Test
        public void testDelete() {
            // 1.利用工具类创建sessionFactory
            SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
            // 2.得到session
            Session session = sessionFactory.openSession();
            // 3.开启事务
            Transaction tx = session.beginTransaction();
            // 4.删除操作
            // 第一种删除方法
            // User user = session.get(User.class, 1);
            // session.delete(user);
    
            // 第二种删除方法
            User user = new User();
            user.setUid(3);
            session.delete(user);
    
            // 5.提交事务
            try {
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                // 6.关闭资源
                session.close();
                sessionFactory.close();
            }
    
        }
    
        @Test
        public void testUpdate() {
            // 1.工具类中得到sessionFactory
            SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
            // 2.得到session
            Session session = sessionFactory.openSession();
            // 3.开启事务
            Transaction tx = session.beginTransaction();
            // 4.更新操作(修改uid=2记录的username值)
            // 4.1根据id查询(如果数据库中没有此id,执行的是查询)
            User user = session.get(User.class, 2);
            // 4.2向返回的username对象里面设置修改之后的值
            user.setUsername("修改之后的值");
            // 4.3调用session的update方法
            // 执行过程:到user对象里面找到uid值,根据uid进行修改
            session.update(user);
            // 5.提交事务
            try {
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                // 6.关闭资源
                session.close();
                sessionFactory.close();
            }
    
        }
    
    }

    (2)HibernateQueryData.java

    package cn.itcast.hibernatetest;
    
    import java.util.List;
    
    import org.hibernate.Criteria;
    import org.hibernate.Query;
    import org.hibernate.SQLQuery;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.entity.User;
    import cn.itcast.utils.HibernateUtils;
    
    public class HibernateQueryData {
    
        // 使用SQLQuery对象
        @Test
        public void testQuery() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 创建SQLQuery对象
                SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
                // 返回的list中的每部分是对象的形式
                sqlQuery.addEntity(User.class);
                // 调用SQLQuery里面的方法...导包是:import java.util.List;
                @SuppressWarnings("unchecked")
                List<User> list = sqlQuery.list();
    
                // 验证:当调用SQLQuery方法:返回的list集合,默认里面每一部分是数组结构
                for (User user : list) {
                    System.out.println(user);
                }
                // List<Object[]> list = sqlQuery.list();
                //
                // for (Object[] objects : list) {
                // System.out.println(Arrays.toString(objects));
                // }
                // 提交事务
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
    
            }
        }
    
        // 使用Criteria对象
        @Test
        public void testCriteria() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                // 创建criteria对象
                Criteria criteria = session.createCriteria(User.class);
                @SuppressWarnings("unchecked")
                List<User> list = criteria.list();
                for (User user : list) {
                    System.out.println(user);
                }
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    
        // 使用query对象
        @Test
        public void demoQuery() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = HibernateUtils.getSessionobject();
                // 开启事务
                tx = session.beginTransaction();
    
                // 1 创建Query对象
                Query query = session.createQuery("from User");
    
                // 2 调用query对象里面的方法得到结果
                @SuppressWarnings("unchecked")
                List<User> list = query.list();
    
                // 遍历list集合四种: 普通for、增强for、迭代器、list迭代器
                // 遍历set集合两种:增强for、迭代器
                // 遍历map集合两种:得到所有key,根据key得到value; 得到key-value关系
                for (User user : list) {
                    System.out.println(user);
                }
    
                // 提交事务
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    }

    (3)HibernateSelect.java

    package cn.itcast.hibernatetest;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.entity.User;
    import cn.itcast.utils.HibernateUtils;
    
    public class HibernateSelect {
    
        // 事务规范代码
        @Test
        public void testTx() {
            Session session = null;
            Transaction tx = null;
            try {
                // 于本地线程绑定的session
                session = HibernateUtils.getSessionobject();
                // 开启事务
                tx = session.beginTransaction();
    
                // 添加
                User user = new User();
                user.setAddress("华丰");
                user.setPassword("789");
                user.setUsername("化华");
    
                session.save(user);
    
                // 模拟出事情了:java.lang.ArithmeticException: / by zero
                // 10/0 此时,不能插入数据
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                // 下面session不能关闭,JUnit关闭会报错。可以插入数据。
                // org.hibernate.SessionException: Session was already closed
                // org.hibernate.SessionException: Session was already closed
                // session.close();
            }
    
        }
    
        // 一级缓存特性
        @Test
        public void testDemo() {
    
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
    
            try {
                // 1.调用工具类得到sessionFactory
                sessionFactory = HibernateUtils.getSessionFactory();
                // 2.获取session
                session = sessionFactory.openSession();
    
                // 3.开启事务
                tx = session.beginTransaction();
                // 4.操作:查询
                User user = session.get(User.class, 5);
    
                user.setAddress("之前室china,现在是哈尔滨");
                session.update(user);
    
                // 5.提交事务
                tx.commit();
    
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                // 6.关闭资源
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 验证一级缓存存在
        @Test
        public void testCasch() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.根据id=2查询
                // 执行第一个get方法是否查询数据库,是否发送语句
                User user1 = session.get(User.class, 2);
                System.out.println(user1);
    
                // 2.在 根据id查询
                // 执行第二个get方法是否查询数据库,是否发送语句
                // 结果是!只有一条查询语句,两条查询结果
                User user2 = session.get(User.class, 2);
                System.out.println(user2);
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    
    }

    第三篇:Hibernate 一对多、多对多实战篇

    1.cn.itcast.entity包里面:

    (1)Customer.java

    package cn.itcast.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Customer {
        // 用户id
        private Integer cid;
    
        // 用户名称
        private String custName;
    
        // 用户级别
        private String custLevel;
    
        // 用户来源
        private String custSource;
    
        // 联系电话
        private String custPhone;
    
        // 手机
        private String custMobile;
    
        // 在客户实体类里面表示多个联系人,一个客户有多个联系人
        // hibernate要求使用集合表示多的数据,使用set集合:
        // import java.util.HashSet;import java.util.Set;
        private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();
    
        public Set<LinkMan> getSetLinkMan() {
            return setLinkMan;
        }
    
        public void setSetLinkMan(Set<LinkMan> setLinkMan) {
            this.setLinkMan = setLinkMan;
        }
    
        public Integer getCid() {
            return cid;
        }
    
        public void setCid(Integer cid) {
            this.cid = cid;
        }
    
        public String getCustName() {
            return custName;
        }
    
        public void setCustName(String custName) {
            this.custName = custName;
        }
    
        public String getCustLevel() {
            return custLevel;
        }
    
        public void setCustLevel(String custLevel) {
            this.custLevel = custLevel;
        }
    
        public String getCustSource() {
            return custSource;
        }
    
        public void setCustSource(String custSource) {
            this.custSource = custSource;
        }
    
        public String getCustPhone() {
            return custPhone;
        }
    
        public void setCustPhone(String custPhone) {
            this.custPhone = custPhone;
        }
    
        public String getCustMobile() {
            return custMobile;
        }
    
        public void setCustMobile(String custMobile) {
            this.custMobile = custMobile;
        }
    
    }

    Customer.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
    <!-- 1.配置类和表对应
           class标签
           name属性:实体类的全路径
           table属性:数据库表名称 -->
    <class name="cn.itcast.entity.Customer" table="t_customer">
    <id name="cid" column="cid">
    <generator class="native"></generator>
    </id>
    <property name="custName" column="custName"></property>
    <property name="custLevel" column="custLevel"></property>
    <property name="custSource" column="custSource"></property>
    <property name="custPhone" column="custPhone"></property>
    <property name="custMobile" column="custMobile"></property>
    
    <!-- 在客户映射文件中,表示所有联系人
         使用set标签:表示所有联系人
         set标签里面有name属性:属性值写在客户实体类里面,表示联系人的set集合名称 
         reverse属性默认值:false表示不放弃维护
                        true表示放弃维护-->
    <set name="setLinkMan" inverse="true">
    <!-- 一对多建表,有外键
         hibernate机制:双向维护外键,在一和多那一方都配置外键
         column属性值:外键名称
          -->
    <key column="clid"></key>
    <!-- 客户所有的联系人,class里面写联系人实体类全路径 -->
    <one-to-many class="cn.itcast.entity.LinkMan"/>
    </set>
    </class>
    </hibernate-mapping>

    (2)LinkMan.java

    package cn.itcast.entity;
    
    public class LinkMan {
        // 联系人编号(主键)
        private Integer lkm_id;
    
        // 联系人姓名
        private String lkm_name;
    
        // 联系人性别
        private String lmk_gender;
    
        // 联系人办公电话
        private String lkm_phone;
    
        // 在联系人实体类里面表示所有客户,一个联系人只能属于一个客户
        // Customer customer=new Customer();
        private Customer customer;
    
        public Customer getCustomer() {
            return customer;
        }
    
        public void setCustomer(Customer customer) {
            this.customer = customer;
        }
    
        public Integer getLkm_id() {
            return lkm_id;
        }
    
        public void setLkm_id(Integer lkm_id) {
            this.lkm_id = lkm_id;
        }
    
        public String getLkm_name() {
            return lkm_name;
        }
    
        public void setLkm_name(String lkm_name) {
            this.lkm_name = lkm_name;
        }
    
        public String getLmk_gender() {
            return lmk_gender;
        }
    
        public void setLmk_gender(String lmk_gender) {
            this.lmk_gender = lmk_gender;
        }
    
        public String getLkm_phone() {
            return lkm_phone;
        }
    
        public void setLkm_phone(String lkm_phone) {
            this.lkm_phone = lkm_phone;
        }
    
    }

    LinkMan.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
    <class name="cn.itcast.entity.LinkMan" table="t_linkman">
    <id name="lkm_id" column="lkm_id">
    <generator class="native"></generator>
    </id>
    <property name="lkm_name" column="lkm_name"></property>
    <property name="lmk_gender" column="lmk_gender"></property>
    <property name="lkm_phone" column="lkm_phone"></property>
    
    <!-- 表示联系人所属客户
        name属性:因为在联系人实体类使用customer对象表示,写customer名称
        class属性:customer全路径
        column属性:外键名称 -->
        <many-to-one name="customer" class="cn.itcast.entity.Customer" column="clid"></many-to-one>
    </class>
    </hibernate-mapping>

    2.HibernateUtils包里面的HibernateUtils.java工具类,添加本地线程绑定的session的方法

    package cn.itcast.utils;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtils {
    
        // 加载核心配置文件,静态代码块实现
        static Configuration cfg = null;
    
        static SessionFactory sessionFactory = null;
        static {
            cfg = new Configuration();
            cfg.configure();
            sessionFactory = cfg.buildSessionFactory();
        }
    
        // 提供返回与本地线程绑定的session的方法
        public static Session getSessionObject() {
            return sessionFactory.getCurrentSession();
        }
    
        // 提供方法返回sessionFactory
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        public static void main(String[] args) {
    
        }
    }

    3.Hibernate核心配置文件

    <?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>
    <!-- 第一部分:配置数据库信息,必须的 -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql:///hibernate_test3</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <!-- 第二部分:配置hibernate信息,可选 -->
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <!-- 配置数据库方言
        在mysql里面实现分页,关键字limit,只能用在mysql里面
        在oracle数据库,实现分页rownum
        让hibernate框架识别不同数据库的自己特有的语句 -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <!-- 第三部分:把映射文件放到核心配置文件中,必须的-->
    <mapping resource="cn/itcast/entity/Customer.hbm.xml"/>
    <mapping resource="cn/itcast/entity/LinkMan.hbm.xml"/>
    
    <mapping resource="cn/itcast/manytomany/User.hbm.xml"/>
    <mapping resource="cn/itcast/manytomany/Role.hbm.xml"/>
    
    
    </session-factory>
    </hibernate-configuration>

    4.Hibernatetest包

    (1)HibernateOnetoMany.java

    package hibernatetest;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.entity.Customer;
    import cn.itcast.entity.LinkMan;
    import cn.itcast.utils.HibernateUtils;
    
    
    public class HibernateOnetoMany {
    
        // 演示:一对多级联保存
        @Test
        public void testUpdate() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 添加一个客户,为这个客户添加一个联系人
                // 1 创建客户和联系人对象
                Customer customer = new Customer();
                customer.setCustLevel("vip");
                customer.setCustMobile("8888");
                customer.setCustName("橡果国际");
                customer.setCustPhone("18345782345");
                customer.setCustSource("上海");
    
                LinkMan linkman = new LinkMan();
                linkman.setLkm_name("王小卓");
                linkman.setLkm_phone("173456379876");
                linkman.setLmk_gender("女");
    
                // 2 在客户表示所有联系人,在联系人表示客户
                // 建立客户对象和联系人对象关系
                // 2.1 把联系人对象 放到客户对象的set集合里面
                customer.getSetLinkMan().add(linkman);
                // 2.2 把客户对象放到联系人里面
                linkman.setCustomer(customer);
    
                // 3 保存到数据库
                session.save(customer);
                session.save(linkman);
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    
        // 演示:一对多级联保存
        @Test
        public void testAddDemo2() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                Customer customer = new Customer();
                customer.setCustLevel("普通");
                customer.setCustName("奥克斯");
                customer.setCustPhone("18932222237");
                customer.setCustSource("北京");
    
                LinkMan linkman = new LinkMan();
                linkman.setLkm_name("陈小桥");
                linkman.setLkm_phone("15024324567");
                linkman.setLmk_gender("女");
    
                customer.getSetLinkMan().add(linkman);
                // 少了这句,linkman.setCustomer(customer);只执行t_customer表的insert语句
                // 添加它和session.save(linkman);,则t_linkman表中添加的新数据(陈小桥)才会加进去
                linkman.setCustomer(customer);
    
                // save() 保存要有哦!
                session.save(customer);
                session.save(linkman);
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                // sessionFactory.close();
                // session.close();
            }
        }
    
        // 演示:一对多级联删除
        @Test
        public void testDeleteDemo() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.根据id查询客户对象
                Customer customer = session.get(Customer.class, 12);
                // 2.调用删除方法
                session.delete(customer);
                // 3.提交事务
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                // sessionFactory.close();
            }
        }
    
        // 演示:一对多修改
        @Test
        public void testUpdateDemo() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                // 1.根据id查询联系人,根据id查询客户
                Customer customer1 = session.get(Customer.class, 3);
                LinkMan linkman1 = session.get(LinkMan.class, 1);
                // 2.设置持久态对象值
                // i.把联系人放到客户里面
                customer1.getSetLinkMan().add(linkman1);
                // ii.把客户放到联系人里面
                linkman1.setCustomer(customer1);
                // 3.提交事务
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                // sessionFactory.close();
            }
    
        }
    
    }

    (2)HibernateManytoMany.java

    package hibernatetest;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.manytomany.Role;
    import cn.itcast.manytomany.User;
    import cn.itcast.utils.HibernateUtils;
    
    
    public class HibernateManytoMany {
        // 演示维护第三张表
        @Test
        public void testTable1() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 让某个用户拥有某个角色
                // 1.查询
                User user1 = session.get(User.class, 2);
                Role role1 = session.get(Role.class, 2);
                // 2.放
                user1.getSetRole().add(role1);
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                // sessionFactory.close();
            }
        }
    
        // 演示:维护第三张表
        @Test
        public void testTable2() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 让某个用户没有某个角色
                User user2 = session.get(User.class, 2);
                Role role2 = session.get(Role.class, 3);
    
                // 从用户里面把角色去掉
                user2.getSetRole().remove(role2);
                // 提交事务
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                // sessionFactory.close();
            }
    
        }
    
        // 演示:多对多级联删除
        @Test
        public void testSave() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 添加两个用户,为每个用户相加两个角色
                // 1.创建对象
                User user3 = new User();
                user3.setUser_name("春花");
                user3.setUser_password("8766899");
    
                User user4 = new User();
                user4.setUser_name("mary");
                user4.setUser_password("456");
    
                Role role3 = new Role();
                role3.setRole_name("pig");
                role3.setRole_memo("粉色的");
    
                Role role4 = new Role();
                role4.setRole_name("秘书");
                role4.setRole_memo("秘书");
    
                Role role5 = new Role();
                role5.setRole_name("保安");
                role5.setRole_memo("保安");
    
                // 2.建立关系,把角色放到用户里面
                user3.getSetRole().add(role3);
                user3.getSetRole().add(role4);
    
                user4.getSetRole().add(role4);
                user4.getSetRole().add(role5);
    
                // 3.保存
                session.save(user3);
                session.save(user4);
    
                // 4.提交事务
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                // sessionFactory.close();
            }
        }
    
        // 演示:多对多级联保存
        @Test
        public void testDelete() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                User user5 = session.get(User.class, 1);
                session.delete(user5);
                // 提交事务
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                // sessionFactory.close();
            }
        }
    }

    5.cn.itcast.manytomany包

    (1)Role.java

    package cn.itcast.manytomany;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Role {
    
        private Integer role_id;
    
        private String role_name;
    
        private String role_memo;
    
        // 一个角色有多个客户
        private Set<User> setUser = new HashSet<User>();
    
        public Set<User> getSetUser() {
            return setUser;
        }
    
        public void setSetUser(Set<User> setUser) {
            this.setUser = setUser;
        }
    
        public Integer getRole_id() {
            return role_id;
        }
    
        public void setRole_id(Integer role_id) {
            this.role_id = role_id;
        }
    
        public String getRole_name() {
            return role_name;
        }
    
        public void setRole_name(String role_name) {
            this.role_name = role_name;
        }
    
        public String getRole_memo() {
            return role_memo;
        }
    
        public void setRole_memo(String role_memo) {
            this.role_memo = role_memo;
        }
    
    }

    Role.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
    <!-- 1.配置类和表对应
        class标签
        name属性:实体类的全路径
        table属性:数据库表名称 -->
    <class name="cn.itcast.manytomany.Role" table="t_role">
    <id name="role_id" column="role_id">
    <generator class="native"></generator>
    </id>
    <property name="role_name" column="role_name"></property>
    <property name="role_memo" column="role_memo"></property>
    <!-- 在角色里面表示所有用户,使用set标签 -->
    <set name="setUser" table="user_role">
    <!-- 角色在第三张表外键 -->
    <key column="roleid"></key>
    <many-to-many class="cn.itcast.manytomany.User" column="userid"></many-to-many>
    </set>
    </class>
    </hibernate-mapping>

    (2)User.java

    package cn.itcast.manytomany;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class User {
    
        private Integer user_id;
    
        private String user_name;
    
        private String user_password;
    
        // 一个用户可以有多个角色
        private Set<Role> setRole = new HashSet<Role>();
    
        public Set<Role> getSetRole() {
            return setRole;
        }
    
        public void setSetRole(Set<Role> setRole) {
            this.setRole = setRole;
        }
    
        public Integer getUser_id() {
            return user_id;
        }
    
        public void setUser_id(Integer user_id) {
            this.user_id = user_id;
        }
    
        public String getUser_name() {
            return user_name;
        }
    
        public void setUser_name(String user_name) {
            this.user_name = user_name;
        }
    
        public String getUser_password() {
            return user_password;
        }
    
        public void setUser_password(String user_password) {
            this.user_password = user_password;
        }
    
    }

    User.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
    <class name="cn.itcast.manytomany.User" table="t_user">
    <id name="user_id" column="user_id">
    <generator class="native"></generator>
    </id>
    <property name="user_name" column="user_name"></property>
    <property name="user_password" column="user_password"></property>
    <!-- 在用户里面表示所有角色,使用set标签
        name属性:角色set集合名称
        table属性:第三张表名称 -->
    <set name="setRole" table="user_role" cascade="save-update,delete">
    <!-- key标签里面的配置
        配置当前映射文件在第三张表外键的名称
         -->
    <key column="userid"></key>
    <!-- class标签:角色实体类的全路径
        column标签:角色在第三张表外键名称 -->
    <many-to-many class="cn.itcast.manytomany.Role" column="roleid"></many-to-many>
    </set>
    </class>
    </hibernate-mapping>

    第四篇:HQL、QBC 、查询、检索策略、批量抓取等 相关练习篇

     1.cn.itcast.entity包

    (1)Cutomer.java

    package cn.itcast.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Customer {
        private Integer cid;
    
        private String custName;
    
        private String custLevel;
    
        private String custSource;
    
        private String custPhone;
    
        private String custMobile;
    
        // 在客户实体类里面表示多个联系人,一个客户有多个联系人
        private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();
    
        public Set<LinkMan> getSetLinkMan() {
            return setLinkMan;
        }
    
        public void setSetLinkMan(Set<LinkMan> setLinkMan) {
            this.setLinkMan = setLinkMan;
        }
    
        public Integer getCid() {
            return cid;
        }
    
        public void setCid(Integer cid) {
            this.cid = cid;
        }
    
        public String getCustName() {
            return custName;
        }
    
        public void setCustName(String custName) {
            this.custName = custName;
        }
    
        public String getCustLevel() {
            return custLevel;
        }
    
        public void setCustLevel(String custLevel) {
            this.custLevel = custLevel;
        }
    
        public String getCustSource() {
            return custSource;
        }
    
        public void setCustSource(String custSource) {
            this.custSource = custSource;
        }
    
        public String getCustPhone() {
            return custPhone;
        }
    
        public void setCustPhone(String custPhone) {
            this.custPhone = custPhone;
        }
    
        public String getCustMobile() {
            return custMobile;
        }
    
        public void setCustMobile(String custMobile) {
            this.custMobile = custMobile;
        }
    
    }

    Customer.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="cn.itcast.entity.Customer" table="t_customer">
        <id name="cid" column="cid">
        <generator class="native"></generator>
        </id>
        <property name="custName" column="custName"></property>
        <property name="custLevel" column="custLevel"></property>
        <property name="custSource" column="custSource"></property>
        <property name="custPhone" column="custPhone"></property>
        <property name="custMobile" column="custMobile"></property>
        <!-- 在客户映射文件中,表示所有联系人 
                使用set标签表示所有联系人
                set标签里面有name属性:
                     属性值写在客户实体类里面表示联系人的set集合名称
                     
                 inverse属性默认值:false不放弃关系维护
                                true表示放弃关系维护
            -->
        <set name="setLinkMan" batch-size="10">
        <!-- 一对多建表,有外键
                    hibernate机制:双向维护外键,在一和多那一方都配置外键    
                    column属性值:外键名称
                 -->
        <key column="clid"></key>
        <one-to-many class="cn.itcast.entity.LinkMan"/>
        </set>
        </class>
        </hibernate-mapping>

    (2).LinkMan.java

    package cn.itcast.entity;
    
    public class LinkMan {
        private Integer lkm_id; // 联系人编号(主键)
    
        private String lkm_name;// 联系人姓名
    
        private String lkm_gender;// 联系人性别
    
        private String lkm_phone;// 联系人办公电话
    
        // 在联系人实体类中表示所属客户,一个联系人只能有一个客户
        private Customer customer;
    
        public Customer getCustomer() {
            return customer;
        }
    
        public void setCustomer(Customer customer) {
            this.customer = customer;
        }
    
        public Integer getLkm_id() {
            return lkm_id;
        }
    
        public void setLkm_id(Integer lkm_id) {
            this.lkm_id = lkm_id;
        }
    
        public String getLkm_name() {
            return lkm_name;
        }
    
        public void setLkm_name(String lkm_name) {
            this.lkm_name = lkm_name;
        }
    
        public String getLkm_gender() {
            return lkm_gender;
        }
    
        public void setLkm_gender(String lkm_gender) {
            this.lkm_gender = lkm_gender;
        }
    
        public String getLkm_phone() {
            return lkm_phone;
        }
    
        public void setLkm_phone(String lkm_phone) {
            this.lkm_phone = lkm_phone;
        }
    
    }

    LinkMan.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="cn.itcast.entity.LinkMan" table="t_linkman">
        <id name="lkm_id" column="lkm_id">
        <generator class="native"></generator>
        </id>
        <property name="lkm_name" column="lkm_name"></property>
        <property name="lkm_gender" column="lkm_gender"></property>
        <property name="lkm_phone" column="lkm_phone"></property>
       
        <!-- 表示联系人所属客户 
                name属性:因为在联系人实体类使用customer对象表示,写customer名称
                class属性:customer全路径
                column属性:外键名称
            -->
        <many-to-one name="customer" class="cn.itcast.entity.Customer" column="clid"></many-to-one>
        </class>
        </hibernate-mapping>

    2.utils包(同上)

    HibernateUtils.java

    package ustils;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtils {
    
        static Configuration cfg = null;
    
        static SessionFactory sessionFactory = null;
        static {
            cfg = new Configuration();
            cfg.configure();
            sessionFactory = cfg.buildSessionFactory();
        }
    
        public static Session getSessionobject() {
            return sessionFactory.getCurrentSession();
        }
    
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        public static void main(String[] args) {
    
        }
    }

    3.Hibernate核心配置文件

    <?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>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_test4</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.current_session_context_class">thread</property>
        
        <mapping resource="cn/itcast/entity/Customer.hbm.xml"/>
        <mapping resource="cn/itcast/entity/LinkMan.hbm.xml"/>
        </session-factory>
        </hibernate-configuration>

    4.cn.itcast.hibernantetest包

    (1)HibernateDemo.java

    package cn.itcast.hibernantetest;
    
    import java.util.List;
    import java.util.Set;
    
    import org.hibernate.Criteria;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.entity.Customer;
    import cn.itcast.entity.LinkMan;
    import ustils.HibernateUtils;
    
    public class HibernateDemo {
    
        // 演示对象导航查询
        @Test
        public void testSelect1() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
    
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.查询cid=1客户
                Customer customer = session.get(Customer.class, 1);
                // 2.再查询这个客户里面的所有联系人(此时,得到set集合,没有发送语句)
                Set<LinkMan> linkman = customer.getSetLinkMan();
    
                // 发送了语句
                System.out.println(linkman.size());
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    
        // 演示检索策略
        @Test
        public void testSelect2() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
    
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 根据cid=1客户
                // 执行get方法之后是否发送sql语句
                // 调用get方法马上发送sql语句查询数据库
                // Customer customer = session.get(Customer.class, 1);
                // System.out.println(customer.getCid());
                /*
                 * 1 调用load方法之后,不会马上发送sql语句 (1)返回对象里面只有 id值
                 * 
                 * 2 得到对象里面不是id的其他值时候才会发送语句
                 */
                Customer customer = session.load(Customer.class, 1);
                System.out.println(customer.getCid());
                System.out.println(customer.getCustName());
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    
        // 演示批量抓取
        @Test
        public void testSelect3() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
    
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 查询所有客户
                Criteria criteria = session.createCriteria(Customer.class);
                // 得到每个客户里面所有的联系人
                List<Customer> list = criteria.list();
    
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                    // 每个客户里面的所有联系人
                    Set<LinkMan> setlinkman = customer.getSetLinkMan();
                    for (LinkMan linkMan : setlinkman) {
                        System.out.println((linkMan.getLkm_id() + "::" + linkMan.getLkm_name()));
                    }
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    }

    (2)HibernateHQL.java

    package cn.itcast.hibernantetest;
    
    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import cn.itcast.entity.Customer;
    import ustils.HibernateUtils;
    
    public class HibernateHQL {
    
        // 演示查询所有
        @Test
        public void testSelect1() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建query对象
                Query query = session.createQuery("from Customer");
                // 2.调用方法得到结果
                List<Customer> list = query.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示条件查询
        @Test
        public void testSelect2() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建query对象
                // SELECT *FROM t_customer WHERE cid=? AND custName=?
                Query query = session.createQuery("from Customer c where c.cid=? and c.custName=?");
                // 2.设置条件
                // 向?里面设置值
                // setParameter方法两个参数
                // 第一个参数:int类型是?位置,?位置从0开始
                // 第二个参数:具体参数值
                // 设置第一个?值
                query.setParameter(0, 1);
                // 设置第二个?值
                query.setParameter(1, "百度");
                // 3.调用方法得到结果
                List<Customer> list = query.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示条件查询-模糊查询
        @Test
        public void testSelect3() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建query对象
                Query query = session.createQuery("from Customer c where c.custName like ?");
                // 2.设置?的值
                query.setParameter(0, "%蒂%");
                // 3.调用方法得到结果
                List<Customer> list = query.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:排序查询
        @Test
        public void testSelect4() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建query对象
                Query query = session.createQuery("from Customer order by cid desc");
                // 2.调用方法得到结果
                List<Customer> list = query.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:分页查询
        @Test
        public void testSelect5() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建query对象
                // 写查询所有的语句
                Query query = session.createQuery("from Customer");
                // 2.设置分页数据
                // 2.1.设置开始位置
                query.setFirstResult(3);
                // 2.2.设置每页记录数
                query.setMaxResults(3);
                // 3.调用方法得到结果
                List<Customer> list = query.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:投影查询
        @Test
        public void testSelect6() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建query对象
                Query query = session.createQuery("select custLevel from Customer");
                // 2.调用方法得到结果
                List<Object> list = query.list();
                for (Object object : list) {
                    System.out.println(object);
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:聚集函数的使用
        @Test
        public void testSelect7() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建query对象
                Query query = session.createQuery("select count(*) from Customer");
                // 2.调用方法得到结果
                // query对象里面有方法,直接返回对象形式
                Object obj = query.uniqueResult();
                // 返回int类型
                // int count=(int)obj;
    
                // 首先把object变成long类型,再变成int类型
                Long lobj = (Long) obj;
                int count = lobj.intValue();
                System.out.println(count);
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
    }

    (3)HibernateQBC.java

    package cn.itcast.hibernantetest;
    
    import java.util.List;
    
    import org.hibernate.Criteria;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.criterion.DetachedCriteria;
    import org.hibernate.criterion.Order;
    import org.hibernate.criterion.Projections;
    import org.hibernate.criterion.Restrictions;
    import org.junit.Test;
    
    import cn.itcast.entity.Customer;
    import ustils.HibernateUtils;
    
    
    public class HibernateQBC {
    
        // 演示:查询所有
        @Test
        public void testSelect1() {
    
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建对象
                Criteria criteria = session.createCriteria(Customer.class);
                // 2.调用方法得到结果
                List<Customer> list = criteria.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:条件查询
        @Test
        public void testSelect2() {
    
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建criteria对象
                Criteria criteria = session.createCriteria(Customer.class);
                // 2.使用criteria对象里面的方法设置条件值
                // 首先使用add方法,表示设置条件值
                // 在add方法里面使用类的方法实现条件设置
                // 类似于cid=?
                // criteria.add(Restrictions.eq("cid", 1));
                // criteria.add(Restrictions.eq("custName", "玛莎拉蒂"));
                // 上面是eq,下面是like
                criteria.add(Restrictions.like("custName", "%百%"));
                // 3.调用方法得到结果
                List<Customer> list = criteria.list();
    
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:排序查询
        @Test
        public void testSelect3() {
    
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建对象
                Criteria criteria = session.createCriteria(Customer.class);
                // 2.设置对哪个属性进行排序,设置排序规则
                criteria.addOrder(Order.desc("cid"));
                // 3.调用方法,得到结果
                List<Customer> list = criteria.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:分页查询
        @Test
        public void testSelect4() {
    
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建对象
                Criteria criteria = session.createCriteria(Customer.class);
                // 2.设置分页,起始和记录数
                criteria.setFirstResult(3);
                criteria.setMaxResults(3);
                // 3.调用方法得到结果
                List<Customer> list = criteria.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:统计查询
        @Test
        public void testSelect5() {
    
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建对象
                Criteria criteria = session.createCriteria(Customer.class);
                // 2.设置操作
                criteria.setProjection(Projections.rowCount());
                // 3.调用方法得到结果
                Object obj = criteria.uniqueResult();
                Long lobj = (Long) obj;
                int count = lobj.intValue();
                System.out.println(count);
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
        // 演示:离线查询
        @Test
        public void testSelect6() {
    
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 1.创建对象
                // Criteria criteria = session.createCriteria(Customer.class);
                DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
                // 2.最终执行时候才需要得到session
                Criteria criteria = detachedCriteria.getExecutableCriteria(session);
                List<Customer> list = criteria.list();
                for (Customer customer : list) {
                    System.out.println(customer.getCid() + "::" + customer.getCustName());
                }
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
    
        }
    
    }

    (4)HibernateManyTable.java

    package cn.itcast.hibernantetest;
    
    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import ustils.HibernateUtils;
    
    public class HibernateManyTable {
    
        // 演示hql内连接查询(2种)
        @Test
        public void testSelect1() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 内连接的list返回的是数组的形式;迫切内外连接的list放回的是对象的形式
                // Query query = session.createQuery("from Customer c inner join
                // c.setLinkMan");
                // List list = query.list();
    
                Query query = session.createQuery("from Customer c inner join fetch c.setLinkMan");
                List list = query.list();
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    
        // 演示hql外连接查询(3种)
        @Test
        public void testSelect2() {
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getSessionFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
    
                // 左外连接的list返回的是数组的形式;迫切左外连接的list放回的是对象的形式
                // Query query = session.createQuery("from Customer c left outer
                // join c.setLinkMan");
                // List list = query.list();
    
                // Query query = session.createQuery("from Customer c left outer
                // join fetch c.setLinkMan");
                // List list = query.list();
    
                // 右外连接,没有迫切右外连接
                Query query = session.createQuery("from Customer c right outer join fetch c.setLinkMan");
                List list = query.list();
    
                tx.commit();
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
            } finally {
                session.close();
                sessionFactory.close();
            }
        }
    }

    Hibernate定义陈述:

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。-------来自百度百科

  • 相关阅读:
    【经验总结】- IDEA无法显示Project目录怎么办
    JSON API免费接口(转)
    电子商务(电销)平台中订单模块(Order)数据库设计明细(转)
    typora 快捷键
    table 随td固宽
    跨域请求
    在网址前加神秘字母,让你打开新世界(z)
    vux安装中遇到的坑(转)
    常用正则表达示
    mui 浏览器一样自动缩放
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/13069802.html
Copyright © 2020-2023  润新知