1.什么是HQL?
HQL是Hibernate Query Language(Hibernate 查询语言)的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性。 HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作。
2.HQL查询的步骤
3.hibernate查询操作
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
通过Query主要完成查询操作.我们通过Query可以执行hql语句.
Query query=Session.createQuery(hql);
下面这个可以执行sql语句
SQLQuery sqlQuery=Session.createSQLQuery(sql);
SQLQuery是Query的子。
查询全部,使用SQL方式
@Test public void test1() { Configuration configure = new Configuration().configure(); //创建session会话工厂 SessionFactory sessionFactory = configure.buildSessionFactory(); //通过工厂获取一个session Session session = sessionFactory.openSession(); //操作数据库 SQLQuery sqlQuery = session.createSQLQuery("select * from t_user"); List<Object[]> list = sqlQuery.list(); for (Object[] objects : list) { System.out.println(); for (Object object : objects) { System.out.print(object+" "); } } }
也可以通过sqlQuery.addEntity(User.class);这行语句来封装到实体类中
查询全部,使用HQL方式(HQL里面不要出现表名,而是表名对应的类名)
@Test public void test2() { Configuration configure = new Configuration().configure(); //创建session会话工厂 SessionFactory sessionFactory = configure.buildSessionFactory(); //通过工厂获取一个session Session session = sessionFactory.openSession(); //操作数据库 Query query = session.createQuery("from User"); List list = query.list(); System.out.println(list); }
hibernate实现分页查询
在query中加入以下代码
//开始的位置 query.setFirstResult(1); //从开始朝后面查几个 query.setMaxResults(1);
查询表一个字段,并封装在对应实体类中
注意:必须要有该字段对应的构造
@Test public void test3() { Configuration configure = new Configuration().configure(); //创建session会话工厂 SessionFactory sessionFactory = configure.buildSessionFactory(); //通过工厂获取一个session Session session = sessionFactory.openSession(); //操作数据库 Query query = session.createQuery("select new User(username) from User"); List list = query.list(); System.out.println(list); }
4.主键自增策略
increment:代理主键。由hibernate维护一个变量,每次生成主键时自动以递增。问题:如果有多个应用访问一个数据库,由于每个应用维护自己的主键,所以此时主键可能冲突。建议不采用。
identity:代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。比如:mysql的自增主键,oracle不支持主键自动生成。如果数据库支持自增建议采用。
sequence:代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。比如oracle的序列。如果数据库支持序列建议采用。
native:代理主键。根据底层数据库对自动来选择identity、sequence、hilo由于生成主键策略的控制权由hibernate控制,所以不建议采用。
uuid:代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符。此策略可以保证生成主键的唯一性,并且提供了最好的数据库插入性能和数据库平台的无关性。建议采用。
assigned:自然主键。由java程序负责生成标识符。不建议采用。
5.注解开发
1)注解说明
@Entity 声明一个实体
@Table来描述类与表对应
@Id来声明一个主键
@GenerateValue 用它来声明一个主键生成策略
@Column来定义列
@Temporal来声明日期类型,可选择以下三种
1.TemporalType.DATA 只有年月日
2.TemporalType.TIME 只有小时分钟秒
3.TemporalType.TIMESTAMP 有年月日小时分钟秒
2)案例
1.创建实体类映射关系
package com.fqh.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "student") public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "name") private String name; @Column(name = "sex") private String sex; @Column(name = "age") private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
2.创建测试类,操作数据库
@Test public void test1() { Configuration configure = new Configuration().configure(); //创建session会话工厂 SessionFactory sessionFactory = configure.buildSessionFactory(); //通过工厂获取一个session Session session = sessionFactory.openSession(); //操作数据库 session.beginTransaction(); Student student=new Student(); student.setAge(23); student.setName("刘超"); student.setSex("男"); session.save(student); session.getTransaction().commit(); session.close(); sessionFactory.close(); }
3.在hibernate.cfg.xml中开启类扫描
<mapping class="com.fqh.entity.Student"/>
3)一对一
1.创建person类
package com.fqh.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Entity @Table(name = "person") public class Person { @OneToOne(targetEntity = IdCard.class,cascade = CascadeType.ALL) @JoinColumn(name = "c_id",unique = true) private IdCard idCard; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "name") private String name; public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2.创建IdCard类
package com.fqh.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Entity @Table(name = "person") public class Person { @OneToOne(targetEntity = IdCard.class,cascade = CascadeType.ALL) @JoinColumn(name = "c_id",unique = true) private IdCard idCard; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "name") private String name; public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3.创建测试类
@Test public void test2() { Configuration configure = new Configuration().configure(); //创建session会话工厂 SessionFactory sessionFactory = configure.buildSessionFactory(); //通过工厂获取一个session Session session = sessionFactory.openSession(); //操作数据库 session.beginTransaction(); Person person=new Person(); person.setName("张三"); IdCard idCard=new IdCard(); idCard.setIdNum("429006153358623"); person.setIdCard(idCard); idCard.setPerson(person); session.save(person); session.getTransaction().commit(); session.close(); sessionFactory.close(); }