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("****************");
    }

}
时间: 2024-11-05 23:33:14

hibernate03增删改查的相关文章

Python 模拟SQL对文件进行增删改查

1 #!/usr/bin/env python 2 # _*_ coding:UTF-8 _*_ 3 # __auth__: Dalhhin 4 # Python 3.5.2,Pycharm 2016.3.2 5 # 2017/05/15 6 7 import sys,os 8 9 def where(dbfile,where_list): #条件是一个list 10 11 def and_or_where(sub_where_list): 12 '''获取and或同时含有and.or关键字的条

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

ssm框架搭建+easyui增删改查实现

闲来无事,看了看别人的博客文档也跟着敲了敲,特地记录下来,方便以后学习: spring版本:4.0.6 mybatis版本:3.2.5 所有jar包打包下载:http://pan.baidu.com/s/1qLEaU 1.项目目录结构 其中,controller包下存放控制层文件,dao下存放各个model类相关的数据库操作接口,entity下放置各种model类,mappers下放置各个dao对应的映射文件,service服务层就不说了,放置各种service接口,impl是其具体实现类. 2

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存

夺命雷公狗---Thinkphp----12之文章的增删改查(图片上传和关联查询)

我们由于表分析的不够完善,所以我们来加多一个tid的字段,到时候主要目的是为了更好的遍历出文章是属于那个分类下的,表如下所示: 那么下一步我们就开始创建一个ArticleController.class.php的控制器,用来管理文章的增删改查操作,所以我们开始第一步来实现文章的添加,我们先来实现他的增加功能: public function add(){ if(IS_POST){ $data['title'] = I('title'); $data['tid'] = I('tid'); $dat

MyBatis增删改查模板

1. 首先,和Spring整合一下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springfra

用基本数据结构修改后的学生信息管理系统(增删改查)

package com.xt.student.system; //创建学生类存放信息 public class Student {//声明变量private String stuNo; private String stuName; private String gender; private int age; private int score; //对变量进行封装 public String getStuNo() {return stuNo;} public void setStuNo(St

第二周作业__增删改查

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

zookeeper基本命令,增删改查

zookeeper被广泛的使用,由于项目中用到了dubbo框架,所以今天也来简单分享一下zookeeper的简单命令,来查询服务和节点信息,不说了,直接来增删改查命令. -h命令: [zk: localhost:2189(CONNECTED) 35] h ZooKeeper -server host:port cmd args addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-