• hibernate03增删改查


    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- 映射文件的配置  
      这就是ORM中的 M!!      Mapping 映射文件
          Relational    Mapping       Object
       数据库中的表名以及字段           对应                  实体类中的类名和属性
       
     package:类所在的包,保证必须是全类名
     class:就是配置我们的 实体类相关的信息  
     name:对应的是实体类的类名或者属性名 
     table,column:如果与实体类的类名和属性名一致,可以不设置
     generator:主键生成策略
              01.assigned:必须是我们手动的给ID赋值!ID的生成与数据库无关!  会抛出异常!
              02.increment:从数据库表中查询到主键的最大值  (select max(id) from student)!
                                                                    之后+1把这个值 给我们的主键!ID的生成与数据库有关!
              03.identity:针对于mysql数据库中的主键自增
              04.sequence:针对于oracle数据库中的序列!
                   001.在数据库中创建序列
                       create sequence  sq_student_id
                        minvalue  10
                        maxvalue  99999999999
                        start with 10
                        increment by 10
                        cache 20;                                             
                   002.映射文件中配置
                   <generator class="sequence">
                       <param name="sequence">sq_student_id</param>
                   </generator>
                   003.底层生成的sql语句
                     select sq_student_id.nextval from dual                                                 
                                             首先从数据库中取得当前序列的下一个值!  之后把这个值 给我们的主键!
                                             
     lazy="true" 是默认采用懒加载的方式  获取数据!
      不想使用懒加载!lazy="false"
     -->
    <hibernate-mapping package="cn.bdqn.bean">
        <class name="Student" table="student" lazy="false">  
             <id name="id">
              <generator class="assigned"/>
             </id>
             <property name="age"/>
             <property name="name"/>
        </class>
    </hibernate-mapping>
    /**
     * jdbc有常用的API
     * hibernate也有自己常用的API(核心)
     *   01.Configuration   类  :读取我们的核心配置文件----hibernate.cfg.xml
     *   接口
     *   02.SessionFactory :初始化hibernate需要的各种参数!
     *                jdbc.properties初始化一次! SessionFactory也是只需要初始化一次即可!写成单例!
     *                
     *   03.Session:之前使用的HttpSession(用户session)! 现在的session叫会话session!
     *              hibernate就是通过session来操作对象的(增删改查)以及创建事务对象!
     *   04.Tranaction :进行事务的处理
     *   05.Query :hibernate中的查询接口(SQL,HQL)
     *   06.Criteria:hibernate中的查询接口,是对query进行了简单封装!
     *               更能体现使用的是面向对象的思想来操作数据库!
     */
    
    
    public class StudentTest {
        
        
        
        Session session=null;
        Transaction transaction=null;
        //在执行测试方法之前 先执行before
        @Before
        public  void  before(){
            /**
             * 01.读取核心的配置文件  在src的根目录下面! 底层规定位置!
             *   在实例化Configuration对象的时候通过configure()
             *   去src根目录下面,寻找hibernate.cfg.xml文件
             */
            Configuration configuration=new Configuration().configure();
            //02.创建sessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            //03.打开session
             session = sessionFactory.openSession();
            //04.开启事务
             transaction= session.beginTransaction();
        }
        
        
        //在执行测试方法之后 
        @After
        public  void  after(){
             //07.提交事务  sql语句 整体的执行!
             transaction.commit();
             //08.关闭session
             session.close();
             //sessionFactory.close(); 验证hbm2ddl中的create-drop
        }
        
        //新增
        @Test
        public  void  addStudent(){
             //05.创建一个对象
             Student student=new Student(500,5, "小白555");
             //06.持久化操作---》将对象保存到数据库中
             session.save(student);   //不会产生 insert语句
        }
        
        
        /**
         *  根据id删除指定的学生
         *  
         *  会产生 2条sql语句
         *    01.根据id去数据库中查询 有没有对应的数据
         *    02.根据id删除  指定delete语句
         */
        @Test
        public  void  delStudent(){
            Student student=new Student();
            student.setId(2);  //给对象的ID赋值
            //session对象的方法 delete删除
            System.out.println("************");
            session.delete(student);  
            System.out.println("************");
        }
        /**
         *  根据id修改指定的学生
         *  只会执行一条update语句!
         *  如果数据库中没有指定id的数据,没效果!有 就更新!
         */
        @Test
        public  void  updateStudent(){
            Student student=new Student();
            student.setId(1000);  //给对象的ID赋值
            System.out.println("************");
            student.setAge(50);
            session.update(student);  
            System.out.println("************");
        }
        
        
        
        
        /**
         * 查询数据库中指定学生的信息
         *  查询 不需要事务!
         *  get和load的区别
         *     get:
         *       01.在get()立即产生一条sql语句  
         *       02.首先回去hibernate的1级缓存(session)中查询有没有对应的数据
         *           如果有,直接返回,就不会访问数据库!
         *           如果没有,去2级缓存中查询(sessionFactory)中查询!
         *           如果2级缓存中也没有数据,则会产生一条select语句 访问数据库!
         *       03.如果数据库中存在该数据 则返回
         *       04.没有对应的数据 返回  null
         */
        @Test
        public  void  getStudent(){  //通过get()获取数据
        System.out.println("****************");
        Student  student=(Student) session.get(Student.class, 200);
        System.out.println("****************");
        System.out.println(student);
        }
        
        //验证不会访问数据库
        @Test
        public  void  getStudent2(){  //通过get()获取数据
            Student  student=(Student) session.get(Student.class, 200);  //被session管理
            Student  student2=(Student) session.get(Student.class, 200); //缓存中已经存在了
        }
        
        
        /**
         * evict()从session缓存中 清除指定的对象
         */
        @Test
        public  void  evictStudent(){  //通过get()获取数据
            Student  student=(Student) session.get(Student.class, 200);  //被session管理
            Student  student2=(Student) session.get(Student.class, 300);  //被session管理
            session.evict(student); //从session缓存中 清除student对象
            /**
             * 有人认为:1级缓存中确实是清除了!但是2级缓存中应该没有清除吧?
             * 不是这么理解的!  2级缓存需要我们手工配置!不配置 就不存在2级缓存!
             */
            student=(Student) session.get(Student.class, 200); //再次获取id为200的数据
        }
        
        
        /**
         * clear() 从session缓存中 清除所有的对象
         */
        @Test
        public  void  clearStudent(){  //通过get()获取数据
            Student  student=(Student) session.get(Student.class, 200);  //被session管理
            Student  student2=(Student) session.get(Student.class, 300);  //被session管理
            //session.clear(); //从session缓存中 清除所有对象
            student=(Student) session.get(Student.class, 200); //再次获取id为200的数据
            student2=(Student) session.get(Student.class, 300); //再次获取id为300的数据
        }
        
        /**
         * load: 懒加载
         *     01.不会立即产生sql语句
         *     02.在用户使用真正对象的时候才去访问数据库!
         *     03.首先回去hibernate的1级缓存(session)中查询有没有对应的数据
         *           如果有,直接返回,就不会访问数据库!
         *           如果没有,去2级缓存中查询(sessionFactory)中查询!
         *           如果2级缓存中也没有数据,则会产生一条select语句 访问数据库!
         *     04.如果数据库中存在该数据 则返回
         *     05.没有对应的数据 返回 ObjectNotFoundException 异常
         *     06.如果想实现和 get()一样的效果!怎么做?
         *        在对应的hbm.xml文件中的 class节点上  新增 lazy="false"   立即加载!
         */
        @Test
        public  void  loadStudent(){  //通过load()获取数据
            Student  student=(Student) session.load(Student.class, 200);
            System.out.println("****************");
            System.out.println(student);  //产生sql语句
            System.out.println("****************");
        }
    
    }
  • 相关阅读:
    DOS net use
    DOS cscript
    DOS bcp
    DOS ftp
    java 锁机制(synchronized 与 Lock)
    java-过滤器(Filter)
    java collection集合
    java Map集合对比分析
    java反射与注解结合使用(根据传入对象输出查询sql)
    java反射-使用反射来操纵方法
  • 原文地址:https://www.cnblogs.com/xtdxs/p/7093487.html
Copyright © 2020-2023  润新知