在上一章中已经搭建好了一个hibernate的环境,那么这一章我们就使用这个环境来进行基本CRUD。在这之前我们先了解一个东西:主键生成策略。就是当向数据库表中插入记录的时候,这个记录的主键该如何生成.用法:将hbm.xml文件中<id>节点下的 <generator/>节点中的class 改成以下关键字即可。以下是简介版。推荐使用uuid
01 assigned
主键由外部程序负责生成,在 save() 之前必须指定一个,Hibernate不负责维护主键生成。也就是可以每次指定主键。该方式不推荐
02 increment
这种方式在每次插入前,需要通过“select max(主键) from 表名 ”这种方式先查询最大ID,然后通过ID+1来作为新的主键值。这种方式也不推荐,因为这样会出现线程安全问题。
03 identity
identity由底层数据库生成标识符。identity是由数据库自己生成的,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。
04 sequence
采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL这种不支持sequence的数据库则不行
05 hilo
hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值。保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误。可以跨数据库。
06 native
native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。
07 uuid
UUID:Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
好了,接下来开始这章的主要内容。hibernate的三种方式实现CRUD。首先在src/test/java文件夹下新建package(com.test),新建类 Test.类中写一个方法叫做temp,加上@Test标记
@Test public void temp() { }
我们可以在cfg.xml中的<session-factory>节点中添加如下代码,以便在控制台来查看我们提交的sql语句。方便修改错误。
<!--显示sql语句 --> <property name="show_sql">true</property> <!--格式化Hibernate的SQL输出语句。 --> <property name="format_sql">true</property>
在temp方法中写上如下代码:代码写完后选择项目鼠标右键Run As ->Junit Test 运行
第一种:Hibernate提供的Query By Criteria API来查询对象 即QBC。
增加:
//添加一条数据
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // 开启事物 Transaction transaction = session.beginTransaction(); // 实例化对象 Student st = new Student(); st.setName("王五"); st.setSex("男"); st.setAddress("长沙"); //提交数据 session.save(st); // 提交事物 transaction.commit(); // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
查询单个:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // 开启事物 //Transaction transaction = session.beginTransaction(); // 根据主键得到对象(查询单个记录) Student st = session.get(Student.class, 2); System.out.println(st); // 提交数据 // session.save(st); // 提交事物 // transaction.commit(); // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
修改:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // 开启事物 Transaction transaction = session.beginTransaction(); // 根据主键得到对象(查询单个记录) Student st = session.get(Student.class, 2); // 设置修改值 st.setName("李四"); // 提交数据 saveOrUpdate意为:存在修改,不存在增加 修改也可以用Update session.saveOrUpdate(st); System.out.println(st); // 提交事物 transaction.commit(); // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
查询所有:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // 开启事物 // Transaction transaction = session.beginTransaction(); // 查询所有记录 List<Student> ls = session.createCriteria(Student.class).list(); for (Student student : ls) { System.out.println(student); } // 提交数据 saveOrUpdate意为:存在修改,不存在增加 修改也可以用Update // session.saveOrUpdate(st); // 提交事物 // transaction.commit(); // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
删除:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // 开启事物 Transaction transaction = session.beginTransaction(); // 根据主键得到对象(查询单个记录) Student st = session.get(Student.class, 2); // 提交数据 session.delete(st); // 提交事物 transaction.commit(); // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
第二种:Hibernate官方推荐的标准查询Hibernate Query Language 即HQl查询
查询所有: 注意:用HQL查询from后面接的是实体类名
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession();
List<Student> ls = session.createQuery("from Student").list();
for (Student student : ls) {
System.out.println(student);
}
// 关闭seeion session.close(); // 关闭SessionFactory factory.close();
查询单个属性:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); List<String> ls = session.createQuery("select name from Student").list(); for (String student : ls) { System.out.println(student); } // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
查询多个属性:object[]实现
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); List<Object[]> ls = session.createQuery("select name,sex,age from Student").list(); for (Object[] student : ls) { System.out.println(student[0] + "----" + student[1] + "----" + student[2]); } // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
查询多个属性:构造方法实现(先要在实体类中重载构造方法)
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); List<Student> ls = session.createQuery("select new Student(name,sex) from Student").list(); for (Student student : ls) { System.out.println(student); } // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
条件查询:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // List<Student> ls = session.createQuery("from Student where age // between ? and ?").setInteger(0, 10).setInteger(1, 50).list(); List<Student> ls = session.createQuery("from Student where age between :begin and :end") .setParameter("begin", 10).setParameter("end", 50).list(); for (Student student : ls) { System.out.println(student); } // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
聚合函数:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); String parm = session.createQuery("select max(age) from Student").uniqueResult().toString(); System.out.println(parm); // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
排序:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); List<Student> ls = session.createQuery("from Student order by age desc").list(); for (Student student : ls) { System.out.println(student); } // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
分组:构造方法实现(先要在实体类中重载构造方法)
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // List<Student> ls = session.createQuery("select new // Student(sex,max(age)) from Student group by sex").list(); List<Object[]> ls = session.createQuery("select sex,max(age) from Student group by sex").list(); for (Object[] student : ls) { System.out.println(student[0] + "--" + student[1]); } // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
Like:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); List<Student> ls = session.createQuery("from Student where name like ?").setParameter(0, "%1%").list(); for (Student student : ls) { System.out.println(student); } // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
分页:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); List<Student> ls = session.createQuery("from Student").setFirstResult(10).setMaxResults(100).list(); for (Student student : ls) { System.out.println(student); } // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
修改:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // 开启事物 Transaction transaction = session.beginTransaction(); session.createQuery("update Student set name = :name where age=10").setParameter("name", "哈哈").executeUpdate(); // 提交事物 transaction.commit(); // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
删除:
// 获取配置信息 Configuration configuration = new Configuration().configure(); // 得到Session工厂 SessionFactory factory = configuration.buildSessionFactory(); // 得到Session Session session = factory.openSession(); // 开启事物 Transaction transaction = session.beginTransaction(); session.createQuery("delete Student where age=?").setParameter(0, 10).executeUpdate(); // 提交事物 transaction.commit(); // 关闭seeion session.close(); // 关闭SessionFactory factory.close();
第三种:原生态sql
这种方式基本不常用,所以就简单介绍下,具体的自己百度吧
//获取所有查询结果 session.createSQLQuery("select * from note").list(); //仅获取第一条结果 session.createSQLQuery("select * from note where id = 1").uniqueResult();